جستجو و جایگزینی متن در ارائههای PowerPoint با JavaScript
مرور کلی
Aspose.Slides برای Node.js از طریق Java میتواند متن را در یک قاب متن منفرد یا در کل ارائه جستجو، هایلایت و جایگزین کند. هر عملیات میتواند با استفاده از یک کالبک نتیجه، برنامه را از هر تطابق آگاه سازد. این امکان را میدهد تا یک ارائه بروزرسانی شود و همزمان یک ردپای حسابرسی شامل متن مطابقت یافته، زمینه آن، موقعیت، قاب متن و شماره اسلاید ساخته شود.
این قابلیتها برای بازبینی، حذف اطلاعات حساس، بررسی اصطلاحات، پاکسازی قالب و جریانهای کاری گزارشگیری خودکار مفید هستند.
در مثالهای اولیه زیر، از فایلی به نام «sample.pptx» استفاده میکنیم که یک جعبه متن روی اسلاید اول دارد و متن زیر را شامل میشود:

انتخاب دامنه جستجو
از متدهای موجود در TextFrame برای محدود کردن یک عملیات به یک قاب متن استفاده کنید. از متدهای موجود در Presentation برای پردازش تمام متنهای قابل اعمال در ارائه بهره ببرید.
| عملیات | یک قاب متن | کل ارائه |
|---|---|---|
| هایلایت متن عینی | TextFrame.highlightText | Presentation.highlightText |
| هایلایت تطابقهای عبارت منظم | TextFrame.highlightRegex | Presentation.highlightRegex |
| جایگزینی متن عینی | TextFrame.replaceText | Presentation.replaceText |
| جایگزینی تطابقهای عبارت منظم | TextFrame.replaceRegex | Presentation.replaceRegex |
پیکربندی مطابقت متن
برای عملیات متن عینی، از TextSearchOptions برای کنترل مطابقت استفاده کنید:
- TextSearchOptions.setWholeWordsOnly فقط تطابقهای کامل کلمات را میپذیرد.
- TextSearchOptions.setCaseSensitive تعیین میکند که تشخیص حروف بزرگ/کوچک الزامی باشد یا نه.
- TextSearchOptions.setIncludeNotes یادداشتهای اسلاید را در جستجو، جایگزینی و هایلایت سطح ارائه شامل میشود.
عملیات مبتنی بر عبارت منظم از یک Pattern جاوا استفاده میکند، بنابراین قواعد مطابقت مانند حساسیت به حروف و مرزهای کلمه توسط خود عبارت و پرچمهای آن تعریف میشود.
جمعآوری اطلاعات مطابقت با کالبک
یک پراکسی جاوا برای کالبک نتیجه ایجاد کنید تا برای هر تطابق یک اعلان دریافت کنید. تابع پراکسی قاب متن مربوطه، متن منبع، متن مطابقت یافته و موقعیت مطابقت را دریافت میکند.
کالبک مستقیماً شماره اسلاید را دریافت نمیکند. پیادهسازی زیر آن را از طریق TextFrame.getSlide، Slide.getSlideNumber و NotesSlide.getParentSlide استخراج میکند. همچنین متن موجود در یادداشتهای اسلاید را مدیریت میکند.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
function getSlideNumber(textFrame) {
const parentSlide = textFrame.getSlide();
if (java.instanceOf(parentSlide, "com.aspose.slides.Slide")) {
return parentSlide.getSlideNumber();
}
if (java.instanceOf(parentSlide, "com.aspose.slides.NotesSlide")) {
return parentSlide.getParentSlide().getSlideNumber();
}
return null;
}
function createTextSearchCallback(results) {
return java.newProxy("com.aspose.slides.IFindResultCallback", {
foundResult: function(textFrame, sourceText, foundText, textPosition) {
results.push({
textFrame: textFrame,
sourceText: sourceText,
foundText: foundText,
textPosition: textPosition,
slideNumber: getSlideNumber(textFrame)
});
}
});
}
برای عملیات جایگزینی، foundText شامل متن اصلی مطابقت یافته است، بنابراین کالبک میتواند دقیقاً ثبت کند که کدام عبارات جایگزین شدهاند.
هایلایت متن
از متد TextFrame.highlightText برای هایلایت تطابقهای متن عینی در یک قاب متن استفاده کنید. برای کنترل جستجو، یک شیء TextSearchOptions را پاس دهید.
کد مثال زیر تمام رخدادهای کاراکترهای “try” را هایلایت میکند و سپس تنها کلمه کامل “to” را هایلایت مینماید.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("sample.pptx");
try {
const slide = presentation.getSlides().get_Item(0);
const shape = slide.getShapes().get_Item(0);
const substringSearchOptions = new aspose.slides.TextSearchOptions();
substringSearchOptions.setCaseSensitive(false);
const substringHighlightColor = java.getStaticFieldValue("java.awt.Color", "LIGHT_GRAY");
// در هر رخداد "try" در قاب متن را هایلایت کنید.
shape.getTextFrame().highlightText(
"try", substringHighlightColor, substringSearchOptions, null);
const wholeWordSearchOptions = new aspose.slides.TextSearchOptions();
wholeWordSearchOptions.setWholeWordsOnly(true);
wholeWordSearchOptions.setCaseSensitive(false);
const wholeWordHighlightColor = java.getStaticFieldValue("java.awt.Color", "MAGENTA");
// فقط کلمه کامل "to" را هایلایت کنید.
shape.getTextFrame().highlightText(
"to", wholeWordHighlightColor, wholeWordSearchOptions, null);
presentation.save("highlighted_text.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
نتیجه:

هایلایت متن با استفاده از عبارات منظم
متد TextFrame.highlightRegex متنهای مطابقت یافته توسط یک عبارت منظم را در یک قاب متن هایلایت میکند.
کد زیر تمام کلماتی که شامل هفت یا بیش تر کاراکتر هستند را هایلایت میکند:
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const Pattern = java.import("java.util.regex.Pattern");
const presentation = new aspose.slides.Presentation("sample.pptx");
try {
const slide = presentation.getSlides().get_Item(0);
const shape = slide.getShapes().get_Item(0);
const regex = Pattern.compile("\\b[^\\s]{7,}\\b");
const highlightColor = java.getStaticFieldValue("java.awt.Color", "YELLOW");
shape.getTextFrame().highlightRegex(regex, highlightColor, null);
presentation.save(
"highlighted_text_using_regex.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
نتیجه:

هایلایت متن در سراسر یک ارائه
از متدهای Presentation.highlightText و Presentation.highlightRegex برای جستجو در تمام قابهای متن قابل اعمال در یک ارائه استفاده کنید. مثال زیر یک عبارت عینی و تمام آدرسهای ایمیل را هایلایت میکند:
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const Pattern = java.import("java.util.regex.Pattern");
const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
const searchOptions = new aspose.slides.TextSearchOptions();
searchOptions.setWholeWordsOnly(true);
searchOptions.setCaseSensitive(false);
const termHighlightColor = java.getStaticFieldValue("java.awt.Color", "ORANGE");
presentation.highlightText(
"confidential", termHighlightColor, searchOptions, null);
const emailRegex = Pattern.compile(
"\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b",
Pattern.CASE_INSENSITIVE);
const emailHighlightColor = java.getStaticFieldValue("java.awt.Color", "YELLOW");
presentation.highlightRegex(emailRegex, emailHighlightColor, null);
presentation.save("highlighted_presentation.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
جایگزینی متن در یک قاب متن
از TextFrame.replaceText برای متن عینی و از TextFrame.replaceRegex برای جایگزینی مبتنی بر الگو استفاده کنید. این متدها متن مطابقت یافته را درون قاب متن موجود بهروز میکنند و قالببندی بخشهای اطراف را حفظ میسازند، بهجای بازسازی کامل قاب متن از یک رشته ساده.
مثال زیر یک نوع نوشتار متفاوت را استانداردسازی میکند و سپس برچسبهای نسخه را جایگزین مینماید:
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const Pattern = java.import("java.util.regex.Pattern");
const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
const slide = presentation.getSlides().get_Item(0);
const shape = slide.getShapes().get_Item(0);
const searchOptions = new aspose.slides.TextSearchOptions();
searchOptions.setWholeWordsOnly(true);
searchOptions.setCaseSensitive(false);
shape.getTextFrame().replaceText(
"colour", "color", searchOptions, null);
const versionRegex = Pattern.compile(
"\\bv\\d+(?:\\.\\d+)*\\b", Pattern.CASE_INSENSITIVE);
shape.getTextFrame().replaceRegex(versionRegex, "current version", null);
presentation.save("updated_text_frame.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
اگر یک تطابق شامل بخشهایی با قالببندی متفاوت باشد، خروجی را بررسی کنید تا مطمئن شوید کدام قالب باید بر متن جایگزین اعمال شود.
جایگزینی متن در سراسر یک ارائه
از Presentation.replaceText و Presentation.replaceRegex برای اعمال همان عملیات در تمام ارائه استفاده کنید. این روش برای پاکسازی قالب، بهروزرسانی اصطلاحات و حذف اطلاعات حساس مفید است.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const Pattern = java.import("java.util.regex.Pattern");
const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
const searchOptions = new aspose.slides.TextSearchOptions();
searchOptions.setWholeWordsOnly(true);
searchOptions.setCaseSensitive(true);
presentation.replaceText(
"Contoso", "Example Corp", searchOptions, null);
const accountNumberRegex = Pattern.compile("\\bACCT-\\d{6}\\b");
presentation.replaceRegex(accountNumberRegex, "ACCT-REDACTED", null);
presentation.save("updated_presentation.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
گروهبندی تطابقها برای گزارشگیری
از آنجا که هر نتیجه جمعآوریشده شماره اسلاید و قاب متن خود را ذخیره میکند، برنامهها میتوانند تطابقها را برای حسابرسی، گزارشگیری یا جریانهای کاری بازبینی گروهبندی کنند. مثال زیر نتایج را ابتدا بر اساس اسلاید و سپس بر اساس قاب متن گروهبندی میکند:
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
function getSlideNumber(textFrame) {
const parentSlide = textFrame.getSlide();
if (java.instanceOf(parentSlide, "com.aspose.slides.Slide")) {
return parentSlide.getSlideNumber();
}
if (java.instanceOf(parentSlide, "com.aspose.slides.NotesSlide")) {
return parentSlide.getParentSlide().getSlideNumber();
}
return null;
}
const results = [];
const callback = java.newProxy("com.aspose.slides.IFindResultCallback", {
foundResult: function(textFrame, sourceText, foundText, textPosition) {
results.push({
textFrame: textFrame,
sourceText: sourceText,
foundText: foundText,
textPosition: textPosition,
slideNumber: getSlideNumber(textFrame)
});
}
});
const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
const searchOptions = new aspose.slides.TextSearchOptions();
searchOptions.setCaseSensitive(false);
const highlightColor = java.getStaticFieldValue("java.awt.Color", "YELLOW");
presentation.highlightText(
"confidential", highlightColor, searchOptions, callback);
const matchesBySlide = new Map();
for (const result of results) {
const slideLabel = result.slideNumber === null ? "Other" : result.slideNumber;
if (!matchesBySlide.has(slideLabel)) {
matchesBySlide.set(slideLabel, new Map());
}
const matchesByTextFrame = matchesBySlide.get(slideLabel);
if (!matchesByTextFrame.has(result.textFrame)) {
matchesByTextFrame.set(result.textFrame, []);
}
matchesByTextFrame.get(result.textFrame).push(result);
}
for (const [slideLabel, matchesByTextFrame] of matchesBySlide) {
console.log("Slide: " + slideLabel);
for (const [textFrame, textFrameMatches] of matchesByTextFrame) {
console.log(" Text frame: " + textFrame.getText());
for (const result of textFrameMatches) {
console.log(
" '" + result.foundText + "' at position " +
result.textPosition + "; context: '" + result.sourceText + "'");
}
}
}
} finally {
presentation.dispose();
}
سؤال و جواب
چگونه میتوانم فقط یک جعبه متن را بهجای کل ارائه جستجو کنم؟
قاب متن شکل را دریافت کنید و روی آن TextFrame.highlightText، TextFrame.highlightRegex، TextFrame.replaceText یا TextFrame.replaceRegex را فراخوانی کنید. متدهای سطح ارائه تمام قابهای متن قابل اعمال را پردازش میکنند.
چگونه میتوانم کلمات کامل را با حروف بزرگ/کوچک صحیح مطابقت دهم؟
TextSearchOptions.setWholeWordsOnly و TextSearchOptions.setCaseSensitive را به true تنظیم کنید و گزینهها را به متدهای هایلایت یا جایگزینی متن عینی پاس دهید. برای عبارات منظم، مرزهای کلمه و حساسیت به حروف را در خود Pattern جاوا تعریف کنید.
آیا جستجو و جایگزینی میتواند متن یادداشتهای اسلاید را شامل شود؟
بله. هنگام استفاده از یک عملیات متن عینی در سطح ارائه، TextSearchOptions.setIncludeNotes را به true تنظیم کنید. پیادهسازی کالبک نشاندادهشده در بالا یک مطابقت در اسلاید یادداشت را به شماره اسلاید والد خود نگاشته میکند.
چگونه میتوانم گزارشگیری کنم بدون اینکه ارائه را بار دوم اسکن کنم؟
یک پراکسی کالبک نتیجه جاوا را به عملیات هایلایت یا جایگزینی پاس دهید. کالبک در حین اجرا هر تطابق را دریافت میکند، بنابراین برنامه میتواند متن منبع، متن مطابقت یافته، موقعیت، قاب متن و شماره اسلاید استخراجشده را برای گروهبندی یا صادر کردن بعدی ذخیره کند.
آیا جایگزینی متن قالببندی آن را حفظ میکند؟
TextFrame.replaceText و TextFrame.replaceRegex متن مطابقت یافته را درون قاب متن موجود اصلاح میکند و قالببندی بخشهای اطراف را نگه میدارد. اگر یک مطابقت شامل بخشهای مختلف با قالببندی متفاوت باشد، نتیجه را بررسی کنید تا اطمینان حاصل کنید که جایگزینی از سبک دلخواه استفاده میکند.