From 18dc3544dc579a58dfb8c753871ab204318b6a95 Mon Sep 17 00:00:00 2001 From: Rishab Dugar Date: Mon, 5 Oct 2026 02:58:45 +0000 Subject: [PATCH] feat(redact): keep the text you didn't cover searchable Redacted pages are still saved as images, so nothing under a mark can be recovered. The text outside the marks is now added back as an invisible layer, so the file can be searched, selected and copied. Text is only added back when it shows on the rendered page: runs that touch a mark, sit under an existing black box or are drawn in the page colour are left out. A checkbox turns it off for an image-only file. Part of #85. --- src/app.ts | 1 + src/engine/raster.ts | 176 ++++++++++++++++++++++++++++++++++++++++++- src/i18n.ts | 3 +- src/i18n/bn.json | 9 ++- src/i18n/de.json | 9 ++- src/i18n/es.json | 9 ++- src/i18n/fr.json | 9 ++- src/i18n/hi.json | 9 ++- src/i18n/id.json | 9 ++- src/i18n/it.json | 9 ++- src/i18n/mr.json | 9 ++- src/i18n/nl.json | 9 ++- src/i18n/pl.json | 9 ++- src/i18n/pt.json | 9 ++- src/i18n/ta.json | 9 ++- src/i18n/te.json | 9 ++- src/i18n/tr.json | 9 ++- src/i18n/vi.json | 9 ++- src/seo.ts | 4 +- src/site.ts | 6 +- tests/app.e2e.ts | 36 ++++++++- 21 files changed, 292 insertions(+), 69 deletions(-) diff --git a/src/app.ts b/src/app.ts index 5fd42ee..075736b 100644 --- a/src/app.ts +++ b/src/app.ts @@ -114,6 +114,7 @@ function setUp(op: ToolOp) { const rasterOptions = (o: Options) => ({ dpi: o.dpi === '300' ? 300 : 150, look: (o.look === 'gray' || o.look === 'scanned' ? o.look : 'color') as 'color' | 'gray' | 'scanned', + keepText: o.keepText === 'true', }); // Every tool that runs outside the qpdf worker. Engines load on first use. diff --git a/src/engine/raster.ts b/src/engine/raster.ts index f941b00..8ad11f3 100644 --- a/src/engine/raster.ts +++ b/src/engine/raster.ts @@ -1,6 +1,6 @@ // Redraws every page of a PDF as an image. Redact PDF burns its marks in, so the text under them is // gone from the file, and PDF to scanned PDF uses the same path with an optional scanner look. -import { PDFDocument } from 'pdf-lib'; +import { PDFDocument, PDFHexString, PDFOperator, PDFOperatorNames as Op, PDFNumber, type PDFRef } from 'pdf-lib'; import { LocalError, type Output } from './local'; /** A marked area in PDF user space (unrotated page coordinates, y up). */ @@ -19,6 +19,140 @@ export interface RasterOptions { look: Look; /** Areas to paint black on each page (0-based page index). */ marks?: (page: number) => Box[]; + /** Adds the visible text outside the marks back as an invisible layer, so the file stays searchable. */ + keepText?: boolean; +} + +type Matrix = [number, number, number, number, number, number]; +/** `outer` after `inner`, in PDF's [a b c d e f] form. */ +const multiply = (outer: Matrix, inner: Matrix): Matrix => [ + outer[0] * inner[0] + outer[2] * inner[1], + outer[1] * inner[0] + outer[3] * inner[1], + outer[0] * inner[2] + outer[2] * inner[3], + outer[1] * inner[2] + outer[3] * inner[3], + outer[0] * inner[4] + outer[2] * inner[5] + outer[4], + outer[1] * inner[4] + outer[3] * inner[5] + outer[5], +]; +const overlaps = (a: Box, b: Box) => a.x0 < b.x1 && b.x0 < a.x1 && a.y0 < b.y1 && b.y0 < a.y1; + +interface TextRun { + str: string; + transform: Matrix; + width: number; + height: number; +} + +/** A run's area in PDF space, padded like the search marks so it errs on the side of touching a mark. */ +function runBox(run: TextRun): Box { + const [a, b, c, d, e, f] = run.transform; + const size = Math.hypot(a, b) || 1; + const up = Math.hypot(c, d) || 1; + const height = Math.max(run.height, size); + const corners = [ + [-size * 0.35, -height * 0.3], + [run.width + size * 0.35, -height * 0.3], + [-size * 0.35, height * 1.05], + [run.width + size * 0.35, height * 1.05], + ].map(([along, across]) => [e + (a / size) * along + (c / up) * across, f + (b / size) * along + (d / up) * across]); + const xs = corners.map((p) => p[0]); + const ys = corners.map((p) => p[1]); + return { x0: Math.min(...xs), y0: Math.min(...ys), x1: Math.max(...xs), y1: Math.max(...ys) }; +} + +/** + * A font with no glyphs whose codes are the text's own UTF-16 units, the way OCR tools add an invisible + * text layer. Nothing is ever drawn with it, so any script can be searched and copied. + */ +function glyphlessFont(out: PDFDocument): PDFRef { + const ranges = Array.from({ length: 256 }, (_, hi) => { + const h = hi.toString(16).padStart(2, '0').toUpperCase(); + return `<${h}00> <${h}FF> <${h}00>`; + }); + const cmap = [ + '/CIDInit /ProcSet findresource begin 12 dict begin begincmap', + '/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def', + '/CMapName /Adobe-Identity-UCS def /CMapType 2 def', + '1 begincodespacerange <0000> endcodespacerange', + ...[0, 100, 200].map((start) => { + const chunk = ranges.slice(start, start + 100); + return `${chunk.length} beginbfrange\n${chunk.join('\n')}\nendbfrange`; + }), + 'endcmap CMapName currentdict /CMap defineresource pop end end', + ].join('\n'); + const descriptor = out.context.obj({ + Type: 'FontDescriptor', + FontName: 'GlyphLessFont', + Flags: 5, + FontBBox: [0, 0, 1000, 1000], + ItalicAngle: 0, + Ascent: 1000, + Descent: 0, + CapHeight: 1000, + StemV: 80, + }); + const cid = out.context.obj({ + Type: 'Font', + Subtype: 'CIDFontType2', + BaseFont: 'GlyphLessFont', + CIDSystemInfo: { Registry: PDFHexString.fromText('Adobe'), Ordering: PDFHexString.fromText('Identity'), Supplement: 0 }, + FontDescriptor: out.context.register(descriptor), + DW: 1000, + CIDToGIDMap: 'Identity', + }); + return out.context.register( + out.context.obj({ + Type: 'Font', + Subtype: 'Type0', + BaseFont: 'GlyphLessFont', + Encoding: 'Identity-H', + DescendantFonts: [out.context.register(cid)], + ToUnicode: out.context.register(out.context.flateStream(cmap)), + }), + ); +} + +/** True when the area holds visible ink: text under a box, or white on white, renders as one flat colour. */ +function showsInk(context: OffscreenCanvasRenderingContext2D, x: number, y: number, width: number, height: number) { + const [x0, y0] = [Math.max(0, Math.floor(x)), Math.max(0, Math.floor(y))]; + const [x1, y1] = [Math.min(context.canvas.width, Math.ceil(x + width)), Math.min(context.canvas.height, Math.ceil(y + height))]; + if (x1 - x0 < 1 || y1 - y0 < 1) return false; + const { data } = context.getImageData(x0, y0, x1 - x0, y1 - y0); + let [low, high] = [255, 0]; + for (let i = 0; i < data.length; i += 4) { + const light = 0.299 * data[i] + 0.587 * data[i + 1] + 0.114 * data[i + 2]; + if (light < low) low = light; + if (light > high) high = light; + } + return high - low > 40; +} + +/** + * True when the run's letters can be seen on the rendered page. Each letter gets an equal share of the + * run's width; two blank letters in a row (a word under a box, or white on white), or no ink at all, + * hide the whole run. + */ +function visible(context: OffscreenCanvasRenderingContext2D, viewport: { convertToViewportPoint(x: number, y: number): number[] }, run: TextRun) { + const [a, b, c, d, e, f] = run.transform; + const size = Math.hypot(a, b) || 1; + const up = Math.hypot(c, d) || 1; + const height = Math.max(run.height, size) * 0.75; + const cell = run.width / run.str.length; + let [blank, inked] = [0, 0]; + for (let i = 0; i < run.str.length; i++) { + if (/\s/.test(run.str[i])) { + blank = 0; + continue; + } + const corners = [ + [i * cell, 0], + [(i + 1) * cell, height], + ].map(([along, across]) => viewport.convertToViewportPoint(e + (a / size) * along + (c / up) * across, f + (b / size) * along + (d / up) * across)); + const [[ax, ay], [bx, by]] = corners; + const ink = showsInk(context, Math.min(ax, bx), Math.min(ay, by), Math.abs(bx - ax), Math.abs(by - ay)); + [blank, inked] = ink ? [0, inked + 1] : [blank + 1, inked]; + if (blank >= 2) return false; + } + return inked > 0; } type PdfJs = typeof import('pdfjs-dist/legacy/build/pdf.mjs'); @@ -52,7 +186,7 @@ function grain() { export async function rasterize( doc: PdfDoc, name: string, - { dpi, look, marks }: RasterOptions, + { dpi, look, marks, keepText }: RasterOptions, onProgress?: (fraction: number) => void, ): Promise { const out = await PDFDocument.create(); @@ -60,6 +194,7 @@ export async function rasterize( out.setCreator('Fizzdoc'); const texture = look === 'scanned' ? grain() : undefined; let marked = 0; + let font: PDFRef | undefined; for (let index = 0; index < doc.numPages; index++) { const page = await doc.getPage(index + 1); const size = page.getViewport({ scale: 1 }); @@ -83,6 +218,18 @@ export async function rasterize( marked++; } + // The text left showing on the page, checked against the marks and against the rendered page. + const keep: TextRun[] = []; + if (keepText) { + const covered = marks?.(index) ?? []; + for (const item of (await page.getTextContent()).items as unknown as TextRun[]) { + if (typeof item.str !== 'string' || !item.str.trim() || !item.width) continue; + const box = runBox(item); + if (covered.some((mark) => overlaps(mark, box))) continue; + if (visible(renderContext, viewport, item)) keep.push(item); + } + } + const canvas = new OffscreenCanvas(width, height); const context = canvas.getContext('2d')!; context.fillStyle = look === 'scanned' ? '#f4f3ef' : '#fff'; @@ -105,7 +252,30 @@ export async function rasterize( } const blob = await canvas.convertToBlob({ type: 'image/jpeg', quality: 0.85 }); const image = await out.embedJpg(new Uint8Array(await blob.arrayBuffer())); - out.addPage([size.width, size.height]).drawImage(image, { x: 0, y: 0, width: size.width, height: size.height }); + const sheet = out.addPage([size.width, size.height]); + sheet.drawImage(image, { x: 0, y: 0, width: size.width, height: size.height }); + if (keep.length) { + font ??= glyphlessFont(out); + const key = sheet.node.newFontDictionary('GlyphLessFont', font); + // PDF space to the upright output page: the page's own rotation and crop, then y up again. + const place = multiply([1, 0, 0, -1, 0, size.height], size.transform as Matrix); + const operators = [PDFOperator.of(Op.BeginText), PDFOperator.of(Op.SetFontAndSize, [key, PDFNumber.of(1)]), PDFOperator.of(Op.SetTextRenderingMode, [PDFNumber.of(3)])]; + for (const run of keep) { + const units = run.str.replace(/[\uD800-\uDFFF]/g, ''); + if (!units) continue; + const fontSize = Math.hypot(run.transform[0], run.transform[1]) || 1; + const matrix = multiply(place, run.transform); + const hex = [...units].map((char) => char.charCodeAt(0).toString(16).padStart(4, '0')).join(''); + operators.push( + PDFOperator.of(Op.SetTextMatrix, matrix.map((n) => PDFNumber.of(n))), + // Stretch the run so selecting it highlights the same width as the words on the image. + PDFOperator.of(Op.SetTextHorizontalScaling, [PDFNumber.of((100 * run.width) / (units.length * fontSize))]), + PDFOperator.of(Op.ShowText, [PDFHexString.of(hex)]), + ); + } + operators.push(PDFOperator.of(Op.EndText)); + sheet.pushOperators(...operators); + } page.cleanup(); onProgress?.((index + 1) / doc.numPages); } diff --git a/src/i18n.ts b/src/i18n.ts index 87f6240..e366202 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -163,6 +163,7 @@ export const UI = { 'ws.lookColor': 'Colour', 'ws.lookGray': 'Black and white', 'ws.lookScanned': 'Scanned (grey, slightly tilted)', + 'ws.keepText': 'Keep the rest of the text searchable', 'ws.chooseAudio': 'Choose an MP3 or M4A file', 'ws.chooseAudios': 'Choose MP3 or M4A files', 'ws.chooseMedia': 'Choose an audio or video file', @@ -288,7 +289,7 @@ export const UI = { 'rd.personalFound': 'Personal details marked: {n}. Check each one before saving.', 'rd.personalNone': 'No emails, phone, ID or card numbers found. Search for names and addresses above.', 'rd.remove': 'Remove this mark', - 'rd.hint': 'Drag on a page to cover anything: text, a signature, a photo. When you save, every page becomes an image, so what you covered is gone for good.', + 'rd.hint': 'Drag on a page to cover anything: text, a signature, a photo. When you save, every page becomes an image, so what you covered is gone for good. The text you didn’t cover stays searchable.', 'ocr.unsure': 'Some of this text may be wrong. Text recognition reads English that is upright: rotate sideways photos first, and expect other scripts to come out garbled.', 'ocr.copyAll': 'Copy all text', 'ocr.copied': 'Copied', diff --git a/src/i18n/bn.json b/src/i18n/bn.json index 2eb4ef2..da9d12d 100644 --- a/src/i18n/bn.json +++ b/src/i18n/bn.json @@ -123,6 +123,7 @@ "ws.lookColor": "রঙিন", "ws.lookGray": "সাদা-কালো", "ws.lookScanned": "স্ক্যানড (ধূসর, সামান্য কাত)", + "ws.keepText": "বাকি টেক্সট সার্চযোগ্য রাখুন", "ws.wmText": "ওয়াটারমার্কের লেখা", "ws.wmDefault": "CONFIDENTIAL", "ws.opacity": "স্বচ্ছতা", @@ -231,7 +232,7 @@ "rd.personalFound": "ব্যক্তিগত তথ্য চিহ্নিত: {n}। সেভ করার আগে প্রতিটি দেখে নিন।", "rd.personalNone": "কোনো ইমেল, ফোন, ID বা কার্ড নম্বর পাওয়া যায়নি। নাম ও ঠিকানা ওপরে খুঁজুন।", "rd.remove": "এই মার্কটা সরান", - "rd.hint": "যেকোনো কিছু ঢাকতে পাতায় ড্র্যাগ করুন: টেক্সট, স্বাক্ষর, ছবি। সেভ করলে প্রতিটা পাতা একটা ছবিতে পরিণত হয়, তাই যা ঢেকেছেন তা চিরতরে মুছে যায়।", + "rd.hint": "যেকোনো কিছু ঢাকতে পাতায় ড্র্যাগ করুন: টেক্সট, স্বাক্ষর, ছবি। সেভ করলে প্রতিটা পাতা একটা ছবিতে পরিণত হয়, তাই যা ঢেকেছেন তা চিরতরে মুছে যায়। যে টেক্সট ঢাকেননি তা সার্চযোগ্য থাকে।", "footer.madeBy": "ডিজাইন ও নির্মাণ:", "footer.feedback": "বাগ রিপোর্ট করুন বা টুল প্রস্তাব করুন", "footer.compare": "পরিচিত টুলের বিকল্প", @@ -749,7 +750,7 @@ "title": "PDF রিড্যাক্ট করুন ফ্রি — তথ্য লুকান, আপলোড ছাড়া | Fizzdoc", "description": "PDF-এ নাম, নম্বর, স্বাক্ষর বা ছবি কালো করুন এবং এমন একটা কপি সেভ করুন যেখানে সেগুলো সত্যিই মুছে গেছে। ব্রাউজারেই চলে; কিছু আপলোড হয় না। ফ্রি।", "h1": "PDF রিডাক্ট করুন: যা কিছু চিরতরে কালো করুন", - "lede": "যা মুছতে চান তার ওপর ড্র্যাগ করুন, বা একটা নাম বা নম্বর খুঁজে প্রতিটা মিল মার্ক করুন। সেভ করলে প্রতিটা পাতা একটা ছবিতে পরিণত হয়, তাই লুকানো টেক্সট কপি বা ফিরিয়ে আনা যায় না।", + "lede": "যা মুছতে চান তার ওপর ড্র্যাগ করুন, বা একটা নাম বা নম্বর খুঁজে প্রতিটা মিল মার্ক করুন। সেভ করলে প্রতিটা পাতা একটা ছবিতে পরিণত হয়, তাই লুকানো টেক্সট কপি বা ফিরিয়ে আনা যায় না, আর বাকি টেক্সট সার্চযোগ্য থাকে।", "steps": [ "একটা PDF ফাইল যোগ করুন।", "একটা এলাকা ঢাকতে পাতায় ড্র্যাগ করুন, বা একটা শব্দ লিখে “সব মার্ক করুন”-এ ক্লিক করুন।", @@ -762,11 +763,11 @@ ], [ "রিডাক্ট করা টেক্সট কি সত্যিই মুছে যায়?", - "হ্যাঁ। Fizzdoc প্রতিটা পাতা আপনার কালো মার্কসহ একটা ছবি হিসেবে নতুন করে আঁকে আর সেই ছবি থেকে একটা নতুন PDF তৈরি করে। মূল টেক্সট, ফন্ট আর ডকুমেন্ট মেটাডেটা কপি করা হয় না, তাই মার্কের নিচে কিছুই সিলেক্ট, সার্চ বা ফিরিয়ে আনা যায় না।" + "হ্যাঁ। Fizzdoc প্রতিটা পাতা আপনার কালো মার্কসহ একটা ছবি হিসেবে নতুন করে আঁকে আর সেই ছবি থেকে একটা নতুন PDF তৈরি করে। মূল ফন্ট আর ডকুমেন্ট মেটাডেটা কপি করা হয় না, আর মার্কের নিচের টেক্সট কখনো ফিরিয়ে যোগ করা হয় না, তাই তা সিলেক্ট, সার্চ বা ফিরিয়ে আনা যায় না।" ], [ "বাকি টেক্সট কি সার্চ বা কপি করা যাবে?", - "না। প্রতিটা পাতা একটা ছবি হয়ে যায়, তাই সেভ করা ফাইলে কোনো সিলেক্ট করার মতো টেক্সট থাকে না। আবার সার্চযোগ্য টেক্সট দরকার হলে, রিডাক্ট করা ফাইলটা OCR PDF-এ চালান; কালো মার্কগুলো কালোই থাকবে।" + "হ্যাঁ। আপনি যে টেক্সট ঢাকেননি তা প্রতিটা পাতার ছবির ওপর একটা অদৃশ্য স্তর হিসেবে আবার যোগ করা হয়, তাই আপনি সার্চ, সিলেক্ট আর কপি করতে পারবেন। মার্কের নিচের টেক্সট বাদ যায়, আর পাতায় যে টেক্সট দেখা যায় না, যেমন কালো বাক্সের নিচে আগে থেকে লুকানো শব্দ, সেটাও বাদ যায়। শুধু ছবির ফাইলের জন্য “বাকি টেক্সট সার্চযোগ্য রাখুন” টিকটা তুলে দিন।" ], [ "Fizzdoc কি ফ্রি?", diff --git a/src/i18n/de.json b/src/i18n/de.json index f768891..ce5aab5 100644 --- a/src/i18n/de.json +++ b/src/i18n/de.json @@ -123,6 +123,7 @@ "ws.lookColor": "Farbe", "ws.lookGray": "Schwarz-Weiß", "ws.lookScanned": "Gescannt (grau, leicht geneigt)", + "ws.keepText": "Restlichen Text durchsuchbar lassen", "ws.wmText": "Wasserzeichentext", "ws.wmDefault": "VERTRAULICH", "ws.opacity": "Deckkraft", @@ -231,7 +232,7 @@ "rd.personalFound": "Persönliche Daten markiert: {n}. Prüfen Sie jede Markierung vor dem Speichern.", "rd.personalNone": "Keine E-Mails, Telefon-, Ausweis- oder Kartennummern gefunden. Suchen Sie Namen und Adressen oben.", "rd.remove": "Diese Markierung entfernen", - "rd.hint": "Ziehen Sie über eine Seite, um etwas zu bedecken: Text, eine Unterschrift, ein Foto. Beim Speichern wird jede Seite zu einem Bild, sodass das Bedeckte für immer verschwindet.", + "rd.hint": "Ziehen Sie über eine Seite, um etwas zu bedecken: Text, eine Unterschrift, ein Foto. Beim Speichern wird jede Seite zu einem Bild, sodass das Bedeckte für immer verschwindet. Der Text, den Sie nicht bedeckt haben, bleibt durchsuchbar.", "footer.madeBy": "Entworfen und entwickelt von", "footer.feedback": "Fehler melden oder Tool vorschlagen", "footer.compare": "Alternativen zu bekannten Tools", @@ -749,7 +750,7 @@ "title": "PDF Schwärzen Kostenlos — Text Dauerhaft Entfernen | Fizzdoc", "description": "Schwärzen Sie Namen, Nummern, Unterschriften oder Fotos in einem PDF und speichern Sie eine Kopie, in der sie wirklich weg sind. Im Browser; kein Upload.", "h1": "PDF schwärzen: alles dauerhaft unkenntlich machen", - "lede": "Ziehen Sie über das, was verschwinden soll, oder suchen Sie nach einem Namen oder einer Nummer und markieren Sie jeden Treffer. Beim Speichern wird jede Seite zu einem Bild, sodass der verdeckte Text nicht kopiert oder wiederhergestellt werden kann.", + "lede": "Ziehen Sie über das, was verschwinden soll, oder suchen Sie nach einem Namen oder einer Nummer und markieren Sie jeden Treffer. Beim Speichern wird jede Seite zu einem Bild, sodass der verdeckte Text nicht kopiert oder wiederhergestellt werden kann, während der Rest durchsuchbar bleibt.", "steps": [ "Eine PDF-Datei hinzufügen.", "Über die Seite ziehen, um einen Bereich zu bedecken, oder ein Wort eingeben und auf „Alle markieren“ klicken.", @@ -762,11 +763,11 @@ ], [ "Ist der geschwärzte Text wirklich weg?", - "Ja. Fizzdoc zeichnet jede Seite mit Ihren eingebrannten schwarzen Markierungen als Bild neu und baut aus diesen Bildern ein neues PDF. Der ursprüngliche Text, die Schriften und die Dokument-Metadaten werden nicht übernommen, sodass nichts unter einer Markierung ausgewählt, gesucht oder wiederhergestellt werden kann." + "Ja. Fizzdoc zeichnet jede Seite mit Ihren eingebrannten schwarzen Markierungen als Bild neu und baut aus diesen Bildern ein neues PDF. Die ursprünglichen Schriften und die Dokument-Metadaten werden nicht übernommen, und Text unter einer Markierung wird nie wieder hinzugefügt, sodass er nicht ausgewählt, gesucht oder wiederhergestellt werden kann." ], [ "Kann ich den restlichen Text noch durchsuchen oder kopieren?", - "Nein. Jede Seite wird zu einem Bild, sodass die gespeicherte Datei keinen auswählbaren Text mehr hat. Wenn Sie wieder durchsuchbaren Text brauchen, lassen Sie die geschwärzte Datei durch PDF OCR laufen; die schwarzen Markierungen bleiben schwarz." + "Ja. Der Text, den Sie nicht bedeckt haben, wird als unsichtbare Ebene über jedem Seitenbild wieder hinzugefügt, sodass Sie ihn durchsuchen, auswählen und kopieren können. Text unter einer Markierung bleibt außen vor, ebenso Text, der auf der Seite nicht zu sehen ist, etwa Wörter, die schon unter einem schwarzen Kasten versteckt sind. Bei einer reinen Bilddatei entfernen Sie das Häkchen bei „Restlichen Text durchsuchbar lassen“." ], [ "Ist Fizzdoc kostenlos?", diff --git a/src/i18n/es.json b/src/i18n/es.json index dd130e9..7756626 100644 --- a/src/i18n/es.json +++ b/src/i18n/es.json @@ -123,6 +123,7 @@ "ws.lookColor": "Color", "ws.lookGray": "Blanco y negro", "ws.lookScanned": "Escaneado (gris, ligeramente inclinado)", + "ws.keepText": "Mantener el resto del texto buscable", "ws.wmText": "Texto de la marca de agua", "ws.wmDefault": "CONFIDENCIAL", "ws.opacity": "Opacidad", @@ -231,7 +232,7 @@ "rd.personalFound": "Datos personales marcados: {n}. Revisa cada uno antes de guardar.", "rd.personalNone": "No se encontraron correos, teléfonos ni números de ID o tarjeta. Busca nombres y direcciones arriba.", "rd.remove": "Quitar esta marca", - "rd.hint": "Arrastra sobre una página para tapar cualquier cosa: texto, una firma, una foto. Al guardar, cada página se convierte en una imagen, así que lo que tapaste desaparece para siempre.", + "rd.hint": "Arrastra sobre una página para tapar cualquier cosa: texto, una firma, una foto. Al guardar, cada página se convierte en una imagen, así que lo que tapaste desaparece para siempre. El texto que no tapaste sigue siendo buscable.", "footer.madeBy": "Diseñado y creado por", "footer.feedback": "Reporta un error o sugiere una herramienta", "footer.compare": "Alternativas a herramientas conocidas", @@ -749,7 +750,7 @@ "title": "Censurar PDF Gratis — Tapar Texto para Siempre | Fizzdoc", "description": "Tapa de negro nombres, números, firmas o fotos en un PDF y guarda una copia donde de verdad desaparecen. Funciona en tu navegador; nada se sube. Gratis.", "h1": "Censura un PDF: tapa cualquier cosa para siempre", - "lede": "Arrastra sobre lo que quieras ocultar, o busca un nombre o número y marca cada coincidencia. Al guardar, cada página se convierte en una imagen, así que el texto oculto no se puede copiar ni recuperar.", + "lede": "Arrastra sobre lo que quieras ocultar, o busca un nombre o número y marca cada coincidencia. Al guardar, cada página se convierte en una imagen, así que el texto oculto no se puede copiar ni recuperar, mientras que el resto sigue siendo buscable.", "steps": [ "Añade un archivo PDF.", "Arrastra sobre la página para tapar una zona, o escribe una palabra y haz clic en «Marcar todo».", @@ -762,11 +763,11 @@ ], [ "¿El texto censurado desaparece de verdad?", - "Sí. Fizzdoc vuelve a dibujar cada página como una imagen con tus marcas negras integradas y crea un PDF nuevo a partir de esas imágenes. El texto, las fuentes y los metadatos originales no se copian, así que nada de lo que hay debajo de una marca se puede seleccionar, buscar ni recuperar." + "Sí. Fizzdoc vuelve a dibujar cada página como una imagen con tus marcas negras integradas y crea un PDF nuevo a partir de esas imágenes. Las fuentes y los metadatos originales no se copian, y el texto que hay debajo de una marca nunca se vuelve a añadir, así que no se puede seleccionar, buscar ni recuperar." ], [ "¿Puedo seguir buscando o copiando el resto del texto?", - "No. Cada página se convierte en una imagen, así que el archivo guardado no tiene texto seleccionable. Si necesitas texto buscable de nuevo, pasa el archivo censurado por OCR PDF; las marcas negras seguirán siendo negras." + "Sí. El texto que no tapaste se vuelve a añadir como una capa invisible sobre la imagen de cada página, así que puedes buscarlo, seleccionarlo y copiarlo. El texto que hay debajo de una marca se deja fuera, igual que el texto que no se ve en la página, como las palabras ya ocultas bajo un recuadro negro. Para un archivo solo de imágenes, desmarca «Mantener el resto del texto buscable»." ], [ "¿Es gratis Fizzdoc?", diff --git a/src/i18n/fr.json b/src/i18n/fr.json index e65da6b..49fc96b 100644 --- a/src/i18n/fr.json +++ b/src/i18n/fr.json @@ -123,6 +123,7 @@ "ws.lookColor": "Couleur", "ws.lookGray": "Noir et blanc", "ws.lookScanned": "Scanné (gris, légèrement incliné)", + "ws.keepText": "Garder le reste du texte consultable", "ws.wmText": "Texte du filigrane", "ws.wmDefault": "CONFIDENTIEL", "ws.opacity": "Opacité", @@ -231,7 +232,7 @@ "rd.personalFound": "Données personnelles marquées : {n}. Vérifiez chacune avant d’enregistrer.", "rd.personalNone": "Aucun e-mail, téléphone ni numéro d’identité ou de carte trouvé. Recherchez les noms et adresses ci-dessus.", "rd.remove": "Supprimer cette marque", - "rd.hint": "Faites glisser sur une page pour couvrir n'importe quoi : du texte, une signature, une photo. À l'enregistrement, chaque page devient une image, donc ce que vous avez couvert disparaît pour de bon.", + "rd.hint": "Faites glisser sur une page pour couvrir n'importe quoi : du texte, une signature, une photo. À l'enregistrement, chaque page devient une image, donc ce que vous avez couvert disparaît pour de bon. Le texte que vous n'avez pas couvert reste consultable.", "footer.madeBy": "Conçu et développé par", "footer.feedback": "Signaler un bug ou proposer un outil", "footer.compare": "Alternatives aux outils connus", @@ -749,7 +750,7 @@ "title": "Caviarder un PDF Gratuit — Masquer le Texte Définitivement | Fizzdoc", "description": "Noircissez des noms, numéros, signatures ou photos dans un PDF et gardez une copie où ils ont vraiment disparu. Dans votre navigateur ; rien n'est envoyé.", "h1": "Caviarder un PDF : noircir n'importe quoi pour de bon", - "lede": "Faites glisser sur ce qui doit disparaître, ou recherchez un nom ou un numéro et marquez chaque occurrence. À l'enregistrement, chaque page devient une image, si bien que le texte masqué ne peut plus être copié ni récupéré.", + "lede": "Faites glisser sur ce qui doit disparaître, ou recherchez un nom ou un numéro et marquez chaque occurrence. À l'enregistrement, chaque page devient une image, si bien que le texte masqué ne peut plus être copié ni récupéré, tandis que le reste demeure consultable.", "steps": [ "Ajoutez un fichier PDF.", "Faites glisser sur la page pour couvrir une zone, ou tapez un mot et cliquez sur « Tout marquer ».", @@ -762,11 +763,11 @@ ], [ "Le texte caviardé a-t-il vraiment disparu ?", - "Oui. Fizzdoc redessine chaque page en image avec vos marques noires intégrées et construit un nouveau PDF à partir de ces images. Le texte, les polices et les métadonnées d'origine ne sont pas copiés, donc rien sous une marque ne peut être sélectionné, recherché ou récupéré." + "Oui. Fizzdoc redessine chaque page en image avec vos marques noires intégrées et construit un nouveau PDF à partir de ces images. Les polices et les métadonnées d'origine ne sont pas copiées, et le texte sous une marque n'est jamais rajouté, donc il ne peut pas être sélectionné, recherché ou récupéré." ], [ "Puis-je encore rechercher ou copier le reste du texte ?", - "Non. Chaque page devient une image, donc le fichier enregistré n'a aucun texte sélectionnable. Si vous avez besoin de texte à nouveau consultable, passez le fichier caviardé dans OCR PDF ; les marques noires resteront noires." + "Oui. Le texte que vous n'avez pas couvert est rajouté sous forme de calque invisible sur l'image de chaque page, ce qui permet de le rechercher, de le sélectionner et de le copier. Le texte sous une marque est exclu, tout comme le texte qui ne s'affiche pas sur la page, par exemple des mots déjà cachés sous un rectangle noir. Pour un fichier composé uniquement d'images, décochez « Garder le reste du texte consultable »." ], [ "Est-ce que Fizzdoc est gratuit ?", diff --git a/src/i18n/hi.json b/src/i18n/hi.json index d0886d1..14281c5 100644 --- a/src/i18n/hi.json +++ b/src/i18n/hi.json @@ -123,6 +123,7 @@ "ws.lookColor": "रंगीन", "ws.lookGray": "ब्लैक एंड व्हाइट", "ws.lookScanned": "स्कैन्ड (ग्रे, हल्का टेढ़ा)", + "ws.keepText": "बाकी टेक्स्ट को सर्च करने लायक रखें", "ws.wmText": "वॉटरमार्क टेक्स्ट", "ws.wmDefault": "CONFIDENTIAL", "ws.opacity": "ओपैसिटी", @@ -231,7 +232,7 @@ "rd.personalFound": "निजी जानकारी मार्क की गई: {n}. सेव करने से पहले हर एक को जाँच लें।", "rd.personalNone": "कोई ईमेल, फ़ोन, ID या कार्ड नंबर नहीं मिला। नाम और पते ऊपर खोजें।", "rd.remove": "यह मार्क हटाएँ", - "rd.hint": "किसी भी चीज़ को कवर करने के लिए पेज पर ड्रैग करें: टेक्स्ट, हस्ताक्षर, फ़ोटो। सेव करते ही हर पेज एक इमेज बन जाता है, इसलिए जो कवर किया वह हमेशा के लिए मिट जाता है।", + "rd.hint": "किसी भी चीज़ को कवर करने के लिए पेज पर ड्रैग करें: टेक्स्ट, हस्ताक्षर, फ़ोटो। सेव करते ही हर पेज एक इमेज बन जाता है, इसलिए जो कवर किया वह हमेशा के लिए मिट जाता है। जो टेक्स्ट आपने कवर नहीं किया, वह सर्च करने लायक रहता है।", "footer.madeBy": "डिज़ाइन और निर्माण:", "footer.feedback": "बग रिपोर्ट करें या टूल सुझाएँ", "footer.compare": "जाने-पहचाने टूल्स के विकल्प", @@ -749,7 +750,7 @@ "title": "PDF रिडैक्ट करें फ्री — नाम-नंबर छुपाएँ, बिना अपलोड | Fizzdoc", "description": "PDF में नाम, नंबर, हस्ताक्षर या फ़ोटो को काला करें और एक कॉपी सेव करें जिसमें वे वाकई मिट जाएँ। यह आपके ब्राउज़र में चलता है; कुछ भी अपलोड नहीं होता। मुफ़्त।", "h1": "PDF रिडैक्ट करें: कुछ भी हमेशा के लिए काला करें", - "lede": "जो मिटाना है उस पर ड्रैग करें, या कोई नाम या नंबर खोजें और हर मैच को मार्क करें। सेव करते ही हर पेज एक इमेज बन जाता है, इसलिए छुपाया गया टेक्स्ट कॉपी या रिकवर नहीं हो सकता।", + "lede": "जो मिटाना है उस पर ड्रैग करें, या कोई नाम या नंबर खोजें और हर मैच को मार्क करें। सेव करते ही हर पेज एक इमेज बन जाता है, इसलिए छुपाया गया टेक्स्ट कॉपी या रिकवर नहीं हो सकता, जबकि बाकी टेक्स्ट सर्च करने लायक रहता है।", "steps": [ "एक PDF फ़ाइल जोड़ें।", "पेज पर ड्रैग करके एरिया कवर करें, या कोई शब्द टाइप करके “सभी मार्क करें” पर क्लिक करें।", @@ -762,11 +763,11 @@ ], [ "क्या रिडैक्ट किया गया टेक्स्ट वाकई मिट जाता है?", - "हाँ। Fizzdoc हर पेज को आपके काले मार्क के साथ बर्न-इन करके इमेज के रूप में फिर से बनाता है और उन इमेज से एक नई PDF बनाता है। ओरिजिनल टेक्स्ट, फ़ॉन्ट और डॉक्यूमेंट मेटाडेटा कॉपी नहीं होते, इसलिए मार्क के नीचे कुछ भी सिलेक्ट, सर्च या रिकवर नहीं किया जा सकता।" + "हाँ। Fizzdoc हर पेज को आपके काले मार्क के साथ बर्न-इन करके इमेज के रूप में फिर से बनाता है और उन इमेज से एक नई PDF बनाता है। ओरिजिनल फ़ॉन्ट और डॉक्यूमेंट मेटाडेटा कॉपी नहीं होते, और मार्क के नीचे का टेक्स्ट कभी वापस नहीं जोड़ा जाता, इसलिए उसे सिलेक्ट, सर्च या रिकवर नहीं किया जा सकता।" ], [ "क्या मैं बाकी टेक्स्ट सर्च या कॉपी कर पाऊँगा?", - "नहीं। हर पेज एक इमेज बन जाता है, इसलिए सेव की गई फ़ाइल में कोई सिलेक्ट होने वाला टेक्स्ट नहीं होता। अगर आपको फिर से सर्च करने लायक टेक्स्ट चाहिए, तो रिडैक्ट की गई फ़ाइल को PDF OCR करें से चलाएँ; काले मार्क वैसे ही काले रहेंगे।" + "हाँ। जो टेक्स्ट आपने कवर नहीं किया, वह हर पेज की इमेज के ऊपर एक अदृश्य लेयर के रूप में वापस जोड़ा जाता है, इसलिए आप उसे सर्च, सिलेक्ट और कॉपी कर सकते हैं। मार्क के नीचे का टेक्स्ट शामिल नहीं होता, और वह टेक्स्ट भी नहीं जो पेज पर दिखता नहीं, जैसे काले बॉक्स के नीचे पहले से छुपे शब्द। सिर्फ़ इमेज वाली फ़ाइल के लिए “बाकी टेक्स्ट को सर्च करने लायक रखें” का टिक हटा दें।" ], [ "क्या Fizzdoc मुफ़्त है?", diff --git a/src/i18n/id.json b/src/i18n/id.json index a9a0e4b..a0b58d7 100644 --- a/src/i18n/id.json +++ b/src/i18n/id.json @@ -123,6 +123,7 @@ "ws.lookColor": "Berwarna", "ws.lookGray": "Hitam putih", "ws.lookScanned": "Hasil scan (abu-abu, sedikit miring)", + "ws.keepText": "Pertahankan sisa teks agar bisa dicari", "ws.wmText": "Teks watermark", "ws.wmDefault": "RAHASIA", "ws.opacity": "Opasitas", @@ -231,7 +232,7 @@ "rd.personalFound": "Data pribadi ditandai: {n}. Periksa satu per satu sebelum menyimpan.", "rd.personalNone": "Tidak ada email, telepon, nomor identitas, atau kartu. Cari nama dan alamat di atas.", "rd.remove": "Hapus tanda ini", - "rd.hint": "Seret pada halaman untuk menutup apa saja: teks, tanda tangan, foto. Saat disimpan, setiap halaman menjadi gambar, jadi yang Anda tutup akan hilang selamanya.", + "rd.hint": "Seret pada halaman untuk menutup apa saja: teks, tanda tangan, foto. Saat disimpan, setiap halaman menjadi gambar, jadi yang Anda tutup akan hilang selamanya. Teks yang tidak Anda tutup tetap bisa dicari.", "footer.madeBy": "Dirancang dan dibuat oleh", "footer.feedback": "Laporkan bug atau usulkan alat", "footer.compare": "Alternatif untuk alat yang sudah dikenal", @@ -749,7 +750,7 @@ "title": "Sensor PDF Gratis — Hitamkan Permanen | Fizzdoc", "description": "Hitamkan nama, nomor, tanda tangan, atau foto di PDF dan simpan salinan yang benar-benar menghilangkannya. Berjalan di browser Anda; tanpa upload. Gratis.", "h1": "Sensor PDF: hitamkan apa saja selamanya", - "lede": "Seret area yang harus hilang, atau cari nama atau nomor lalu tandai setiap kecocokan. Saat disimpan, setiap halaman menjadi gambar, jadi teks yang disembunyikan tidak bisa disalin atau dipulihkan.", + "lede": "Seret area yang harus hilang, atau cari nama atau nomor lalu tandai setiap kecocokan. Saat disimpan, setiap halaman menjadi gambar, jadi teks yang disembunyikan tidak bisa disalin atau dipulihkan, sementara sisanya tetap bisa dicari.", "steps": [ "Tambahkan satu file PDF.", "Seret pada halaman untuk menutup area, atau ketik kata lalu klik “Tandai semua”.", @@ -762,11 +763,11 @@ ], [ "Apakah teks yang disensor benar-benar hilang?", - "Ya. Fizzdoc menggambar ulang setiap halaman sebagai gambar dengan tanda hitam Anda tertanam di dalamnya dan membuat PDF baru dari gambar-gambar itu. Teks asli, font, dan metadata dokumen tidak disalin, jadi apa pun di bawah tanda tidak bisa dipilih, dicari, atau dipulihkan." + "Ya. Fizzdoc menggambar ulang setiap halaman sebagai gambar dengan tanda hitam Anda tertanam di dalamnya dan membuat PDF baru dari gambar-gambar itu. Font dan metadata dokumen asli tidak disalin, dan teks di bawah tanda tidak pernah ditambahkan kembali, jadi tidak bisa dipilih, dicari, atau dipulihkan." ], [ "Apakah saya masih bisa mencari atau menyalin teks yang lain?", - "Tidak. Setiap halaman menjadi gambar, jadi file yang disimpan tidak punya teks yang bisa dipilih. Jika butuh teks yang bisa dicari lagi, jalankan file yang disensor lewat OCR PDF; tanda hitamnya akan tetap hitam." + "Ya. Teks yang tidak Anda tutup ditambahkan kembali sebagai lapisan tak terlihat di atas gambar setiap halaman, jadi Anda bisa mencari, memilih, dan menyalinnya. Teks di bawah tanda tidak disertakan, begitu juga teks yang tidak tampak di halaman, seperti kata-kata yang sudah tersembunyi di bawah kotak hitam. Untuk file berisi gambar saja, hapus centang pada “Pertahankan sisa teks agar bisa dicari”." ], [ "Apakah Fizzdoc gratis?", diff --git a/src/i18n/it.json b/src/i18n/it.json index b582d41..d64aa93 100644 --- a/src/i18n/it.json +++ b/src/i18n/it.json @@ -123,6 +123,7 @@ "ws.lookColor": "Colore", "ws.lookGray": "Bianco e nero", "ws.lookScanned": "Scansionato (grigio, leggermente inclinato)", + "ws.keepText": "Mantieni ricercabile il resto del testo", "ws.wmText": "Testo della filigrana", "ws.wmDefault": "RISERVATO", "ws.opacity": "Opacità", @@ -231,7 +232,7 @@ "rd.personalFound": "Dati personali segnati: {n}. Controllali uno per uno prima di salvare.", "rd.personalNone": "Nessuna email, telefono o numero di documento o carta trovato. Cerca nomi e indirizzi qui sopra.", "rd.remove": "Rimuovi questo segno", - "rd.hint": "Trascina su una pagina per coprire qualsiasi cosa: testo, una firma, una foto. Al salvataggio, ogni pagina diventa un'immagine, quindi ciò che hai coperto sparisce per sempre.", + "rd.hint": "Trascina su una pagina per coprire qualsiasi cosa: testo, una firma, una foto. Al salvataggio, ogni pagina diventa un'immagine, quindi ciò che hai coperto sparisce per sempre. Il testo che non hai coperto resta ricercabile.", "footer.madeBy": "Progettato e sviluppato da", "footer.feedback": "Segnala un bug o suggerisci uno strumento", "footer.compare": "Alternative a strumenti noti", @@ -749,7 +750,7 @@ "title": "Censurare PDF Gratis — Coprire il Testo per Sempre | Fizzdoc", "description": "Annerisci nomi, numeri, firme o foto in un PDF e salva una copia in cui sono davvero spariti. Funziona nel browser; niente viene caricato. Gratis.", "h1": "Oscura un PDF: annerisci qualsiasi cosa per sempre", - "lede": "Trascina su ciò che deve sparire, oppure cerca un nome o un numero e segna ogni corrispondenza. Al salvataggio, ogni pagina diventa un'immagine, quindi il testo coperto non può essere copiato né recuperato.", + "lede": "Trascina su ciò che deve sparire, oppure cerca un nome o un numero e segna ogni corrispondenza. Al salvataggio, ogni pagina diventa un'immagine, quindi il testo coperto non può essere copiato né recuperato, mentre il resto resta ricercabile.", "steps": [ "Aggiungi un file PDF.", "Trascina sulla pagina per coprire un’area, oppure digita una parola e clicca su “Segna tutto”.", @@ -762,11 +763,11 @@ ], [ "Il testo oscurato sparisce davvero?", - "Sì. Fizzdoc ridisegna ogni pagina come immagine con i tuoi segni neri incorporati e crea un nuovo PDF da quelle immagini. Il testo, i font e i metadati originali non vengono copiati, quindi nulla sotto un segno può essere selezionato, cercato o recuperato." + "Sì. Fizzdoc ridisegna ogni pagina come immagine con i tuoi segni neri incorporati e crea un nuovo PDF da quelle immagini. I font e i metadati originali non vengono copiati, e il testo sotto un segno non viene mai riaggiunto, quindi non può essere selezionato, cercato o recuperato." ], [ "Posso ancora cercare o copiare il resto del testo?", - "No. Ogni pagina diventa un'immagine, quindi il file salvato non ha testo selezionabile. Se ti serve di nuovo testo ricercabile, passa il file oscurato per OCR PDF; i segni neri resteranno neri." + "Sì. Il testo che non hai coperto viene riaggiunto come livello invisibile sopra l'immagine di ogni pagina, così puoi cercarlo, selezionarlo e copiarlo. Il testo sotto un segno viene escluso, così come il testo che non si vede nella pagina, ad esempio le parole già nascoste sotto un riquadro nero. Per un file di sole immagini, deseleziona «Mantieni ricercabile il resto del testo»." ], [ "Fizzdoc è gratuito?", diff --git a/src/i18n/mr.json b/src/i18n/mr.json index 7d8422e..f4ba980 100644 --- a/src/i18n/mr.json +++ b/src/i18n/mr.json @@ -123,6 +123,7 @@ "ws.lookColor": "रंगीत", "ws.lookGray": "ब्लॅक अँड व्हाइट", "ws.lookScanned": "स्कॅन्ड (ग्रे, किंचित तिरपे)", + "ws.keepText": "उरलेला मजकूर शोधण्यायोग्य ठेवा", "ws.wmText": "वॉटरमार्क मजकूर", "ws.wmDefault": "CONFIDENTIAL", "ws.opacity": "ओपॅसिटी", @@ -231,7 +232,7 @@ "rd.personalFound": "वैयक्तिक माहिती मार्क केली: {n}. सेव्ह करण्यापूर्वी प्रत्येक तपासा.", "rd.personalNone": "कोणताही ईमेल, फोन, ID किंवा कार्ड नंबर सापडला नाही. नावे आणि पत्ते वर शोधा.", "rd.remove": "हा मार्क काढा", - "rd.hint": "काहीही झाकण्यासाठी पानावर ड्रॅग करा: मजकूर, स्वाक्षरी, फोटो. सेव्ह केल्यावर प्रत्येक पान इमेज बनते, त्यामुळे तुम्ही झाकलेले कायमचे नाहीसे होते.", + "rd.hint": "काहीही झाकण्यासाठी पानावर ड्रॅग करा: मजकूर, स्वाक्षरी, फोटो. सेव्ह केल्यावर प्रत्येक पान इमेज बनते, त्यामुळे तुम्ही झाकलेले कायमचे नाहीसे होते. तुम्ही न झाकलेला मजकूर शोधण्यायोग्य राहतो.", "footer.madeBy": "डिझाइन आणि निर्मिती:", "footer.feedback": "बग कळवा किंवा टूल सुचवा", "footer.compare": "ओळखीच्या टूल्सचे पर्याय", @@ -749,7 +750,7 @@ "title": "PDF रिडॅक्ट करा मोफत — माहिती लपवा, विना अपलोड | Fizzdoc", "description": "PDF मधली नावे, नंबर, स्वाक्षऱ्या किंवा फोटो काळे करा आणि खरोखर नाहीसे झालेली कॉपी सेव्ह करा. ब्राउझरमध्ये चालते; अपलोड होत नाही. मोफत.", "h1": "PDF रिडॅक्ट करा: काहीही कायमचे काळे करा", - "lede": "जे लपवायचे आहे त्यावर ड्रॅग करा, किंवा एखादे नाव किंवा नंबर शोधून प्रत्येक मॅच मार्क करा. सेव्ह केल्यावर प्रत्येक पान एक इमेज बनते, त्यामुळे लपवलेला मजकूर कॉपी किंवा रिकव्हर करता येत नाही.", + "lede": "जे लपवायचे आहे त्यावर ड्रॅग करा, किंवा एखादे नाव किंवा नंबर शोधून प्रत्येक मॅच मार्क करा. सेव्ह केल्यावर प्रत्येक पान एक इमेज बनते, त्यामुळे लपवलेला मजकूर कॉपी किंवा रिकव्हर करता येत नाही, तर उरलेला मजकूर शोधण्यायोग्य राहतो.", "steps": [ "एक PDF फाइल जोडा.", "एरिया झाकण्यासाठी पानावर ड्रॅग करा, किंवा शब्द टाइप करून “सर्व मार्क करा” वर क्लिक करा.", @@ -762,11 +763,11 @@ ], [ "रिडॅक्ट केलेला मजकूर खरोखर नाहीसा होतो का?", - "होय. Fizzdoc प्रत्येक पान तुमच्या काळ्या मार्कसह एक इमेज म्हणून पुन्हा तयार करतो आणि त्या इमेजेसमधून नवीन PDF बनवतो. मूळ मजकूर, फॉन्ट आणि डॉक्युमेंट मेटाडेटा कॉपी केले जात नाहीत, त्यामुळे मार्कखालचे काहीही सिलेक्ट, शोधले किंवा रिकव्हर करता येत नाही." + "होय. Fizzdoc प्रत्येक पान तुमच्या काळ्या मार्कसह एक इमेज म्हणून पुन्हा तयार करतो आणि त्या इमेजेसमधून नवीन PDF बनवतो. मूळ फॉन्ट आणि डॉक्युमेंट मेटाडेटा कॉपी केले जात नाहीत, आणि मार्कखालचा मजकूर कधीही परत जोडला जात नाही, त्यामुळे तो सिलेक्ट, शोधला किंवा रिकव्हर करता येत नाही." ], [ "बाकीचा मजकूर मी शोधू किंवा कॉपी करू शकतो का?", - "नाही. प्रत्येक पान इमेज बनते, त्यामुळे सेव्ह केलेल्या फाइलमध्ये सिलेक्ट करता येईल असा मजकूर नसतो. पुन्हा शोधण्यायोग्य मजकूर हवा असल्यास, रिडॅक्ट केलेली फाइल PDF OCR करा मधून चालवा; काळे मार्क तसेच राहतील." + "होय. तुम्ही न झाकलेला मजकूर प्रत्येक पानाच्या इमेजवर अदृश्य थर म्हणून परत जोडला जातो, त्यामुळे तुम्ही तो शोधू, सिलेक्ट आणि कॉपी करू शकता. मार्कखालचा मजकूर वगळला जातो, तसेच पानावर न दिसणारा मजकूरही, जसे की काळ्या बॉक्सखाली आधीच लपलेले शब्द. फक्त इमेज असलेल्या फाइलसाठी “उरलेला मजकूर शोधण्यायोग्य ठेवा” वरील टिक काढा." ], [ "Fizzdoc मोफत आहे का?", diff --git a/src/i18n/nl.json b/src/i18n/nl.json index 2a6a8c4..0c4410c 100644 --- a/src/i18n/nl.json +++ b/src/i18n/nl.json @@ -123,6 +123,7 @@ "ws.lookColor": "Kleur", "ws.lookGray": "Zwart-wit", "ws.lookScanned": "Gescand (grijs, licht gekanteld)", + "ws.keepText": "Houd de rest van de tekst doorzoekbaar", "ws.wmText": "Watermerktekst", "ws.wmDefault": "VERTROUWELIJK", "ws.opacity": "Dekking", @@ -231,7 +232,7 @@ "rd.personalFound": "Persoonsgegevens gemarkeerd: {n}. Controleer ze allemaal voor het opslaan.", "rd.personalNone": "Geen e-mails, telefoon-, ID- of kaartnummers gevonden. Zoek namen en adressen hierboven.", "rd.remove": "Deze markering verwijderen", - "rd.hint": "Sleep over een pagina om iets te bedekken: tekst, een handtekening, een foto. Bij het opslaan wordt elke pagina een afbeelding, dus wat je bedekte is voorgoed weg.", + "rd.hint": "Sleep over een pagina om iets te bedekken: tekst, een handtekening, een foto. Bij het opslaan wordt elke pagina een afbeelding, dus wat je bedekte is voorgoed weg. De tekst die je niet hebt bedekt blijft doorzoekbaar.", "footer.madeBy": "Ontworpen en gebouwd door", "footer.feedback": "Meld een bug of stel een tool voor", "footer.compare": "Alternatieven voor bekende tools", @@ -749,7 +750,7 @@ "title": "PDF Zwart Lakken Gratis — Definitief, Geen Upload | Fizzdoc", "description": "Maak namen, nummers, handtekeningen of foto's in een PDF zwart en sla een kopie op waarin ze echt weg zijn. Werkt in je browser; niets wordt geüpload. Gratis.", "h1": "PDF zwart lakken: maak alles voorgoed onleesbaar", - "lede": "Sleep over wat moet verdwijnen, of zoek een naam of nummer en markeer elke match. Bij het opslaan wordt elke pagina een afbeelding, dus de verborgen tekst kan niet worden gekopieerd of teruggehaald.", + "lede": "Sleep over wat moet verdwijnen, of zoek een naam of nummer en markeer elke match. Bij het opslaan wordt elke pagina een afbeelding, dus de verborgen tekst kan niet worden gekopieerd of teruggehaald, terwijl de rest doorzoekbaar blijft.", "steps": [ "Voeg één PDF-bestand toe.", "Sleep over de pagina om een gebied te bedekken, of typ een woord en klik op “Alles markeren”.", @@ -762,11 +763,11 @@ ], [ "Is de zwartgelakte tekst echt weg?", - "Ja. Fizzdoc tekent elke pagina opnieuw als afbeelding met je zwarte markeringen erin gebrand en bouwt daaruit een nieuw PDF-bestand. De originele tekst, lettertypen en documentmetadata worden niet meegenomen, dus niets onder een markering kan worden geselecteerd, doorzocht of teruggehaald." + "Ja. Fizzdoc tekent elke pagina opnieuw als afbeelding met je zwarte markeringen erin gebrand en bouwt daaruit een nieuw PDF-bestand. De originele lettertypen en documentmetadata worden niet meegenomen en tekst onder een markering wordt nooit teruggezet, dus die kan niet worden geselecteerd, doorzocht of teruggehaald." ], [ "Kan ik de rest van de tekst nog doorzoeken of kopiëren?", - "Nee. Elke pagina wordt een afbeelding, dus het opgeslagen bestand heeft geen selecteerbare tekst meer. Heb je weer doorzoekbare tekst nodig, laat het zwartgelakte bestand dan door OCR PDF lopen; de zwarte markeringen blijven zwart." + "Ja. De tekst die je niet hebt bedekt wordt teruggezet als onzichtbare laag over elke paginaafbeelding, zodat je erin kunt zoeken en hem kunt selecteren en kopiëren. Tekst onder een markering blijft weg, net als tekst die niet op de pagina te zien is, zoals woorden die al onder een zwart vak verborgen zitten. Haal bij een bestand met alleen afbeeldingen het vinkje weg bij “Houd de rest van de tekst doorzoekbaar”." ], [ "Is Fizzdoc gratis?", diff --git a/src/i18n/pl.json b/src/i18n/pl.json index 21dcda3..6093567 100644 --- a/src/i18n/pl.json +++ b/src/i18n/pl.json @@ -123,6 +123,7 @@ "ws.lookColor": "Kolor", "ws.lookGray": "Czarno-biały", "ws.lookScanned": "Zeskanowany (szary, lekko przekrzywiony)", + "ws.keepText": "Zachowaj resztę tekstu przeszukiwalną", "ws.wmText": "Tekst znaku wodnego", "ws.wmDefault": "POUFNE", "ws.opacity": "Krycie", @@ -231,7 +232,7 @@ "rd.personalFound": "Zaznaczone dane osobowe: {n}. Sprawdź każde przed zapisaniem.", "rd.personalNone": "Nie znaleziono e-maili, telefonów ani numerów dokumentów lub kart. Wyszukaj imiona i adresy powyżej.", "rd.remove": "Usuń ten znacznik", - "rd.hint": "Przeciągnij po stronie, aby zakryć cokolwiek: tekst, podpis, zdjęcie. Po zapisaniu każda strona staje się obrazem, więc to, co zakryjesz, znika na dobre.", + "rd.hint": "Przeciągnij po stronie, aby zakryć cokolwiek: tekst, podpis, zdjęcie. Po zapisaniu każda strona staje się obrazem, więc to, co zakryjesz, znika na dobre. Tekst, którego nie zakryjesz, pozostaje przeszukiwalny.", "footer.madeBy": "Zaprojektował i zbudował", "footer.feedback": "Zgłoś błąd lub zaproponuj narzędzie", "footer.compare": "Alternatywy dla znanych narzędzi", @@ -749,7 +750,7 @@ "title": "Cenzuruj PDF za Darmo — Trwałe Zaczernienie | Fizzdoc", "description": "Zaczernij imiona, numery, podpisy albo zdjęcia w PDF i zapisz kopię, w której naprawdę znikają. Działa w przeglądarce; nic nie jest przesyłane. Za darmo.", "h1": "Cenzuruj PDF: zaczernij cokolwiek na zawsze", - "lede": "Przeciągnij po tym, co ma zniknąć, albo wyszukaj imię lub numer i zaznacz każde dopasowanie. Po zapisaniu każda strona staje się obrazem, więc ukrytego tekstu nie da się skopiować ani odzyskać.", + "lede": "Przeciągnij po tym, co ma zniknąć, albo wyszukaj imię lub numer i zaznacz każde dopasowanie. Po zapisaniu każda strona staje się obrazem, więc ukrytego tekstu nie da się skopiować ani odzyskać, a reszta pozostaje przeszukiwalna.", "steps": [ "Dodaj jeden plik PDF.", "Przeciągnij po stronie, aby zakryć obszar, albo wpisz słowo i kliknij „Zaznacz wszystko”.", @@ -762,11 +763,11 @@ ], [ "Czy ocenzurowany tekst naprawdę znika?", - "Tak. Fizzdoc rysuje każdą stronę od nowa jako obraz z wypalonymi czarnymi znacznikami i buduje z tych obrazów nowy PDF. Oryginalny tekst, czcionki i metadane dokumentu nie są kopiowane, więc nic pod znacznikiem nie da się zaznaczyć, wyszukać ani odzyskać." + "Tak. Fizzdoc rysuje każdą stronę od nowa jako obraz z wypalonymi czarnymi znacznikami i buduje z tych obrazów nowy PDF. Oryginalne czcionki i metadane dokumentu nie są kopiowane, a tekst pod znacznikiem nigdy nie jest dodawany z powrotem, więc nie da się go zaznaczyć, wyszukać ani odzyskać." ], [ "Czy mogę nadal przeszukiwać lub kopiować resztę tekstu?", - "Nie. Każda strona staje się obrazem, więc zapisany plik nie ma tekstu do zaznaczenia. Jeśli znów potrzebujesz przeszukiwalnego tekstu, przepuść ocenzurowany plik przez OCR PDF; czarne znaczniki zostaną czarne." + "Tak. Tekst, którego nie zakryjesz, jest dodawany z powrotem jako niewidoczna warstwa nad obrazem każdej strony, więc możesz go przeszukiwać, zaznaczać i kopiować. Tekst pod znacznikiem jest pomijany, podobnie jak tekst niewidoczny na stronie, na przykład słowa już ukryte pod czarnym prostokątem. W pliku zawierającym tylko obrazy odznacz „Zachowaj resztę tekstu przeszukiwalną”." ], [ "Czy Fizzdoc jest darmowy?", diff --git a/src/i18n/pt.json b/src/i18n/pt.json index 00c7d24..213760a 100644 --- a/src/i18n/pt.json +++ b/src/i18n/pt.json @@ -123,6 +123,7 @@ "ws.lookColor": "Colorido", "ws.lookGray": "Preto e branco", "ws.lookScanned": "Escaneado (cinza, levemente inclinado)", + "ws.keepText": "Manter o resto do texto pesquisável", "ws.wmText": "Texto da marca d'água", "ws.wmDefault": "CONFIDENCIAL", "ws.opacity": "Opacidade", @@ -231,7 +232,7 @@ "rd.personalFound": "Dados pessoais marcados: {n}. Confira cada um antes de salvar.", "rd.personalNone": "Nenhum e-mail, telefone ou número de documento ou cartão encontrado. Pesquise nomes e endereços acima.", "rd.remove": "Remover esta marca", - "rd.hint": "Arraste sobre uma página para cobrir qualquer coisa: texto, uma assinatura, uma foto. Ao salvar, cada página vira uma imagem, então o que você cobriu some de vez.", + "rd.hint": "Arraste sobre uma página para cobrir qualquer coisa: texto, uma assinatura, uma foto. Ao salvar, cada página vira uma imagem, então o que você cobriu some de vez. O texto que você não cobriu continua pesquisável.", "footer.madeBy": "Projetado e criado por", "footer.feedback": "Relate um erro ou sugira uma ferramenta", "footer.compare": "Alternativas a ferramentas conhecidas", @@ -749,7 +750,7 @@ "title": "Censurar PDF Grátis — Apagar Texto de Vez | Fizzdoc", "description": "Cubra nomes, números, assinaturas ou fotos em um PDF com preto e salve uma cópia onde eles realmente somem. Roda no seu navegador; nada é enviado. Grátis.", "h1": "Censure um PDF: cubra qualquer coisa de vez", - "lede": "Arraste sobre o que precisa sumir, ou busque um nome ou número e marque cada ocorrência. Ao salvar, cada página vira uma imagem, então o texto coberto não pode ser copiado nem recuperado.", + "lede": "Arraste sobre o que precisa sumir, ou busque um nome ou número e marque cada ocorrência. Ao salvar, cada página vira uma imagem, então o texto coberto não pode ser copiado nem recuperado, e o restante continua pesquisável.", "steps": [ "Adicione um arquivo PDF.", "Arraste na página para cobrir uma área, ou digite uma palavra e clique em “Marcar tudo”.", @@ -762,11 +763,11 @@ ], [ "O texto censurado realmente some?", - "Sim. O Fizzdoc redesenha cada página como uma imagem com suas marcas pretas já aplicadas e monta um novo PDF a partir dessas imagens. O texto, as fontes e os metadados originais não são copiados, então nada sob uma marca pode ser selecionado, buscado ou recuperado." + "Sim. O Fizzdoc redesenha cada página como uma imagem com suas marcas pretas já aplicadas e monta um novo PDF a partir dessas imagens. As fontes e os metadados originais não são copiados, e o texto sob uma marca nunca é adicionado de volta, então ele não pode ser selecionado, buscado ou recuperado." ], [ "Ainda dá para buscar ou copiar o resto do texto?", - "Não. Cada página vira uma imagem, então o arquivo salvo não tem texto selecionável. Se precisar de texto pesquisável de novo, rode o arquivo censurado pelo OCR PDF; as marcas pretas continuam pretas." + "Sim. O texto que você não cobriu é adicionado de volta como uma camada invisível sobre a imagem de cada página, então você pode pesquisar, selecionar e copiar. O texto sob uma marca fica de fora, assim como o texto que não aparece na página, como palavras já escondidas sob uma caixa preta. Para um arquivo só de imagem, desmarque “Manter o resto do texto pesquisável”." ], [ "O Fizzdoc é gratuito?", diff --git a/src/i18n/ta.json b/src/i18n/ta.json index 504e4fb..acbe502 100644 --- a/src/i18n/ta.json +++ b/src/i18n/ta.json @@ -123,6 +123,7 @@ "ws.lookColor": "வண்ணம்", "ws.lookGray": "கருப்பு-வெள்ளை", "ws.lookScanned": "ஸ்கேன் செய்யப்பட்டது (சாம்பல், சற்று சாய்வு)", + "ws.keepText": "மீதமுள்ள உரையைத் தேடக்கூடியதாக வைத்திருங்கள்", "ws.wmText": "வாட்டர்மார்க் உரை", "ws.wmDefault": "CONFIDENTIAL", "ws.opacity": "வெளிப்படைத்தன்மை", @@ -231,7 +232,7 @@ "rd.personalFound": "குறிக்கப்பட்ட தனிப்பட்ட விவரங்கள்: {n}. சேமிக்கும் முன் ஒவ்வொன்றையும் சரிபார்க்கவும்.", "rd.personalNone": "மின்னஞ்சல், போன், ID அல்லது கார்டு எண் எதுவும் இல்லை. பெயர், முகவரிகளை மேலே தேடவும்.", "rd.remove": "இந்த மார்க்கை நீக்கு", - "rd.hint": "எதையும் மறைக்க பக்கத்தில் இழுக்கவும்: உரை, கையொப்பம், புகைப்படம். சேமிக்கும்போது ஒவ்வொரு பக்கமும் ஒரு படமாக மாறும், எனவே நீங்கள் மறைத்தது என்றென்றைக்கும் போய்விடும்.", + "rd.hint": "எதையும் மறைக்க பக்கத்தில் இழுக்கவும்: உரை, கையொப்பம், புகைப்படம். சேமிக்கும்போது ஒவ்வொரு பக்கமும் ஒரு படமாக மாறும், எனவே நீங்கள் மறைத்தது என்றென்றைக்கும் போய்விடும். நீங்கள் மறைக்காத உரை தேடக்கூடியதாகவே இருக்கும்.", "footer.madeBy": "வடிவமைத்து உருவாக்கியவர்", "footer.feedback": "பிழையைப் புகாரளிக்கவும் அல்லது கருவியைப் பரிந்துரைக்கவும்", "footer.compare": "பழக்கமான கருவிகளுக்கான மாற்றுகள்", @@ -749,7 +750,7 @@ "title": "PDF தகவல் மறைக்க இலவசம் — பதிவேற்றாமல் | Fizzdoc", "description": "PDF-இல் பெயர்கள், எண்கள், கையொப்பங்கள் அல்லது புகைப்படங்களைக் கருப்பாக்கி, உண்மையில் மறைந்த கோப்பைச் சேமிக்கவும். பிரௌசரில் இயங்கும்; பதிவேற்றம் இல்லை. இலவசம்.", "h1": "PDF ரிடாக்ட் செய்: எதையும் என்றென்றைக்கும் கருப்பாக்கவும்", - "lede": "மறையவேண்டியதன் மேல் இழுக்கவும், அல்லது ஒரு பெயரையோ எண்ணையோ தேடி ஒவ்வொரு பொருத்தத்தையும் மார்க் செய்யவும். சேமிக்கும்போது ஒவ்வொரு பக்கமும் ஒரு படமாக மாறும், எனவே மறைக்கப்பட்ட உரையை காப்பி செய்யவோ மீட்கவோ முடியாது.", + "lede": "மறையவேண்டியதன் மேல் இழுக்கவும், அல்லது ஒரு பெயரையோ எண்ணையோ தேடி ஒவ்வொரு பொருத்தத்தையும் மார்க் செய்யவும். சேமிக்கும்போது ஒவ்வொரு பக்கமும் ஒரு படமாக மாறும், எனவே மறைக்கப்பட்ட உரையை காப்பி செய்யவோ மீட்கவோ முடியாது; மீதமுள்ள உரை தேடக்கூடியதாகவே இருக்கும்.", "steps": [ "ஒரு PDF கோப்பைச் சேர்க்கவும்.", "ஒரு பகுதியை மறைக்க பக்கத்தில் இழுக்கவும், அல்லது ஒரு வார்த்தையைத் தட்டச்சு செய்து “அனைத்தையும் மார்க் செய்” என்பதைக் கிளிக் செய்யவும்.", @@ -762,11 +763,11 @@ ], [ "ரிடாக்ட் செய்யப்பட்ட உரை உண்மையில் மறைகிறதா?", - "ஆம். Fizzdoc ஒவ்வொரு பக்கத்தையும் உங்கள் கருப்பு மார்க்குகளுடன் ஒரு படமாக மீண்டும் வரைந்து, அந்தப் படங்களிலிருந்து ஒரு புதிய PDF-ஐ உருவாக்குகிறது. மூல உரை, ஃபாண்ட் மற்றும் ஆவண மெட்டாடேட்டா காப்பி செய்யப்படாது, எனவே மார்க்கின் கீழ் உள்ளதை தேர்ந்தெடுக்கவோ, தேடவோ, மீட்கவோ முடியாது." + "ஆம். Fizzdoc ஒவ்வொரு பக்கத்தையும் உங்கள் கருப்பு மார்க்குகளுடன் ஒரு படமாக மீண்டும் வரைந்து, அந்தப் படங்களிலிருந்து ஒரு புதிய PDF-ஐ உருவாக்குகிறது. மூல ஃபாண்ட் மற்றும் ஆவண மெட்டாடேட்டா காப்பி செய்யப்படாது, மார்க்கின் கீழ் உள்ள உரையும் மீண்டும் சேர்க்கப்படாது, எனவே அதை தேர்ந்தெடுக்கவோ, தேடவோ, மீட்கவோ முடியாது." ], [ "மீதமுள்ள உரையை என்னால் தேடவோ காப்பி செய்யவோ முடியுமா?", - "இல்லை. ஒவ்வொரு பக்கமும் ஒரு படமாக மாறும், எனவே சேமிக்கப்பட்ட கோப்பில் தேர்ந்தெடுக்கக்கூடிய உரை இருக்காது. மீண்டும் தேடக்கூடிய உரை தேவைப்பட்டால், ரிடாக்ட் செய்யப்பட்ட கோப்பை PDF OCR வழியாக இயக்கவும்; கருப்பு மார்க்குகள் கருப்பாகவே இருக்கும்." + "ஆம். நீங்கள் மறைக்காத உரை ஒவ்வொரு பக்கப் படத்தின் மேலும் கண்ணுக்குத் தெரியாத ஓர் அடுக்காக மீண்டும் சேர்க்கப்படும், எனவே அதைத் தேடலாம், தேர்ந்தெடுக்கலாம், காப்பி செய்யலாம். மார்க்கின் கீழ் உள்ள உரை சேர்க்கப்படாது; கருப்புப் பெட்டியின் கீழ் ஏற்கெனவே மறைந்துள்ள சொற்கள் போல பக்கத்தில் தெரியாத உரையும் சேர்க்கப்படாது. படம் மட்டுமே உள்ள கோப்புக்கு “மீதமுள்ள உரையைத் தேடக்கூடியதாக வைத்திருங்கள்” என்பதன் டிக்கை நீக்கவும்." ], [ "Fizzdoc இலவசமா?", diff --git a/src/i18n/te.json b/src/i18n/te.json index 64cba2d..9a7d9f2 100644 --- a/src/i18n/te.json +++ b/src/i18n/te.json @@ -123,6 +123,7 @@ "ws.lookColor": "రంగు", "ws.lookGray": "బ్లాక్ అండ్ వైట్", "ws.lookScanned": "స్కాన్డ్ (గ్రే, కొద్దిగా వంపు)", + "ws.keepText": "మిగిలిన టెక్స్ట్‌ను వెతకగలిగేలా ఉంచండి", "ws.wmText": "వాటర్‌మార్క్ టెక్స్ట్", "ws.wmDefault": "CONFIDENTIAL", "ws.opacity": "అపారదర్శకత", @@ -231,7 +232,7 @@ "rd.personalFound": "గుర్తించిన వ్యక్తిగత వివరాలు: {n}. సేవ్ చేసే ముందు ప్రతిదీ చెక్ చేయండి.", "rd.personalNone": "ఈమెయిల్, ఫోన్, ID లేదా కార్డ్ నంబర్ ఏదీ దొరకలేదు. పేర్లు, చిరునామాలను పైన వెతకండి.", "rd.remove": "ఈ మార్క్‌ను తీసివేయండి", - "rd.hint": "దేన్నైనా కప్పడానికి పేజీపై డ్రాగ్ చేయండి: టెక్స్ట్, సంతకం, ఫోటో. సేవ్ చేసినప్పుడు ప్రతి పేజీ ఒక ఇమేజ్‌గా మారుతుంది, కాబట్టి మీరు కప్పింది శాశ్వతంగా పోతుంది.", + "rd.hint": "దేన్నైనా కప్పడానికి పేజీపై డ్రాగ్ చేయండి: టెక్స్ట్, సంతకం, ఫోటో. సేవ్ చేసినప్పుడు ప్రతి పేజీ ఒక ఇమేజ్‌గా మారుతుంది, కాబట్టి మీరు కప్పింది శాశ్వతంగా పోతుంది. మీరు కప్పని టెక్స్ట్ వెతకగలిగేలా ఉంటుంది.", "footer.madeBy": "డిజైన్ చేసి నిర్మించినది", "footer.feedback": "బగ్ నివేదించండి లేదా టూల్ సూచించండి", "footer.compare": "తెలిసిన టూల్స్‌కి ప్రత్యామ్నాయాలు", @@ -749,7 +750,7 @@ "title": "PDF రిడాక్ట్ చేయండి ఉచితం — సమాచారం దాచండి | Fizzdoc", "description": "PDFలో పేర్లు, నంబర్లు, సంతకాలు లేదా ఫోటోలను నల్లగా చేసి, అవి నిజంగా పోయిన కాపీని సేవ్ చేయండి. ఇది మీ బ్రౌజర్‌లో నడుస్తుంది; ఏమీ అప్‌లోడ్ అవ్వదు. ఉచితం.", "h1": "PDF రిడాక్ట్ చేయండి: దేన్నైనా శాశ్వతంగా నల్లగా చేయండి", - "lede": "మాయం చేయాల్సినదానిపై డ్రాగ్ చేయండి, లేదా ఒక పేరు లేదా నంబర్‌ను వెతికి ప్రతి మ్యాచ్‌ను మార్క్ చేయండి. సేవ్ చేసినప్పుడు ప్రతి పేజీ ఒక ఇమేజ్‌గా మారుతుంది, కాబట్టి దాచిన టెక్స్ట్‌ను కాపీ చేయడం లేదా తిరిగి పొందడం సాధ్యం కాదు.", + "lede": "మాయం చేయాల్సినదానిపై డ్రాగ్ చేయండి, లేదా ఒక పేరు లేదా నంబర్‌ను వెతికి ప్రతి మ్యాచ్‌ను మార్క్ చేయండి. సేవ్ చేసినప్పుడు ప్రతి పేజీ ఒక ఇమేజ్‌గా మారుతుంది, కాబట్టి దాచిన టెక్స్ట్‌ను కాపీ చేయడం లేదా తిరిగి పొందడం సాధ్యం కాదు, మిగిలినది వెతకగలిగేలా ఉంటుంది.", "steps": [ "ఒక PDF ఫైల్ జోడించండి.", "ఒక ప్రాంతాన్ని కప్పడానికి పేజీపై డ్రాగ్ చేయండి, లేదా ఒక పదాన్ని టైప్ చేసి “అన్నీ మార్క్ చేయండి” క్లిక్ చేయండి.", @@ -762,11 +763,11 @@ ], [ "రిడాక్ట్ చేసిన టెక్స్ట్ నిజంగా పోతుందా?", - "అవును. Fizzdoc ప్రతి పేజీని మీ నల్ల మార్కులతో సహా ఒక ఇమేజ్‌గా మళ్లీ గీసి, ఆ ఇమేజ్‌ల నుండి కొత్త PDFని తయారు చేస్తుంది. అసలు టెక్స్ట్, ఫాంట్‌లు మరియు డాక్యుమెంట్ మెటాడేటా కాపీ చేయబడవు, కాబట్టి మార్క్ కింద ఉన్నదాన్ని సెలెక్ట్ చేయడం, వెతకడం లేదా తిరిగి పొందడం సాధ్యం కాదు." + "అవును. Fizzdoc ప్రతి పేజీని మీ నల్ల మార్కులతో సహా ఒక ఇమేజ్‌గా మళ్లీ గీసి, ఆ ఇమేజ్‌ల నుండి కొత్త PDFని తయారు చేస్తుంది. అసలు ఫాంట్‌లు మరియు డాక్యుమెంట్ మెటాడేటా కాపీ చేయబడవు, మార్క్ కింద ఉన్న టెక్స్ట్ ఎప్పుడూ తిరిగి చేర్చబడదు, కాబట్టి దాన్ని సెలెక్ట్ చేయడం, వెతకడం లేదా తిరిగి పొందడం సాధ్యం కాదు." ], [ "మిగతా టెక్స్ట్‌ను నేను వెతకగలనా లేదా కాపీ చేయగలనా?", - "లేదు. ప్రతి పేజీ ఒక ఇమేజ్‌గా మారుతుంది, కాబట్టి సేవ్ చేసిన ఫైల్‌లో సెలెక్ట్ చేయగల టెక్స్ట్ ఉండదు. మళ్లీ వెతకగల టెక్స్ట్ కావాలంటే, రిడాక్ట్ చేసిన ఫైల్‌ను PDF OCR ద్వారా నడపండి; నల్ల మార్కులు నల్లగానే ఉంటాయి." + "అవును. మీరు కప్పని టెక్స్ట్ ప్రతి పేజీ ఇమేజ్ పైన కనిపించని లేయర్‌గా తిరిగి చేర్చబడుతుంది, కాబట్టి మీరు దాన్ని వెతకవచ్చు, సెలెక్ట్ చేయవచ్చు, కాపీ చేయవచ్చు. మార్క్ కింద ఉన్న టెక్స్ట్ చేర్చబడదు, అలాగే నల్ల బాక్స్ కింద ఇప్పటికే దాగి ఉన్న పదాల్లా పేజీలో కనిపించని టెక్స్ట్ కూడా చేర్చబడదు. ఇమేజ్ మాత్రమే ఉన్న ఫైల్ కోసం “మిగిలిన టెక్స్ట్‌ను వెతకగలిగేలా ఉంచండి” టిక్‌ను తీసివేయండి." ], [ "Fizzdoc ఉచితమా?", diff --git a/src/i18n/tr.json b/src/i18n/tr.json index 5d5a9e1..df3b03b 100644 --- a/src/i18n/tr.json +++ b/src/i18n/tr.json @@ -123,6 +123,7 @@ "ws.lookColor": "Renkli", "ws.lookGray": "Siyah beyaz", "ws.lookScanned": "Taranmış (gri, hafif eğik)", + "ws.keepText": "Metnin geri kalanını aranabilir tut", "ws.wmText": "Filigran metni", "ws.wmDefault": "CONFIDENTIAL", "ws.opacity": "Saydamlık", @@ -231,7 +232,7 @@ "rd.personalFound": "İşaretlenen kişisel bilgi: {n}. Kaydetmeden önce her birini kontrol edin.", "rd.personalNone": "E-posta, telefon, kimlik veya kart numarası bulunamadı. Ad ve adresleri yukarıda arayın.", "rd.remove": "Bu işareti kaldır", - "rd.hint": "Bir şeyi örtmek için sayfada sürükleyin: metin, imza, fotoğraf. Kaydettiğinizde her sayfa bir görsele dönüşür, böylece örttüğünüz şey kalıcı olarak kaybolur.", + "rd.hint": "Bir şeyi örtmek için sayfada sürükleyin: metin, imza, fotoğraf. Kaydettiğinizde her sayfa bir görsele dönüşür, böylece örttüğünüz şey kalıcı olarak kaybolur. Örtmediğiniz metin aranabilir kalır.", "footer.madeBy": "Tasarlayan ve geliştiren", "footer.feedback": "Hata bildir veya araç öner", "footer.compare": "Bilinen araçlara alternatifler", @@ -749,7 +750,7 @@ "title": "PDF Karart Ücretsiz — Kalıcı Karartma | Fizzdoc", "description": "Bir PDF'deki adları, numaraları, imzaları veya fotoğrafları karartıp gerçekten kaybolduğu bir kopya kaydedin. Tarayıcıda çalışır; yükleme yok. Ücretsiz.", "h1": "PDF Karart: her şeyi kalıcı olarak karartın", - "lede": "Kaybolması gerekeni sürükleyerek örtün, ya da bir ad veya numara arayıp her eşleşmeyi işaretleyin. Kaydettiğinizde her sayfa bir görsele dönüşür, böylece gizlenen metin kopyalanamaz veya geri getirilemez.", + "lede": "Kaybolması gerekeni sürükleyerek örtün, ya da bir ad veya numara arayıp her eşleşmeyi işaretleyin. Kaydettiğinizde her sayfa bir görsele dönüşür, böylece gizlenen metin kopyalanamaz veya geri getirilemez, geri kalanı ise aranabilir kalır.", "steps": [ "Bir PDF dosyası ekleyin.", "Bir alanı örtmek için sayfada sürükleyin, ya da bir kelime yazıp “Tümünü işaretle”ye tıklayın.", @@ -762,11 +763,11 @@ ], [ "Karartılan metin gerçekten kayboluyor mu?", - "Evet. Fizzdoc her sayfayı, siyah işaretleriniz işlenmiş şekilde bir görsel olarak yeniden çizer ve bu görsellerden yeni bir PDF oluşturur. Orijinal metin, yazı tipleri ve belge meta verileri kopyalanmaz, bu yüzden bir işaretin altındaki hiçbir şey seçilemez, aranamaz veya kurtarılamaz." + "Evet. Fizzdoc her sayfayı, siyah işaretleriniz işlenmiş şekilde bir görsel olarak yeniden çizer ve bu görsellerden yeni bir PDF oluşturur. Orijinal yazı tipleri ve belge meta verileri kopyalanmaz, bir işaretin altındaki metin de asla geri eklenmez, bu yüzden seçilemez, aranamaz veya kurtarılamaz." ], [ "Geri kalan metni hâlâ arayabilir veya kopyalayabilir miyim?", - "Hayır. Her sayfa bir görsele dönüşür, bu yüzden kaydedilen dosyada seçilebilir metin kalmaz. Yeniden aranabilir metne ihtiyacınız olursa, karartılmış dosyayı OCR PDF'ten geçirin; siyah işaretler siyah kalır." + "Evet. Örtmediğiniz metin, her sayfa görselinin üzerine görünmez bir katman olarak geri eklenir; böylece arayabilir, seçebilir ve kopyalayabilirsiniz. İşaretin altındaki metin dışarıda bırakılır, sayfada görünmeyen metin de öyle, örneğin siyah bir kutunun altında zaten gizlenmiş sözcükler. Yalnızca görsel içeren bir dosya için “Metnin geri kalanını aranabilir tut” seçeneğinin işaretini kaldırın." ], [ "Fizzdoc ücretsiz mi?", diff --git a/src/i18n/vi.json b/src/i18n/vi.json index 5713800..d4e50a9 100644 --- a/src/i18n/vi.json +++ b/src/i18n/vi.json @@ -123,6 +123,7 @@ "ws.lookColor": "Có màu", "ws.lookGray": "Đen trắng", "ws.lookScanned": "Dạng scan (xám, hơi nghiêng)", + "ws.keepText": "Giữ phần văn bản còn lại có thể tìm kiếm", "ws.wmText": "Nội dung watermark", "ws.wmDefault": "CONFIDENTIAL", "ws.opacity": "Độ mờ", @@ -231,7 +232,7 @@ "rd.personalFound": "Đã đánh dấu thông tin cá nhân: {n}. Hãy kiểm tra từng mục trước khi lưu.", "rd.personalNone": "Không tìm thấy email, số điện thoại, số giấy tờ hay số thẻ. Hãy tìm tên và địa chỉ ở trên.", "rd.remove": "Xóa vết đánh dấu này", - "rd.hint": "Kéo trên một trang để che bất cứ thứ gì: văn bản, chữ ký, ảnh. Khi lưu, mỗi trang trở thành một hình ảnh, nên phần bạn che sẽ biến mất vĩnh viễn.", + "rd.hint": "Kéo trên một trang để che bất cứ thứ gì: văn bản, chữ ký, ảnh. Khi lưu, mỗi trang trở thành một hình ảnh, nên phần bạn che sẽ biến mất vĩnh viễn. Phần văn bản bạn không che vẫn có thể tìm kiếm.", "footer.madeBy": "Thiết kế và phát triển bởi", "footer.feedback": "Báo lỗi hoặc đề xuất công cụ", "footer.compare": "Lựa chọn thay thế cho công cụ quen thuộc", @@ -749,7 +750,7 @@ "title": "Che Đen PDF Miễn Phí — Xóa Vĩnh Viễn | Fizzdoc", "description": "Che đen tên, số, chữ ký hoặc ảnh trong PDF và lưu một bản mà chúng thực sự biến mất. Chạy trong trình duyệt của bạn; không tải lên. Miễn phí.", "h1": "Che đen PDF: xóa vĩnh viễn bất cứ thứ gì", - "lede": "Kéo lên phần cần biến mất, hoặc tìm một tên hay số rồi đánh dấu mọi kết quả khớp. Khi lưu, mỗi trang trở thành một hình ảnh, nên văn bản bị che không thể sao chép hay khôi phục.", + "lede": "Kéo lên phần cần biến mất, hoặc tìm một tên hay số rồi đánh dấu mọi kết quả khớp. Khi lưu, mỗi trang trở thành một hình ảnh, nên văn bản bị che không thể sao chép hay khôi phục, trong khi phần còn lại vẫn có thể tìm kiếm.", "steps": [ "Thêm một tệp PDF.", "Kéo trên trang để che một vùng, hoặc gõ một từ rồi bấm “Đánh dấu tất cả”.", @@ -762,11 +763,11 @@ ], [ "Văn bản bị che đen có thực sự biến mất không?", - "Có. Fizzdoc vẽ lại mỗi trang thành một hình ảnh với các vết đen đã được in cố định vào, rồi tạo một PDF mới từ những hình ảnh đó. Văn bản, phông chữ và metadata gốc không được sao chép, nên không thể chọn, tìm kiếm hay khôi phục bất cứ thứ gì bên dưới vết che." + "Có. Fizzdoc vẽ lại mỗi trang thành một hình ảnh với các vết đen đã được in cố định vào, rồi tạo một PDF mới từ những hình ảnh đó. Phông chữ và metadata gốc không được sao chép, và văn bản bên dưới vết che không bao giờ được thêm lại, nên không thể chọn, tìm kiếm hay khôi phục." ], [ "Tôi có còn tìm kiếm hoặc sao chép được phần văn bản còn lại không?", - "Không. Mỗi trang trở thành một hình ảnh, nên tệp đã lưu không còn văn bản có thể chọn được. Nếu cần văn bản có thể tìm kiếm lại, hãy chạy tệp đã che đen qua OCR PDF; các vết đen sẽ vẫn giữ nguyên màu đen." + "Có. Phần văn bản bạn không che được thêm lại dưới dạng một lớp vô hình phủ lên hình ảnh của mỗi trang, nên bạn có thể tìm kiếm, chọn và sao chép. Văn bản bên dưới vết che bị loại ra, cả văn bản không hiển thị trên trang, như những chữ đã bị ẩn dưới một khung đen. Với tệp chỉ có hình ảnh, hãy bỏ chọn “Giữ phần văn bản còn lại có thể tìm kiếm”." ], [ "Fizzdoc có miễn phí không?", diff --git a/src/seo.ts b/src/seo.ts index d31a7aa..c37dfb2 100644 --- a/src/seo.ts +++ b/src/seo.ts @@ -241,7 +241,9 @@ function optionsHtml(c: Copy, tool: Tool) { const quality = (value: number) => range(c.t('ws.quality'), 'quality', value, 10, 100); if (tool.op === 'redact-pdf' || tool.op === 'scan-pdf') return ` - `; + ${ + tool.op === 'redact-pdf' ? `\n ` : '' + }`; if (tool.op === 'mermaid-image') return ` diff --git a/src/site.ts b/src/site.ts index 6b423a1..3bc7209 100644 --- a/src/site.ts +++ b/src/site.ts @@ -680,7 +680,7 @@ TOOLS.push( description: 'Black out names, numbers, signatures or photos in a PDF and save a copy where they are really gone. Runs in your browser; nothing is uploaded. Free.', h1: 'Redact a PDF: black out anything, for good', - lede: 'Drag over what should disappear, or search for a name or number and mark every match. When you save, each page becomes an image, so the hidden text can’t be copied or recovered.', + lede: 'Drag over what should disappear, or search for a name or number and mark every match. When you save, each page becomes an image, so the hidden text can’t be copied or recovered, while the rest stays searchable.', steps: [ 'Add one PDF file.', 'Drag on a page to cover an area, or type a word and click “Mark all”.', @@ -690,11 +690,11 @@ TOOLS.push( PRIVACY_FAQ[0], [ 'Is the redacted text really gone?', - 'Yes. Fizzdoc redraws every page as an image with your black marks burned in and builds a new PDF from those images. The original text, fonts and document metadata are not copied, so nothing under a mark can be selected, searched or recovered.', + 'Yes. Fizzdoc redraws every page as an image with your black marks burned in and builds a new PDF from those images. The original fonts and document metadata are not copied, and text under a mark is never added back, so it can’t be selected, searched or recovered.', ], [ 'Can I still search or copy the rest of the text?', - 'No. Every page becomes an image, so the saved file has no selectable text. If you need searchable text again, run the redacted file through OCR PDF; the black marks stay black.', + 'Yes. The text you didn’t cover is added back as an invisible layer over each page image, so you can search, select and copy it. Text under a mark is left out, and so is text that doesn’t show on the page, such as words already hidden under a black box. For an image-only file, untick “Keep the rest of the text searchable”.', ], PRIVACY_FAQ[1], ], diff --git a/tests/app.e2e.ts b/tests/app.e2e.ts index 9eabdb1..4cf9c51 100644 --- a/tests/app.e2e.ts +++ b/tests/app.e2e.ts @@ -327,7 +327,12 @@ test('redacts marked areas for good and turns PDFs into scanned PDFs', async ({ await expect(page.locator('#status')).toContainText('2 pages'); const redacted = await downloadBytes(page); expect(redacted.name).toBe('rich-text-redacted.pdf'); - expect(await pdfText(redacted.bytes)).toEqual(['', '']); + // The text outside the marks stays searchable; the marked heading is gone. + const [first, second] = await pdfText(redacted.bytes); + expect(first).toContain('Annual Report'); + expect(first).toContain('Second paragraph here after a gap.'); + expect(first).not.toMatch(/section one/i); + expect(second).toBe('Page two content.'); await page.goto('/pdf-to-scanned-pdf/'); await page.locator('#file-input').setInputFiles(fixture('rich-text')); @@ -341,6 +346,35 @@ test('redacts marked areas for good and turns PDFs into scanned PDFs', async ({ expect(seen.requests.filter((r) => !r.url.startsWith(page.url().split('/').slice(0, 3).join('/')))).toEqual([]); }); +test('keeps only the text that shows outside the marks, or none when asked', async ({ page }) => { + const { StandardFonts, rgb } = await import('pdf-lib'); + const doc = await PDFDocument.create(); + const font = await doc.embedFont(StandardFonts.Helvetica); + const sheet = doc.addPage([595, 842]); + sheet.drawText('Invoice for Asha Verma', { x: 50, y: 780, size: 18, font }); + sheet.drawText('Card 4111 1111 1111 1111', { x: 50, y: 740, size: 18, font }); + // An old "redaction" that only covers the words, and text in white on white: neither shows on the page. + sheet.drawText('Salary 98,000', { x: 50, y: 700, size: 18, font }); + sheet.drawRectangle({ x: 45, y: 694, width: 200, height: 26, color: rgb(0, 0, 0) }); + sheet.drawText('Invisible note', { x: 50, y: 660, size: 18, font, color: rgb(1, 1, 1) }); + sheet.drawText('X', { x: 50, y: 620, size: 18, font, color: rgb(1, 1, 1) }); + sheet.drawText('Paid by cheque 556677', { x: 50, y: 580, size: 18, font }); + sheet.drawRectangle({ x: 115, y: 574, width: 200, height: 26, color: rgb(0, 0, 0) }); + const file = { name: 'invoice.pdf', mimeType: 'application/pdf', buffer: Buffer.from(await doc.save()) }; + + await page.goto('/redact-pdf/'); + await page.locator('#file-input').setInputFiles(file); + await page.getByRole('button', { name: 'Find personal info' }).click(); + await expect(page.locator('.redact-count')).toHaveText('Personal details marked: 1. Check each one before saving.'); + await page.getByRole('button', { name: 'Save redacted PDF' }).click(); + const [text] = await pdfText((await downloadBytes(page)).bytes); + expect(text).toBe('Invoice for Asha Verma'); + + await page.getByLabel('Keep the rest of the text searchable').uncheck(); + await page.getByRole('button', { name: 'Save redacted PDF' }).click(); + expect(await pdfText((await downloadBytes(page)).bytes)).toEqual(['']); +}); + test('finds and marks personal details in one click, and leaves amounts and dates alone', async ({ page }) => { const { StandardFonts } = await import('pdf-lib'); const doc = await PDFDocument.create();