From a629a29c0e93e662d114e1b2c30b7fe85af47dcd Mon Sep 17 00:00:00 2001 From: Muhammad Adil Date: Sun, 28 Dec 2025 01:25:05 +0000 Subject: [PATCH] Add 2 html net tutorials MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Categories: advanced-features, generate-jpg-and-png-images Source: AI Search API Tutorials: - Create memory stream c# – Custom stream creation guide - How to Enable Antialiasing When Converting DOCX to PNG/JPG Auto-generated by Professionalize.Tutorials Agent --- html/arabic/net/advanced-features/_index.md | 4 +- .../_index.md | 265 ++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 261 ++++++++++++++++ html/chinese/net/advanced-features/_index.md | 4 +- .../_index.md | 259 ++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 274 +++++++++++++++++ html/czech/net/advanced-features/_index.md | 5 +- .../_index.md | 280 +++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 276 +++++++++++++++++ html/dutch/net/advanced-features/_index.md | 4 +- .../_index.md | 280 +++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 261 ++++++++++++++++ html/english/net/advanced-features/_index.md | 5 +- .../_index.md | 278 +++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 276 +++++++++++++++++ html/french/net/advanced-features/_index.md | 4 +- .../_index.md | 280 +++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 278 +++++++++++++++++ html/german/net/advanced-features/_index.md | 6 +- .../_index.md | 267 ++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 278 +++++++++++++++++ html/greek/net/advanced-features/_index.md | 4 +- .../_index.md | 266 ++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 6 +- .../_index.md | 261 ++++++++++++++++ html/hindi/net/advanced-features/_index.md | 4 +- .../_index.md | 268 ++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 277 +++++++++++++++++ html/hongkong/net/advanced-features/_index.md | 4 +- .../_index.md | 276 +++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 275 +++++++++++++++++ .../hungarian/net/advanced-features/_index.md | 7 +- .../_index.md | 270 ++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 262 ++++++++++++++++ .../net/advanced-features/_index.md | 4 +- .../_index.md | 265 ++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 277 +++++++++++++++++ html/italian/net/advanced-features/_index.md | 5 +- .../_index.md | 280 +++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 278 +++++++++++++++++ html/japanese/net/advanced-features/_index.md | 4 +- .../_index.md | 281 +++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 259 ++++++++++++++++ html/korean/net/advanced-features/_index.md | 5 +- .../_index.md | 290 ++++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 276 +++++++++++++++++ html/polish/net/advanced-features/_index.md | 4 +- .../_index.md | 280 +++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 278 +++++++++++++++++ .../net/advanced-features/_index.md | 4 +- .../_index.md | 280 +++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 277 +++++++++++++++++ html/russian/net/advanced-features/_index.md | 5 +- .../_index.md | 270 ++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 277 +++++++++++++++++ html/spanish/net/advanced-features/_index.md | 4 +- .../_index.md | 266 ++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 277 +++++++++++++++++ html/swedish/net/advanced-features/_index.md | 4 +- .../_index.md | 280 +++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 277 +++++++++++++++++ html/thai/net/advanced-features/_index.md | 4 +- .../_index.md | 267 ++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 6 +- .../_index.md | 276 +++++++++++++++++ html/turkish/net/advanced-features/_index.md | 5 +- .../_index.md | 280 +++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 277 +++++++++++++++++ .../net/advanced-features/_index.md | 5 +- .../_index.md | 279 +++++++++++++++++ .../net/generate-jpg-and-png-images/_index.md | 4 +- .../_index.md | 277 +++++++++++++++++ 92 files changed, 12734 insertions(+), 58 deletions(-) create mode 100644 html/arabic/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/arabic/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/chinese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/chinese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/czech/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/czech/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/dutch/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/dutch/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/english/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/english/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/french/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/french/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/german/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/german/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/greek/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/greek/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/hindi/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/hindi/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/hongkong/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/hongkong/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/hungarian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/hungarian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/indonesian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/indonesian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/italian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/italian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/japanese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/japanese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/korean/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/korean/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/polish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/polish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/portuguese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/portuguese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/russian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/russian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/spanish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/spanish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/swedish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/swedish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/thai/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/thai/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/turkish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/turkish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md create mode 100644 html/vietnamese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md create mode 100644 html/vietnamese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md diff --git a/html/arabic/net/advanced-features/_index.md b/html/arabic/net/advanced-features/_index.md index d08bb33fd..fce9f8b13 100644 --- a/html/arabic/net/advanced-features/_index.md +++ b/html/arabic/net/advanced-features/_index.md @@ -32,6 +32,8 @@ Aspose.HTML for .NET هي أداة قوية تتيح للمطورين العمل تعرف على كيفية استخدام Aspose.HTML لـ .NET للتعامل مع مستندات HTML بكفاءة. برنامج تعليمي خطوة بخطوة للمطورين. ### [مزود تدفق الذاكرة في .NET مع Aspose.HTML](./memory-stream-provider/) تعرف على كيفية إنشاء مستندات HTML مذهلة في .NET باستخدام Aspose.HTML. اتبع البرنامج التعليمي خطوة بخطوة واكتشف قوة معالجة HTML. +### [إنشاء تدفق الذاكرة c# – دليل إنشاء تدفق مخصص](./create-memory-stream-c-custom-stream-creation-guide/) +تعلم كيفية إنشاء تدفق ذاكرة مخصص في C# باستخدام Aspose.HTML لمعالجة مستندات HTML بفعالية. ### [استخراج البيانات من الويب في .NET باستخدام Aspose.HTML](./web-scraping/) تعلم كيفية التعامل مع مستندات HTML في .NET باستخدام Aspose.HTML. يمكنك التنقل بين العناصر وتصفيتها والاستعلام عنها وتحديدها بفعالية لتحسين تطوير الويب. ### [استخدام خاصية المحتوى الممتد في .NET مع Aspose.HTML](./use-extended-content-property/) @@ -52,4 +54,4 @@ Aspose.HTML for .NET هي أداة قوية تتيح للمطورين العمل {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/arabic/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/arabic/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..cff8cdfd1 --- /dev/null +++ b/html/arabic/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,265 @@ +--- +category: general +date: 2025-12-27 +description: إنشاء تدفق الذاكرة في C# بسرعة مع دليل خطوة بخطوة. تعلم كيفية إنشاء التدفق، + التعامل مع الموارد، وتنفيذ إنشاء تدفق مخصص في .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: ar +og_description: إنشاء تدفق الذاكرة في C# في ثوانٍ. يوضح هذا الدرس كيفية إنشاء التدفق، + وإدارة الموارد، وبناء إنشاء تدفق مخصص باستخدام واجهات برمجة التطبيقات الحديثة في + .NET. +og_title: إنشاء تدفق الذاكرة C# – دليل شامل لإنشاء تدفق مخصص +tags: +- stream +- csharp +- .net +- resource-handling +title: إنشاء تدفق الذاكرة C# – دليل إنشاء تدفق مخصص +url: /ar/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# إنشاء تدفق الذاكرة c# – دليل إنشاء تدفق مخصص + +هل احتجت يومًا إلى **إنشاء تدفق الذاكرة c#** لكنك لم تكن متأكدًا أي واجهة برمجة تطبيقات تختار؟ لست وحدك. في العديد من المشاريع القديمة ستجد `IOutputStorage`، بينما تفضّل القواعد الحديثة `ResourceHandler`. على أي حال، الهدف هو نفسه: إنتاج `Stream` يمكن لإطار عملك استهلاكه. + +في هذا الدرس ستتعلم **كيفية إنشاء تدفق**، **كيفية التعامل مع الموارد** بأمان، وإتقان **إنشاء تدفق مخصص** لكل من الإصدارات قبل 24.2 وما بعد 24.2 من المكتبة. في النهاية ستحصل على مثال عملي يمكنك إدراجه في أي حل .NET—بدون مراجع غامضة، فقط C# نقي. + +## ما ستحصل عليه + +- مقارنة واضحة بين نمط `IOutputStorage` القديم ونهج `ResourceHandler` الحديث. +- كود كامل جاهز للنسخ واللصق يتجميع على .NET 6+ (أو أقدم إذا احتجت). +- نصائح للحالات الخاصة مثل تحرير التدفقات، التعامل مع أحمال كبيرة، واختبار التدفق المخصص الخاص بك. + +> **نصيحة احترافية:** إذا كنت تستهدف .NET 8، فإن `ResourceHandler` الأحدث يمنحك دعمًا مدمجًا للـ async، مما يمكن أن يقلل من المليثانية في سيناريوهات الأداء العالي. + +--- + +## إنشاء تدفق الذاكرة c# – النهج القديم (قبل 24.2) + +عندما تكون عالقًا في نسخة قديمة من المكتبة، العقد الذي يجب أن تفي به هو `IOutputStorage`. الواجهة تطلب فقط طريقة تُعيد `Stream` لاسم مورد معين. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### لماذا هذا يعمل + +- **عقد الواجهة** – سيستدعي الإطار `CreateStream` كلما احتاج إلى كتابة مخرجات. +- **المرونة** – لأنك تُعيد `Stream`، يمكنك استبدال `MemoryStream` بـ `FileStream` أو حتى تدفق مؤقت مخصص لاحقًا دون تعديل باقي الكود. +- **أمان الموارد** – المتصل مسؤول عن تحرير (`Dispose`) التدفق المُرجع، وهذا هو السبب في عدم استدعائنا لـ `Dispose` داخل الطريقة. + +### الأخطاء الشائعة + +| المشكلة | ما يحدث | الحل | +|-------|--------------|-----| +| إرجاع تدفق مغلق | سيتلقى المستهلكون استثناء `ObjectDisposedException` عند الكتابة. | تأكد من أن التدفق **مفتوح** عند تسليمه. | +| نسيان ضبط `Position = 0` بعد الكتابة | تظهر البيانات فارغة عند القراءة لاحقًا. | استدعِ `stream.Seek(0, SeekOrigin.Begin)` قبل الإرجاع إذا قمت بملء التدفق مسبقًا. | +| استخدام `MemoryStream` كبير للملفات الضخمة | تسبب في تعطل بسبب نفاد الذاكرة. | تحول إلى `FileStream` مؤقت أو تدفق مؤقت مخصص. | + +## إنشاء تدفق الذاكرة c# – النهج الحديث (24.2+) + +بدءًا من الإصدار 24.2 قدمت المكتبة `ResourceHandler`. بدلاً من واجهة، الآن ترث من فئة أساسية وتُعيد تعريف طريقة واحدة. هذا يمنحك نقطة دخول أنظف ومتوافقة مع الـ async. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### لماذا تفضيل `ResourceHandler` + +- **دعم الـ async** – تسمح طريقة `HandleResourceAsync` لك بأداء عمليات I/O دون حجب الخيوط. +- **معالجة الأخطاء المدمجة** – الفئة الأساسية تلتقط الاستثناءات وتحولها إلى رموز خطأ خاصة بالإطار. +- **مستقبلية** – الإصدارات الأحدث تضيف نقاط ربط (مثل التسجيل، القياس) التي تعمل فقط مع نمط المعالج. + +### معالجة الحالات الخاصة + +1. **تحرير الموارد** – الإطار يحرّر التدفق بعد الانتهاء، ولكن إذا قمت بلف مورد قابل للتحرير آخر (مثل `FileStream`) يجب أن تنفذ كتلة `using` داخل الطريقة وتُعيد غلافًا يمرّر `Dispose`. +2. **حجم البيانات الكبير** – إذا توقعت أحمالًا > 100 ميغابايت، استبدل `MemoryStream` بـ `FileStream` يشير إلى ملف مؤقت. مثال: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **الاختبار** – اختبر معالجك وحدةً عن طريق حقن `IServiceProvider` مزيف إذا كانت الفئة الأساسية تستخرج الخدمات من DI. تحقق من أن `HandleResource` تُعيد تدفقًا يمكن الكتابة إليه والقراءة منه. + +## كيفية إنشاء تدفق – ورقة غش سريعة + +| السيناريو | واجهة برمجة التطبيقات الموصى بها | كود مثال | +|----------|----------------|-------------| +| بيانات بسيطة في الذاكرة | `MemoryStream` | `new MemoryStream()` | +| ملفات مؤقتة كبيرة | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| مصدر شبكي | `NetworkStream` | `new NetworkStream(socket)` | +| تخزين مؤقت مخصص | Derive from `Stream` | See [Microsoft docs] for custom stream implementation | + +**ملاحظة:** دائمًا اضبط `stream.Position = 0` قبل الإرجاع إذا قمت بملء التدفق مسبقًا؛ وإلا سيعتقد القارئ اللاحق أن التدفق فارغ. + +## توضيح الصورة + +![مخطط يوضح عملية إنشاء تدفق الذاكرة c#](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* مخطط يوضح عملية إنشاء تدفق الذاكرة c# + +## مثال كامل قابل للتنفيذ + +فيما يلي تطبيق كونسول بسيط يوضح كل من النهجين القديم والحديث. يمكنك نسخه ولصقه في مشروع كونسول .NET 6 جديد وتشغيله كما هو. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**المخرجات المتوقعة** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +يعرض البرنامج ثلاث طرق لـ **كيفية إنشاء تدفق**: `IOutputStorage` القديم، `HandleResource` المتزامن الجديد، و `HandleResourceAsync` غير المتزامن. جميعها تُعيد `MemoryStream`، مما يثبت أن إنشاء تدفق مخصص يعمل بغض النظر عن الإصدار المستهدف. + +## الأسئلة المتكررة (FAQ) + +**س: هل يجب علي استدعاء `Dispose` على التدفق الذي أحصل عليه؟** +ج: الإطار (أو الكود المستدعي) هو المسؤول عن تحريره. إذا قمت بلف مورد قابل للتحرير آخر داخل التدفق المُرجع، تأكد من أنه يمرّر استدعاء `Dispose`. + +**س: هل يمكنني إرجاع تدفق للقراءة فقط؟** +ج: نعم، لكن العقد عادةً يتوقع تدفقًا قابلًا للكتابة. إذا كنت تحتاج فقط للقراءة، نفّذ `CanWrite => false` ووثّق القيد. + +**س: ماذا لو كان بياناتي أكبر من الذاكرة المتاحة؟** +ج: تحول إلى `FileStream` مدعوم بملف مؤقت، أو نفّذ تدفقًا مؤقتًا مخصصًا يكتب إلى القرص على شكل قطع. + +**س: هل هناك فرق في الأداء بين النهجين؟** +ج: `ResourceHandler` الحديث يضيف حملاً بسيطًا بسبب منطق الفئة الأساسية الإضافية، لكن النسخة غير المتزامنة يمكن أن تحسّن بشكل كبير من معدل النقل تحت مستويات عالية من التزامن. + +## الخلاصة + +لقد غطينا للتو **إنشاء تدفق الذاكرة c#** من كل زاوية قد تصادفها في الواقع. الآن تعرف **كيفية إنشاء تدفق** باستخدام نمط `IOutputStorage` القديم وفئة `ResourceHandler` الحديثة، بالإضافة إلى أنك رأيت نصائح عملية لـ **كيفية التعامل مع الموارد** بمسؤولية وتوسيع النمط باستخدام **إنشاء تدفق مخصص** للملفات الكبيرة أو السيناريوهات غير المتزامنة. Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/arabic/net/generate-jpg-and-png-images/_index.md b/html/arabic/net/generate-jpg-and-png-images/_index.md index d8a721f3d..3f0b59f8e 100644 --- a/html/arabic/net/generate-jpg-and-png-images/_index.md +++ b/html/arabic/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Aspose.HTML for .NET هي مكتبة قوية تتيح للمطورين إنشا تعرف على كيفية إنشاء صفحات ويب ديناميكية باستخدام Aspose.HTML لـ .NET. يغطي هذا البرنامج التعليمي خطوة بخطوة المتطلبات الأساسية ومساحات الأسماء وعرض HTML للصور. ### [إنشاء صور PNG بواسطة ImageDevice في .NET باستخدام Aspose.HTML](./generate-png-images-by-imagedevice/) تعلم كيفية استخدام Aspose.HTML لـ .NET لمعالجة مستندات HTML وتحويل HTML إلى صور والمزيد. برنامج تعليمي خطوة بخطوة مع الأسئلة الشائعة. +### [كيفية تمكين مضاد التعرج عند تحويل DOCX إلى PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +تعلم كيفية تمكين مضاد التعرج عند تحويل ملفات DOCX إلى صور PNG أو JPG باستخدام Aspose.HTML. ## خاتمة @@ -52,4 +54,4 @@ Aspose.HTML for .NET هي مكتبة قوية تتيح للمطورين إنشا {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/arabic/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/arabic/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..c9e2ee322 --- /dev/null +++ b/html/arabic/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,261 @@ +--- +category: general +date: 2025-12-27 +description: تعلم كيفية تمكين تقنية التنعيم (antialiasing) أثناء تحويل ملفات DOCX + إلى PNG أو JPG. يغطي هذا الدليل خطوة بخطوة أيضًا تحويل DOCX إلى PNG وتحويل DOCX + إلى JPG. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: ar +og_description: كيفية تمكين التنعيم أثناء تحويل ملفات DOCX إلى PNG أو JPG. اتبع هذا + الدليل الكامل للحصول على مخرجات سلسة وعالية الجودة. +og_title: كيفية تمكين التنعيم عند تحويل DOCX إلى PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: كيفية تمكين التنعيم عند تحويل DOCX إلى PNG/JPG +url: /ar/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# كيفية تمكين التنعيم عند تحويل DOCX إلى PNG/JPG + +هل تساءلت يومًا **how to enable antialiasing** لتظهر صور DOCX المحولة حادة بدلاً من المتعرجة؟ لست وحدك. يواجه العديد من المطورين صعوبة عندما يحتاجون إلى تحويل مستند Word إلى PNG أو JPG وينتهي بهم الأمر بحواف غير واضحة للخطوط والنص. الخبر السار؟ ببضع أسطر من C# يمكنك تحويل هذه النتيجة الخام إلى رسومات دقيقة بالبكسل — دون الحاجة إلى محررات صور من طرف ثالث. + +في هذا الدرس سنستعرض العملية الكاملة لـ **convert docx to png** و **convert docx to jpg** باستخدام مكتبة عرض حديثة. ستتعلم ليس فقط *how to convert docx* بل أيضًا *how to render docx* مع تمكين التنعيم (antialiasing) والتلميح (hinting)، بحيث يبدو كل منحنى وحرف ناعمًا. لا تحتاج إلى خبرة سابقة في برمجة الرسومات؛ فقط إعداد أساسي لـ C# وملف DOCX ترغب في تحويله إلى صورة. + +--- + +## ما ستحتاجه + +- **.NET 6+** (أو .NET Framework 4.6+ إذا كنت تفضل بيئة التشغيل الكلاسيكية) +- ملف **DOCX** ترغب في عرضه (ضعه في مجلد اسمه `input` للتجربة) +- حزمة **Aspose.Words for .NET** من NuGet (أو أي مكتبة تعرض `Document` و `ImageRenderingOptions` و `ImageDevice`). قم بتثبيتها باستخدام: + +```bash +dotnet add package Aspose.Words +``` + +هذا كل شيء — لا حاجة لأدوات معالجة صور إضافية. + +## الخطوة 1: تحميل مستند DOCX (how to convert docx) + +أولاً نحتاج إلى كائن `Document` يمثل الملف المصدر. فكر فيه كنسخة رقمية من ملف Word يمكن للمكتبة قراءتها ومعالجتها. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **لماذا هذا مهم:** تحميل المستند هو الأساس لـ *how to render docx*. إذا تعذر قراءة الملف، لن تعمل أي من الخطوات اللاحقة، لذا نبدأ من هنا. + +## الخطوة 2: تكوين خيارات عرض الصورة (enable antialiasing) + +الآن يأتي الجزء السحري — تفعيل التنعيم (antialiasing) والتلميح (hinting). التنعيم يجعل الحواف المتعرجة على الخطوط القطرية أكثر سلاسة، بينما يحسن التلميح وضوح النص الصغير. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **نصيحة احترافية:** إذا احتجت إلى تحسين الأداء في مستندات ضخمة، يمكنك إيقاف `UseAntialiasing`، لكن جودة الصورة ستنخفض بشكل ملحوظ. + +## الخطوة 3: اختيار تنسيق الإخراج — PNG أو JPG (convert docx to png / convert docx to jpg) + +تحدد فئة `ImageDevice` أين تذهب الصفحات المرسومة. من خلال تبديل `ImageSaveOptions` يمكنك إخراج إما PNG (بدون فقدان) أو JPG (مضغوط). أدناه ننشئ جهازين منفصلين حتى يمكنك إنشاء كلا التنسيقين في تشغيل واحد. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **لماذا كلاهما؟** PNG يحافظ على كل بكسل، وهو مثالي عندما تحتاج إلى دقة مطابقة (مثل الطباعة). أما JPG فيضغط الصورة، مما يجعل تحميلها أسرع على موقع ويب. + +## الخطوة 4: عرض صفحات المستند كصور (how to render docx) + +مع تجهيز الأجهزة، نخبر `Document` بعرض كل صفحة. ستقوم المكتبة تلقائيًا بالتكرار عبر جميع الصفحات وحفظها باستخدام نمط التسمية الذي حددناه. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +بعد تشغيل الكود، ستجد مجموعة من الملفات مثل `page_0.png`، `page_1.png`، … و `page_0.jpg`، `page_1.jpg` داخل مجلد `output`. كل صورة ستحصل على التنعيم المطبق، لذا ستكون الخطوط ناعمة والنص واضح كالكريستال. + +## الخطوة 5: التحقق من النتيجة (expected output) + +افتح أيًا من الصور المولدة. يجب أن ترى: + +- **منحنيات ناعمة** على الأشكال والرسوم البيانية (بدون آثار السلم). +- **نص حاد وقابل للقراءة** حتى بأحجام خطوط صغيرة، بفضل التلميح. +- **ألوان متسقة** بين PNG و JPG (على الرغم من أن JPG قد يظهر بعض عيوب الضغط إذا خفضت الجودة). + +إذا لاحظت أي تشويش، تأكد من أن `UseAntialiasing` مضبوط على `true` وأن ملف DOCX المصدر لا يحتوي على صور نقطية منخفضة الدقة. + +## أسئلة شائعة وحالات خاصة + +### ماذا لو كنت أحتاج فقط إلى صفحة واحدة؟ + +يمكنك عرض صفحة محددة باستخدام نسخة `PageInfo` المتجاوزة: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### هل يمكنني تغيير DPI (النقاط في البوصة) للحصول على إخراج عالي الدقة؟ + +بالطبع. عدل الخاصية `Resolution` في `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +ارتفاع DPI يعني ملفات أكبر، لكن تأثير التنعيم يصبح أكثر وضوحًا. + +### كيف أتعامل مع ملفات DOCX الكبيرة دون نفاد الذاكرة؟ + +اعرض الصفحات واحدةً تلو الأخرى وتخلص من الجهاز بعد كل تكرار: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### هل من الممكن التحويل إلى صيغ أخرى مثل BMP أو TIFF؟ + +نعم — فقط استبدل `SaveFormat.Png` أو `SaveFormat.Jpeg` بـ `SaveFormat.Bmp` أو `SaveFormat.Tiff`. ستنتقل إعدادات التنعيم نفسها. + +## مثال كامل جاهز للتنفيذ (نسخ‑لصق) + +فيما يلي البرنامج الكامل الذي يمكنك وضعه في مشروع وحدة تحكم جديد. يتضمن جميع عبارات using، ومعالجة الأخطاء، وتعليقات للتوضيح. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **النتيجة:** بعد التجميع (`dotnet run`) سترى سلسلة من ملفات PNG و JPG في دليل `output`، كل منها مع تطبيق التنعيم. + +## الخلاصة + +لقد غطينا **how to enable antialiasing** عندما **convert DOCX to PNG أو JPG**، استعرضنا الخطوات الدقيقة لـ **convert docx to png**، **convert docx to jpg**، وحتى تطرقنا إلى **how to render docx** لتخصيص + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/chinese/net/advanced-features/_index.md b/html/chinese/net/advanced-features/_index.md index e6346cf70..10c38f878 100644 --- a/html/chinese/net/advanced-features/_index.md +++ b/html/chinese/net/advanced-features/_index.md @@ -32,6 +32,8 @@ Aspose.HTML for .NET 是一款功能强大的工具,允许开发人员以编 了解如何使用 Aspose.HTML for .NET 高效地操作 HTML 文档。面向开发人员的分步教程。 ### [使用 Aspose.HTML 在 .NET 中使用内存流提供程序](./memory-stream-provider/) 了解如何使用 Aspose.HTML 在 .NET 中创建出色的 HTML 文档。按照我们的分步教程,解锁 HTML 操作的强大功能。 +### [在 C# 中创建内存流 – 自定义流创建指南](./create-memory-stream-c-custom-stream-creation-guide/) +了解如何在 C# 中使用 Aspose.HTML 创建自定义内存流,以便高效处理 HTML 内容。 ### [使用 Aspose.HTML 在 .NET 中进行 Web 抓取](./web-scraping/) 学习使用 Aspose.HTML 在 .NET 中操作 HTML 文档。有效地导航、过滤、查询和选择元素,以增强 Web 开发。 ### [在 .NET 中通过 Aspose.HTML 使用扩展内容属性](./use-extended-content-property/) @@ -52,4 +54,4 @@ Aspose.HTML for .NET 为在 .NET 应用程序中处理 HTML 文档打开了一 {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/chinese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/chinese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..ee8d8860b --- /dev/null +++ b/html/chinese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,259 @@ +--- +category: general +date: 2025-12-27 +description: 快速创建 C# 内存流的分步指南。学习如何创建流、处理资源以及在 .NET 中实现自定义流的创建。 +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: zh +og_description: 在几秒钟内创建 C# 内存流。本教程展示了如何创建流、处理资源,以及使用现代 .NET API 构建自定义流。 +og_title: 创建内存流 C# – 完整自定义流指南 +tags: +- stream +- csharp +- .net +- resource-handling +title: 创建内存流 C# – 自定义流创建指南 +url: /zh/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 创建内存流 c# – 自定义流创建指南 + +是否曾经需要**create memory stream c#**但不确定该选择哪个 API?你并不是唯一遇到这种情况的人。在许多旧项目中,你会看到 `IOutputStorage`,而较新的代码库更倾向于使用 `ResourceHandler`。无论哪种方式,目标都是相同的:生成一个你的框架可以使用的 `Stream`。 + +在本教程中,你将学习**how to create stream**对象,**how to handle resources**的安全处理,并掌握针对库的 pre‑24.2 和 24.2+ 版本的**custom stream creation**。完成后,你将拥有一个可直接放入任何 .NET 解决方案的可运行示例——无需神秘引用,纯粹的 C#。 + +## 你将收获的内容 + +- 对传统 `IOutputStorage` 模式与现代 `ResourceHandler` 方法进行清晰对比。 +- 完整的、可直接复制粘贴的代码,能够在 .NET 6+(或更早版本,如有需要)上编译。 +- 针对边缘情况的技巧,如释放流、处理大容量负载以及测试自定义流。 + +> **专业提示:**如果你针对 .NET 8,更新的 `ResourceHandler` 提供内置的异步支持,可在高吞吐场景中节省毫秒级时间。 + +## 创建内存流 c# – 传统方法(pre‑24.2) + +当你被迫使用库的旧版本时,需要满足的契约是 `IOutputStorage`。该接口仅要求提供一个方法,返回给定资源名称对应的 `Stream`。 + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### 为什么这样可行 + +- **接口契约** – 框架在需要写入输出时会调用 `CreateStream`。 +- **灵活性** – 因为返回的是 `Stream`,你可以在以后将 `MemoryStream` 替换为 `FileStream`,甚至自定义缓冲流,而无需修改其他代码。 +- **资源安全** – 调用方负责释放返回的流,这也是我们在方法内部不调用 `Dispose` 的原因。 + +### 常见陷阱 + +| 问题 | 会发生什么 | 解决方案 | +|------|------------|----------| +| 返回已关闭的流 | 消费者在写入时会收到 `ObjectDisposedException`。 | 确保在交付时流是**打开**的。 | +| 写入后忘记设置 `Position = 0` | 随后读取时数据为空。 | 如果预先填充数据,在返回前调用 `stream.Seek(0, SeekOrigin.Begin)`。 | +| 对大文件使用巨大的 `MemoryStream` | 导致内存不足崩溃。 | 改用临时 `FileStream` 或自定义缓冲流。 | + +## 创建内存流 c# – 现代方法(24.2+) + +从 24.2 版本开始,库引入了 `ResourceHandler`。不再使用接口,而是继承自基类并重写单个方法。这为你提供了更简洁、支持异步的入口点。 + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### 为什么更倾向于 `ResourceHandler` + +- **异步支持** – `HandleResourceAsync` 方法让你在不阻塞线程的情况下执行 I/O。 +- **内置错误处理** – 基类捕获异常并将其转换为框架特定的错误码。 +- **面向未来** – 新版本会添加仅在处理器模式下可用的钩子(例如日志、遥测)。 + +### 边缘情况处理 + +1. **释放** – 框架在完成后会释放流,但如果你包装了其他可释放对象(如 `FileStream`),应在方法内部使用 `using` 块,并返回一个转发 `Dispose` 的包装器。 +2. **大负载** – 如果预计负载超过 100 MB,建议用指向临时文件的 `FileStream` 替代 `MemoryStream`。示例: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` +3. **测试** – 如果基类从 DI 中获取服务,可通过注入模拟的 `IServiceProvider` 对处理器进行单元测试。验证 `HandleResource` 返回的流既可写入也可读取。 + +## 如何创建流 – 快速速查表 + +| 场景 | 推荐 API | 示例代码 | +|------|----------|----------| +| 简单的内存数据 | `MemoryStream` | `new MemoryStream()` | +| 大型临时文件 | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| 基于网络的来源 | `NetworkStream` | `new NetworkStream(socket)` | +| 自定义缓冲 | Derive from `Stream` | 请参阅 [Microsoft docs] 了解自定义流实现 | + +> **注意:**如果预先填充流,请在返回前始终设置 `stream.Position = 0`;否则下游读取器会认为流为空。 + +## 图片说明 + +![显示创建内存流 c# 过程的图示](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* 显示创建内存流 c# 过程的图示 + +## 完整可运行示例 + +下面是一个最小的控制台应用程序,演示传统和现代两种方法。你可以将其复制粘贴到新的 .NET 6 控制台项目中直接运行。 + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**预期输出** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +该程序展示了三种**how to create stream**方式:旧的 `IOutputStorage`、新的同步 `HandleResource`,以及异步的 `HandleResourceAsync`。这三者都返回 `MemoryStream`,证明自定义流创建在任何目标版本下都能工作。 + +## 常见问题 (FAQ) + +**Q: 我需要对返回的流调用 `Dispose` 吗?** +A: 框架(或你的调用代码)负责释放。如果在返回的流中包装了其他可释放对象,请确保它传播 `Dispose` 调用。 + +**Q: 我可以返回只读流吗?** +A: 可以,但契约通常期望可写流。如果只需要读取,请实现 `CanWrite => false` 并在文档中说明限制。 + +**Q: 如果我的数据大于可用内存怎么办?** +A: 改用基于临时文件的 `FileStream`,或实现将数据分块写入磁盘的自定义缓冲流。 + +**Q: 两种方法之间是否存在性能差异?** +A: 现代的 `ResourceHandler` 因额外的基类逻辑会有轻微开销,但异步版本在高并发下可以显著提升吞吐量。 + +## 总结 + +我们已经从各个可能遇到的角度完整讲解了**create memory stream c#**。现在你了解了使用传统 `IOutputStorage` 模式和新版 `ResourceHandler` 类的**how to create stream**方法,并掌握了负责任地**how to handle resources**的实用技巧,以及针对大文件或异步场景的**custom stream creation**扩展方式。Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/chinese/net/generate-jpg-and-png-images/_index.md b/html/chinese/net/generate-jpg-and-png-images/_index.md index 50385b887..38a9d04a0 100644 --- a/html/chinese/net/generate-jpg-and-png-images/_index.md +++ b/html/chinese/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Aspose.HTML for .NET 提供了一种将 HTML 转换为图像的简单方法。 了解如何使用 Aspose.HTML for .NET 创建动态网页。本分步教程涵盖先决条件、命名空间以及将 HTML 渲染为图像。 ### [使用 Aspose.HTML 在 .NET 中通过 ImageDevice 生成 PNG 图像](./generate-png-images-by-imagedevice/) 学习使用 Aspose.HTML for .NET 来操作 HTML 文档、将 HTML 转换为图像等。分步教程,包含常见问题解答。 +### [如何在将 DOCX 转换为 PNG/JPG 时启用抗锯齿](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +了解如何在使用 Aspose.HTML for .NET 将 DOCX 文档转换为 PNG 或 JPG 图像时启用抗锯齿,以提升图像质量。 ## 结论 @@ -52,4 +54,4 @@ Aspose.HTML for .NET 提供了一种将 HTML 转换为图像的简单方法。 {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/chinese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/chinese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..0dee9ce5e --- /dev/null +++ b/html/chinese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,274 @@ +--- +category: general +date: 2025-12-27 +description: 了解在将 DOCX 转换为 PNG 或 JPG 时如何启用抗锯齿。此分步指南还涵盖将 docx 转换为 png 和将 docx 转换为 jpg。 +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: zh +og_description: 如何在将 DOCX 文件转换为 PNG 或 JPG 时启用抗锯齿。请遵循本完整指南,以获得平滑、高质量的输出。 +og_title: 如何在将 DOCX 转换为 PNG/JPG 时启用抗锯齿 +tags: +- C# +- Document Rendering +- Image Processing +title: 将 DOCX 转换为 PNG/JPG 时如何启用抗锯齿 +url: /zh/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何在将 DOCX 转换为 PNG/JPG 时启用抗锯齿 + +是否曾经想过 **如何启用抗锯齿**,以便转换后的 DOCX 图像看起来清晰而不是锯齿状?你并不孤单。许多开发者在需要将 Word 文档转换为 PNG 或 JPG 时会遇到困难,导致线条和文字出现模糊的边缘。好消息是?只需几行 C# 代码,就能将粗糙的输出转变为像素完美的图形——无需第三方图像编辑器。 + +在本教程中,我们将使用现代渲染库完整演示 **convert docx to png** 和 **convert docx to jpg** 的整个过程。你不仅会学习 *how to convert docx*,还会学习在启用抗锯齿和 hinting 的情况下 *how to render docx*,使每条曲线和每个字符都平滑。无需图形编程经验;只需一个基本的 C# 环境和一个想要转换为图像的 DOCX 文件。 + +--- + +## 所需条件 + +- **.NET 6+**(如果你更喜欢经典运行时,也可以使用 .NET Framework 4.6+) +- 你想要渲染的 **DOCX** 文件(在演示中放在名为 `input` 的文件夹中) +- **Aspose.Words for .NET** NuGet 包(或任何提供 `Document`、`ImageRenderingOptions` 和 `ImageDevice` 的库)。使用以下方式安装: + +```bash +dotnet add package Aspose.Words +``` + +就这样——无需额外的图像处理工具。 + +--- + +## 步骤 1:加载 DOCX 文档(how to convert docx) + +首先我们需要一个表示源文件的 `Document` 对象。可以把它看作是库可以读取和操作的 Word 文件的数字版本。 + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **为什么重要:** 加载文档是 *how to render docx* 的基础。如果文件无法读取,后续步骤都无法进行,所以我们从这里开始。 + +--- + +## 步骤 2:配置图像渲染选项(enable antialiasing) + +现在进入神奇的部分——开启抗锯齿和 hinting。抗锯齿可以平滑对角线等通常出现的锯齿边缘,而 hinting 则提升小文字的清晰度。 + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **专业提示:** 如果在处理超大文档时需要提升性能,可以关闭 `UseAntialiasing`,但视觉质量会明显下降。 + +--- + +## 步骤 3:选择输出格式 – PNG 或 JPG(convert docx to png / convert docx to jpg) + +`ImageDevice` 类决定渲染页面的输出位置。通过切换 `ImageSaveOptions`,可以输出 PNG(无损)或 JPG(压缩)。下面我们创建两个独立的设备,以便在一次运行中生成两种格式。 + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **为什么两者都要?** PNG 保留每个像素,适合需要精确保真度的场景(例如打印)。而 JPG 则对图像进行压缩,使其在网站上加载更快。 + +--- + +## 步骤 4:将文档页面渲染为图像(how to render docx) + +设备准备好后,我们让 `Document` 渲染每一页。库会自动遍历所有页面,并使用我们定义的命名模式保存。 + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +运行代码后,你会在 `output` 文件夹中看到一系列文件,如 `page_0.png`、`page_1.png` …以及 `page_0.jpg`、`page_1.jpg`。每张图像都已应用抗锯齿,线条平滑,文字清晰如晶体。 + +--- + +## 步骤 5:验证结果(expected output) + +打开任意生成的图像。你应该看到: + +- **平滑的曲线** 在形状和图表上(无阶梯状伪影)。 +- **清晰可读的文字** 即使在小字号时也清晰,这归功于 hinting。 +- **颜色一致** 在 PNG 和 JPG 之间(不过如果降低质量,JPG 可能会出现轻微的压缩伪影)。 + +如果发现任何模糊,请再次确认 `UseAntialiasing` 已设置为 `true`,并且你的源 DOCX 不包含低分辨率的光栅图像。 + +--- + +## 常见问题与边缘情况 + +### 如果只需要单页怎么办? + +可以使用 `PageInfo` 重载来渲染特定页面: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### 我可以更改 DPI(每英寸点数)以获得更高分辨率的输出吗? + +当然可以。调整 `ImageRenderingOptions` 上的 `Resolution` 属性: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +更高的 DPI 会导致文件更大,但抗锯齿效果会更加明显。 + +### 如何在不耗尽内存的情况下处理大型 DOCX 文件? + +逐页渲染,并在每次迭代后释放设备: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### 是否可以转换为其他格式,如 BMP 或 TIFF? + +可以——只需将 `SaveFormat.Png` 或 `SaveFormat.Jpeg` 替换为 `SaveFormat.Bmp` 或 `SaveFormat.Tiff`。相同的抗锯齿设置会被保留。 + +--- + +## 完整工作示例(可直接复制粘贴) + +下面是完整的程序代码,你可以直接放入新的控制台项目中。它包含所有 using 语句、错误处理以及清晰的注释。 + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **结果:** 编译后(`dotnet run`),你会在 `output` 目录中看到一系列 PNG 和 JPG 文件,每个文件都已应用抗锯齿。 + +--- + +## 结论 + +我们已经介绍了在 **convert DOCX to PNG or JPG** 时 **how to enable antialiasing** 的方法,详细演示了 **convert docx to png**、**convert docx to jpg** 的具体步骤,并且还涉及了 **how to render docx** 的自定义用法。 + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/czech/net/advanced-features/_index.md b/html/czech/net/advanced-features/_index.md index 33235b1b3..1e2f853df 100644 --- a/html/czech/net/advanced-features/_index.md +++ b/html/czech/net/advanced-features/_index.md @@ -42,7 +42,8 @@ Převeďte HTML do PDF dynamicky pomocí Aspose.HTML pro .NET. Snadná integrace Naučte se převádět HTML do PDF, XPS a obrázků pomocí Aspose.HTML pro .NET. Výukový program krok za krokem s příklady kódu a často kladenými dotazy. ### [Použití šablon HTML v .NET s Aspose.HTML](./using-html-templates/) Naučte se používat Aspose.HTML pro .NET k dynamickému generování HTML dokumentů z dat JSON. Využijte sílu manipulace s HTML ve svých aplikacích .NET. - +### [Vytvořte paměťový stream v C# – Průvodce tvorbou vlastního streamu](./create-memory-stream-c-custom-stream-creation-guide/) +Naučte se, jak vytvořit vlastní paměťový stream v C# pomocí Aspose.HTML a efektivně manipulovat s HTML dokumenty. ## Závěr @@ -52,4 +53,4 @@ Aspose.HTML for .NET otevírá dveře do světa možností, pokud jde o práci s {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/czech/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/czech/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..df8202d8e --- /dev/null +++ b/html/czech/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,280 @@ +--- +category: general +date: 2025-12-27 +description: Vytvořte paměťový stream v C# rychle s podrobným návodem krok za krokem. + Naučte se, jak vytvořit stream, spravovat zdroje a implementovat vlastní tvorbu + streamu v .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: cs +og_description: Vytvořte paměťový stream v C# během několika sekund. Tento tutoriál + ukazuje, jak vytvořit stream, spravovat zdroje a vytvořit vlastní stream pomocí + moderních .NET API. +og_title: Vytvořte paměťový stream v C# – Kompletní průvodce vlastním streamem +tags: +- stream +- csharp +- .net +- resource-handling +title: Vytvoření paměťového streamu v C# – Průvodce tvorbou vlastního streamu +url: /cs/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Vytvoření memory stream v C# – Průvodce tvorbou vlastního streamu + +Už jste někdy potřebovali **vytvořit memory stream v C#**, ale nebyli jste si jisti, kterou API zvolit? Nejste v tom sami. V mnoha starších projektech narazíte na `IOutputStorage`, zatímco novější kódy upřednostňují `ResourceHandler`. Ať už zvolíte jakýkoli přístup, cíl je stejný: vytvořit `Stream`, který váš framework dokáže spotřebovat. + +V tomto tutoriálu se naučíte **jak vytvořit stream** objekty, **jak bezpečně zacházet se zdroji** a ovládnete **tvorbu vlastního streamu** pro verze knihovny před 24.2 i 24.2+. Na konci budete mít funkční příklad, který můžete vložit do libovolného .NET řešení – žádné tajemné reference, jen čistý C#. + +## Co si z toho odnesete + +- Přehledné srovnání starého vzoru `IOutputStorage` a moderního přístupu `ResourceHandler`. +- Kompletní, připravený k kopírování kód, který se kompiluje proti .NET 6+ (nebo starším verzím, pokud je potřebujete). +- Tipy pro okrajové případy, jako je uvolňování streamů, práce s velkými payloady a testování vašeho vlastního streamu. + +> **Pro tip:** Pokud cílíte na .NET 8, novější `ResourceHandler` poskytuje vestavěnou asynchronní podporu, která může ušetřit milisekundy ve scénářích s vysokou propustností. + +--- + +## Vytvoření memory stream v C# – Starý přístup (pre‑24.2) + +Když jste uvězněni na starší verzi knihovny, musíte splnit kontrakt `IOutputStorage`. Rozhraní požaduje pouze metodu, která vrátí `Stream` pro daný název zdroje. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Proč to funguje + +- **Smlouva rozhraní** – Framework zavolá `CreateStream`, kdykoli potřebuje zapisovat výstup. +- **Flexibilita** – Protože vracíte `Stream`, můžete později vyměnit `MemoryStream` za `FileStream` nebo dokonce za vlastní bufferovaný stream, aniž byste museli měnit zbytek kódu. +- **Bezpečnost zdrojů** – Volající je zodpovědný za uvolnění vráceného streamu, proto v metodě nevoláme `Dispose`. + +### Časté úskalí + +| Problém | Co se stane | Oprava | +|---------|-------------|--------| +| Vrácení uzavřeného streamu | Spotřebitelé dostanou `ObjectDisposedException` při zápisu. | Ujistěte se, že stream je **otevřený**, když jej předáváte dál. | +| Zapomenutí nastavit `Position = 0` po zápisu | Data se při následném čtení jeví jako prázdná. | Před návratem zavolejte `stream.Seek(0, SeekOrigin.Begin)`, pokud jste stream předem naplnili. | +| Použití obrovského `MemoryStream` pro velké soubory | Selhání z nedostatku paměti. | Přepněte na dočasný `FileStream` nebo vlastní bufferovaný stream. | + +--- + +## Vytvoření memory stream v C# – Moderní přístup (24.2+) + +Od verze 24.2 knihovna představila `ResourceHandler`. Místo rozhraní nyní dědíte z základní třídy a přepisujete jedinou metodu. To vám poskytuje čistší a asynchronně‑přátelské vstupní místo. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Proč upřednostnit `ResourceHandler` + +- **Asynchronní podpora** – Metoda `HandleResourceAsync` vám umožní provádět I/O bez blokování vláken. +- **Vestavěná obsluha chyb** – Základní třída zachytí výjimky a převede je na chybové kódy specifické pro framework. +- **Budoucnost** – Novější vydání přidávají háčky (např. logování, telemetry), které fungují jen s handlerovým vzorem. + +### Zpracování okrajových případů + +1. **Uvolňování** – Framework uvolní stream po dokončení, ale pokud obalujete další disposable (např. `FileStream`), měli byste uvnitř metody použít `using` blok a vrátit wrapper, který předává `Dispose`. +2. **Velké payloady** – Pokud očekáváte payloady > 100 MB, nahraďte `MemoryStream` `FileStream` ukazujícím na dočasný soubor. Příklad: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testování** – Jednotkové testy vašeho handleru můžete provést injekcí mock `IServiceProvider`, pokud základní třída získává služby z DI. Ověřte, že `HandleResource` vrací stream, do kterého lze zapisovat i číst. + +--- + +## Jak vytvořit stream – Rychlý cheat sheet + +| Scénář | Doporučené API | Ukázkový kód | +|--------|----------------|--------------| +| Jednoduchá data v paměti | `MemoryStream` | `new MemoryStream()` | +| Velké dočasné soubory | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Zdroj založený na síti | `NetworkStream` | `new NetworkStream(socket)` | +| Vlastní bufferování | Dědit z `Stream` | Viz [Microsoft docs] pro implementaci vlastního streamu | + +> **Poznámka:** Vždy nastavte `stream.Position = 0` před návratem, pokud jste stream předem naplnili; jinak čtecí komponenty budou mít dojem, že je stream prázdný. + +--- + +## Ilustrační obrázek + +![Diagram ukazující proces vytvoření memory stream v C#](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* diagram ukazující proces vytvoření memory stream v C# + +--- + +## Kompletní spustitelný příklad + +Níže je minimální konzolová aplikace, která demonstruje oba přístupy – starý i moderní. Stačí ji zkopírovat do nového .NET 6 konzolového projektu a spustit tak, jak je. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Očekávaný výstup** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +Program ukazuje tři způsoby, **jak vytvořit stream**: starý `IOutputStorage`, nový synchronní `HandleResource` a asynchronní `HandleResourceAsync`. Všechny tři vrací `MemoryStream`, což dokazuje, že tvorba vlastního streamu funguje bez ohledu na cílovou verzi. + +--- + +## Často kladené otázky (FAQ) + +**Q: Musím volat `Dispose` na stream, který dostanu zpět?** +A: Framework (nebo váš volající kód) je zodpovědný za uvolnění. Pokud ve vráceném streamu obalujete další disposable, ujistěte se, že propaguje volání `Dispose`. + +**Q: Můžu vrátit jenom read‑only stream?** +A: Ano, ale kontrakt obvykle očekává zapisovatelný stream. Pokud potřebujete jen čtení, implementujte `CanWrite => false` a dokumentujte omezení. + +**Q: Co když jsou moje data větší než dostupná RAM?** +A: Přepněte na `FileStream` založený na dočasném souboru, nebo implementujte vlastní bufferovaný stream, který zapisuje na disk po částech. + +**Q: Existuje rozdíl ve výkonu mezi těmito dvěma přístupy?** +A: Moderní `ResourceHandler` přidává malou režii kvůli logice základní třídy, ale asynchronní verze může dramaticky zlepšit propustnost při vysoké souběžnosti. + +--- + +## Závěr + +Právě jsme probrali **vytvoření memory stream v C#** ze všech úhlů, na které můžete narazit v praxi. Nyní umíte **vytvořit stream** pomocí starého vzoru `IOutputStorage` i novější třídy `ResourceHandler`, a získali jste praktické tipy, jak **bezpečně zacházet se zdroji** a rozšířit vzor o **vlastní tvorbu streamu** pro velké soubory nebo asynchronní scénáře. + +Připraveno pro + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/czech/net/generate-jpg-and-png-images/_index.md b/html/czech/net/generate-jpg-and-png-images/_index.md index 16bb3b494..2a883010f 100644 --- a/html/czech/net/generate-jpg-and-png-images/_index.md +++ b/html/czech/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Integrace Aspose.HTML for .NET do vašich projektů .NET je bezproblémová. Kni Naučte se vytvářet dynamické webové stránky pomocí Aspose.HTML for .NET. Tento výukový program krok za krokem pokrývá předpoklady, jmenné prostory a vykreslování HTML do obrázků. ### [Generujte obrázky PNG pomocí ImageDevice v .NET pomocí Aspose.HTML](./generate-png-images-by-imagedevice/) Naučte se používat Aspose.HTML pro .NET k manipulaci s dokumenty HTML, převodu HTML na obrázky a další. Výukový program krok za krokem s nejčastějšími dotazy. +### [Jak povolit antialiasing při převodu DOCX na PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Naučte se, jak při převodu dokumentů DOCX na PNG nebo JPG povolit antialiasing pro hladší výstup. ## Závěr @@ -52,4 +54,4 @@ Tak proč čekat? Začněte objevovat svět HTML na konverzi obrázků s Aspose. {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/czech/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/czech/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..b58057ae8 --- /dev/null +++ b/html/czech/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,276 @@ +--- +category: general +date: 2025-12-27 +description: Zjistěte, jak povolit antialiasing při převodu DOCX na PNG nebo JPG. + Tento krok‑za‑krokem průvodce také pokrývá převod docx na png a převod docx na jpg. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: cs +og_description: Jak povolit vyhlazování při převodu souborů DOCX na PNG nebo JPG. + Postupujte podle tohoto kompletního návodu pro plynulý, vysoce kvalitní výstup. +og_title: Jak povolit antialiasing při konverzi DOCX na PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: Jak povolit antialiasing při převodu DOCX na PNG/JPG +url: /cs/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak povolit antialiasing při převodu DOCX na PNG/JPG + +Už jste se někdy zamýšleli **jak povolit antialiasing**, aby vaše převedené obrázky DOCX vypadaly ostré místo zubatých? Nejste sami. Mnoho vývojářů narazí na problém, když potřebují převést Word dokument na PNG nebo JPG a skončí s rozmazanými okraji čar a textu. Dobrá zpráva? Několika řádky C# můžete proměnit tento drsný výstup v pixel‑dokonalou grafiku—bez potřeby externích editorů obrázků. + +V tomto tutoriálu projdeme celý proces **convert docx to png** a **convert docx to jpg** pomocí moderní renderovací knihovny. Naučíte se nejen *jak převést docx*, ale také *jak renderovat docx* s povoleným antialiasingem a hintingem, takže každá křivka a znak budou vypadat hladce. Předchozí zkušenosti s grafickým programováním nejsou potřeba; stačí základní nastavení C# a soubor DOCX, který chcete převést na obrázek. + +--- + +## Co budete potřebovat + +- **.NET 6+** (nebo .NET Framework 4.6+, pokud dáváte přednost klasickému runtime) +- **DOCX** soubor, který chcete renderovat (umístěte jej do složky nazvané `input` pro demonstraci) +- NuGet balíček **Aspose.Words for .NET** (nebo jakákoli knihovna, která poskytuje `Document`, `ImageRenderingOptions` a `ImageDevice`). Nainstalujte jej pomocí: + +```bash +dotnet add package Aspose.Words +``` + +A to je vše—žádné další nástroje pro zpracování obrázků nejsou potřeba. + +--- + +## Krok 1: Načtení DOCX dokumentu (how to convert docx) + +Nejprve potřebujeme objekt `Document`, který představuje zdrojový soubor. Představte si ho jako digitální verzi vašeho Word souboru, kterou knihovna může číst a upravovat. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Proč je to důležité:** Načtení dokumentu je základem pro *how to render docx*. Pokud soubor nelze přečíst, žádný z následujících kroků nebude fungovat, takže začínáme zde. + +--- + +## Krok 2: Nastavení možností renderování obrázku (enable antialiasing) + +Nyní přichází magická část—zapnutí antialiasingu a hintingu. Antialiasing vyhlazuje zubaté okraje, které obvykle vidíte na šikmých čarách, zatímco hinting zlepšuje čitelnost malého textu. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Tip:** Pokud někdy potřebujete zvýšit výkon u obrovských dokumentů, můžete vypnout `UseAntialiasing`, ale vizuální kvalita výrazně klesne. + +--- + +## Krok 3: Výběr výstupního formátu – PNG nebo JPG (convert docx to png / convert docx to jpg) + +Třída `ImageDevice` určuje, kam se uloží renderované stránky. Výměnou `ImageSaveOptions` můžete výstup nastavit buď na PNG (bezztrátové) nebo JPG (komprimované). Níže vytvoříme dvě samostatné zařízení, abyste mohli v jednom běhu vygenerovat oba formáty. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Proč oba?** PNG zachovává každý pixel, což je ideální, když potřebujete naprostou věrnost (např. tisk). JPG naopak komprimuje obrázek, což zrychluje načítání na webových stránkách. + +--- + +## Krok 4: Renderování stránek dokumentu do obrázků (how to render docx) + +S připravenými zařízeními řekneme objektu `Document`, aby renderoval každou stránku. Knihovna automaticky projde všechny stránky a uloží je podle definovaného pojmenovacího vzoru. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Po spuštění kódu najdete sérii souborů jako `page_0.png`, `page_1.png`, … a `page_0.jpg`, `page_1.jpg` ve složce `output`. Každý obrázek bude mít aplikovaný antialiasing, takže čáry jsou hladké a text je křišťálově čistý. + +--- + +## Krok 5: Ověření výsledku (expected output) + +Otevřete kterýkoli z vygenerovaných obrázků. Měli byste vidět: + +- **Hladké křivky** na tvarech a grafech (žádné schodovité artefakty). +- **Ostrý, čitelný text** i při malých velikostech písma díky hintingu. +- **Konzistentní barvy** mezi PNG a JPG (i když JPG může ukazovat mírné kompresní artefakty při snížení kvality). + +Pokud zaznamenáte jakékoli rozmazání, zkontrolujte, že `UseAntialiasing` je nastaven na `true` a že váš zdrojový DOCX neobsahuje nízké rozlišení rastrových obrázků. + +--- + +## Časté otázky a okrajové případy + +### Co když potřebuji jen jednu stránku? + +Můžete renderovat konkrétní stránku pomocí přetížení `PageInfo`: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Můžu změnit DPI (dots per inch) pro výstup s vyšším rozlišením? + +Určitě. Upravit vlastnost `Resolution` na `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Vyšší DPI znamená větší soubory, ale efekt antialiasingu se stane ještě výraznějším. + +### Jak zacházet s velkými DOCX soubory, aniž by došlo k nedostatku paměti? + +Renderujte stránky po jedné a po každé iteraci uvolněte zařízení: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### Je možné převést do jiných formátů, jako BMP nebo TIFF? + +Ano—stačí vyměnit `SaveFormat.Png` nebo `SaveFormat.Jpeg` za `SaveFormat.Bmp` nebo `SaveFormat.Tiff`. Stejné nastavení antialiasingu se přenese. + +--- + +## Kompletní funkční příklad (připravený ke kopírování) + +Níže je kompletní program, který můžete vložit do nového konzolového projektu. Obsahuje všechny using direktivy, ošetření chyb a komentáře pro přehlednost. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Výsledek:** Po zkompilování (`dotnet run`) uvidíte sérii PNG a JPG souborů ve složce `output`, každý s aplikovaným antialiasingem. + +--- + +## Závěr + +Probrali jsme **jak povolit antialiasing**, když **převádíte DOCX na PNG nebo JPG**, prošli jsme přesné kroky k **convert docx to png**, **convert docx to jpg**, a dokonce se dotkli **how to render docx** pro vlastní + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/dutch/net/advanced-features/_index.md b/html/dutch/net/advanced-features/_index.md index b830f50eb..cf09760f6 100644 --- a/html/dutch/net/advanced-features/_index.md +++ b/html/dutch/net/advanced-features/_index.md @@ -32,6 +32,8 @@ Leer hoe u met HTML-documenten in .NET werkt met Aspose.HTML voor taken zoals sc Leer hoe u Aspose.HTML voor .NET gebruikt om HTML-documenten efficiënt te manipuleren. Stapsgewijze tutorial voor ontwikkelaars. ### [Geheugenstroomprovider in .NET met Aspose.HTML](./memory-stream-provider/) Leer hoe u verbluffende HTML-documenten in .NET maakt met Aspose.HTML. Volg onze stapsgewijze tutorial en ontgrendel de kracht van HTML-manipulatie. +### [Geheugenstroom maken in C# – Gids voor aangepaste streamcreatie](./create-memory-stream-c-custom-stream-creation-guide/) +Leer hoe u een aangepaste geheugenstroom in C# maakt met Aspose.HTML, inclusief stap‑voor‑stap instructies en voorbeeldcode. ### [Webscraping in .NET met Aspose.HTML](./web-scraping/) Leer HTML-documenten te manipuleren in .NET met Aspose.HTML. Navigeer, filter, query en selecteer elementen effectief voor verbeterde webontwikkeling. ### [Gebruik Extended Content Property in .NET met Aspose.HTML](./use-extended-content-property/) @@ -52,4 +54,4 @@ Aspose.HTML voor .NET opent de deur naar een wereld aan mogelijkheden als het ga {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/dutch/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/dutch/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..ba9cccdb8 --- /dev/null +++ b/html/dutch/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,280 @@ +--- +category: general +date: 2025-12-27 +description: Maak snel een memory stream in C# met een stapsgewijze handleiding. Leer + hoe je een stream maakt, resources beheert en aangepaste streamcreatie implementeert + in .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: nl +og_description: Maak een memory stream in C# in enkele seconden. Deze tutorial laat + zien hoe je een stream maakt, resources beheert en aangepaste streamcreatie bouwt + met moderne .NET‑API’s. +og_title: Maak een geheugenstroom C# – Complete gids voor aangepaste streams +tags: +- stream +- csharp +- .net +- resource-handling +title: Maak MemoryStream c# – Gids voor aangepaste streamcreatie +url: /nl/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Maak geheugenstroom c# – Gids voor aangepaste streamcreatie + +Heb je ooit **create memory stream c#** moeten maken maar wist je niet welke API je moest kiezen? Je bent niet de enige. In veel legacy‑projecten vind je `IOutputStorage`, terwijl nieuwere codebases de voorkeur geven aan `ResourceHandler`. Hoe dan ook, het doel is hetzelfde: een `Stream` produceren die je framework kan gebruiken. + +In deze tutorial leer je **how to create stream** objecten, **how to handle resources** veilig te behandelen, en beheers je **custom stream creation** voor zowel pre‑24.2 als 24.2+ versies van de bibliotheek. Aan het einde heb je een werkend voorbeeld dat je in elke .NET‑oplossing kunt plaatsen—geen mysterieuze referenties, alleen pure C#. + +## Wat je mee krijgt + +- Een duidelijke vergelijking van het legacy `IOutputStorage`‑patroon versus de moderne `ResourceHandler`‑aanpak. +- Complete, copy‑paste‑klare code die compileert tegen .NET 6+ (of eerder, indien nodig). +- Tips voor randgevallen zoals het vrijgeven van streams, het verwerken van grote payloads, en het testen van je aangepaste stream. + +> **Pro tip:** Als je richt op .NET 8, biedt de nieuwere `ResourceHandler` ingebouwde async‑ondersteuning, wat milliseconden kan besparen bij scenario's met hoge doorvoer. + +--- + +## Maak geheugenstroom c# – Legacy‑aanpak (pre‑24.2) + +Wanneer je vastzit op een oudere versie van de bibliotheek, is het contract dat je moet voldoen `IOutputStorage`. De interface vraagt alleen om een methode die een `Stream` retourneert voor een opgegeven resource‑naam. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Waarom dit werkt + +- **Interface contract** – Het framework zal `CreateStream` aanroepen wanneer het output moet schrijven. +- **Flexibility** – Omdat je een `Stream` retourneert, kun je later `MemoryStream` vervangen door `FileStream` of zelfs een aangepaste gebufferde stream zonder de rest van de code aan te passen. +- **Resource safety** – De aanroeper is verantwoordelijk voor het vrijgeven van de geretourneerde stream, daarom roepen we `Dispose` niet aan binnen de methode. + +### Veelvoorkomende valkuilen + +| Probleem | Wat gebeurt er | Oplossing | +|----------|----------------|-----------| +| Een gesloten stream retourneren | Consumenten krijgen `ObjectDisposedException` bij schrijven. | Zorg ervoor dat de stream **open** is wanneer je deze overdraagt. | +| Vergeten `Position = 0` in te stellen na het schrijven | Data lijkt leeg bij later lezen. | Roep `stream.Seek(0, SeekOrigin.Begin)` aan vóór het retourneren als je de stream vooraf vult. | +| Een enorme `MemoryStream` gebruiken voor grote bestanden | Out‑of‑memory crashes. | Schakel over naar een tijdelijke `FileStream` of een aangepaste gebufferde stream. | + +--- + +## Maak geheugenstroom c# – Moderne aanpak (24.2+) + +Vanaf versie 24.2 heeft de bibliotheek `ResourceHandler` geïntroduceerd. In plaats van een interface erft je nu van een basisklasse en overschrijf je één methode. Dit geeft je een schoner, async‑vriendelijk toegangspunt. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Waarom `ResourceHandler` verkiezen + +- **Async support** – De `HandleResourceAsync`‑methode laat je I/O uitvoeren zonder threads te blokkeren. +- **Built‑in error handling** – De basisklasse vangt uitzonderingen op en zet ze om in framework‑specifieke foutcodes. +- **Future‑proof** – Nieuwere releases voegen hooks toe (bijv. logging, telemetry) die alleen werken met het handler‑patroon. + +### Afhandeling van randgevallen + +1. **Disposal** – Het framework maakt de stream vrij nadat deze klaar is, maar als je een andere disposable (zoals een `FileStream`) omsluit, moet je een `using`‑blok binnen de methode implementeren en een wrapper retourneren die `Dispose` doorgeeft. +2. **Large payloads** – Als je > 100 MB payloads verwacht, vervang `MemoryStream` door een `FileStream` die naar een tijdelijk bestand wijst. Voorbeeld: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – Unit‑test je handler door een mock `IServiceProvider` te injecteren als de basisklasse services uit DI haalt. Verifieer dat `HandleResource` een stream retourneert die zowel geschreven als gelezen kan worden. + +--- + +## Hoe stream te maken – Een snelle spiekbrief + +| Scenario | Aanbevolen API | Voorbeeldcode | +|----------|----------------|---------------| +| Simpele in‑memory data | `MemoryStream` | `new MemoryStream()` | +| Grote tijdelijke bestanden | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Netwerk‑gebaseerde bron | `NetworkStream` | `new NetworkStream(socket)` | +| Aangepaste buffering | Derive from `Stream` | See [Microsoft docs] for custom stream implementation | + +> **Opmerking:** Stel altijd `stream.Position = 0` in vóór het retourneren als je de stream vooraf vult; anders denken downstream‑lezers dat de stream leeg is. + +--- + +## Afbeeldingsillustratie + +![diagram dat het proces van create memory stream c# toont](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* diagram dat het proces van create memory stream c# toont + +--- + +## Volledig uitvoerbaar voorbeeld + +Hieronder staat een minimale console‑app die zowel de legacy‑ als moderne aanpakken demonstreert. Je kunt het copy‑pasten in een nieuw .NET 6 console‑project en direct uitvoeren. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Verwachte output** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +Het programma toont drie manieren om **how to create stream**: de oude `IOutputStorage`, de nieuwe synchronische `HandleResource` en de asynchrone `HandleResourceAsync`. Alle drie retourneren een `MemoryStream`, wat bewijst dat aangepaste streamcreatie werkt ongeacht welke versie je target. + +--- + +## Veelgestelde vragen (FAQ) + +**Q: Moet ik `Dispose` aanroepen op de stream die ik terugkrijg?** +A: Het framework (of jouw aanroepende code) is verantwoordelijk voor het vrijgeven. Als je een andere disposable in je geretourneerde stream omsluit, zorg er dan voor dat deze de `Dispose`‑aanroep doorgeeft. + +**Q: Kan ik een alleen‑lezen stream retourneren?** +A: Ja, maar het contract verwacht meestal een schrijfbare stream. Als je alleen hoeft te lezen, implementeer `CanWrite => false` en documenteer de beperking. + +**Q: Wat als mijn data groter is dan het beschikbare RAM?** +A: Schakel over naar een `FileStream` die wordt ondersteund door een tijdelijk bestand, of implementeer een aangepaste gebufferde stream die in stukken naar schijf schrijft. + +**Q: Is er een prestatieverschil tussen de twee aanpakken?** +A: De moderne `ResourceHandler` voegt een kleine overhead toe door de extra basisklasse‑logica, maar de async‑versie kan de doorvoer aanzienlijk verbeteren bij hoge gelijktijdigheid. + +--- + +## Samenvatting + +We hebben zojuist **create memory stream c#** vanuit elk perspectief behandeld dat je in de praktijk kunt tegenkomen. Je weet nu **how to create stream** te gebruiken met zowel het legacy `IOutputStorage`‑patroon als de nieuwere `ResourceHandler`‑klasse, en je hebt praktische tips gezien voor **how to handle resources** op een verantwoorde manier en het uitbreiden van het patroon met **custom stream creation** voor grote bestanden of async‑scenario's. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/dutch/net/generate-jpg-and-png-images/_index.md b/html/dutch/net/generate-jpg-and-png-images/_index.md index 739c8bd98..454bf7fca 100644 --- a/html/dutch/net/generate-jpg-and-png-images/_index.md +++ b/html/dutch/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Het integreren van Aspose.HTML voor .NET in uw .NET-projecten is probleemloos. D Leer hoe u dynamische webpagina's maakt met Aspose.HTML voor .NET. Deze stapsgewijze tutorial behandelt vereisten, naamruimten en het renderen van HTML naar afbeeldingen. ### [Genereer PNG-afbeeldingen via ImageDevice in .NET met Aspose.HTML](./generate-png-images-by-imagedevice/) Leer hoe u Aspose.HTML voor .NET kunt gebruiken om HTML-documenten te bewerken, HTML naar afbeeldingen te converteren en meer. Stapsgewijze tutorial met veelgestelde vragen. +### [Hoe antialiasing in te schakelen bij het converteren van DOCX naar PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Leer hoe u antialiasing inschakelt bij het omzetten van DOCX-bestanden naar PNG- of JPG-afbeeldingen met Aspose.HTML. ## Conclusie @@ -52,4 +54,4 @@ Dus, waarom wachten? Begin vandaag nog met het verkennen van de wereld van HTML {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/dutch/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/dutch/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..d1f013b6b --- /dev/null +++ b/html/dutch/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,261 @@ +--- +category: general +date: 2025-12-27 +description: Leer hoe je antialiasing kunt inschakelen bij het converteren van DOCX + naar PNG of JPG. Deze stapsgewijze handleiding behandelt ook het converteren van + docx naar png en het converteren van docx naar jpg. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: nl +og_description: Hoe antialiasing in te schakelen bij het converteren van DOCX‑bestanden + naar PNG of JPG. Volg deze volledige gids voor een soepele, hoogwaardige output. +og_title: Hoe antialiasing in te schakelen bij het converteren van DOCX naar PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: Hoe antialiasing in te schakelen bij het converteren van DOCX naar PNG/JPG +url: /nl/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hoe antialiasing in te schakelen bij het converteren van DOCX naar PNG/JPG + +Heb je je ooit afgevraagd **hoe antialiasing in te schakelen** zodat je geconverteerde DOCX‑afbeeldingen er scherp uitzien in plaats van gekarteld? Je bent niet de enige. Veel ontwikkelaars lopen tegen een muur aan wanneer ze een Word‑document moeten omzetten naar een PNG of JPG en eindigen met vage randen op lijnen en tekst. Het goede nieuws? Met een paar regels C# kun je die ruwe output omzetten in pixel‑perfecte graphics—zonder dat je een externe beeldeditor nodig hebt. + +In deze tutorial lopen we het volledige proces door van **convert docx to png** en **convert docx to jpg** met behulp van een moderne renderbibliotheek. Je leert niet alleen *hoe je docx converteert* maar ook *hoe je docx rendert* met antialiasing en hinting ingeschakeld, zodat elke curve en elk teken er glad uitziet. Er is geen eerdere ervaring met grafische programmeren nodig; alleen een basis C#‑omgeving en een DOCX‑bestand dat je wilt omzetten naar een afbeelding. + +--- + +## Wat je nodig hebt + +- **.NET 6+** (of .NET Framework 4.6+ als je de klassieke runtime verkiest) +- Een **DOCX**‑bestand dat je wilt renderen (plaats het in een map genaamd `input` voor de demo) +- Het **Aspose.Words for .NET** NuGet‑pakket (of een willekeurige bibliotheek die `Document`, `ImageRenderingOptions` en `ImageDevice` exposeert). Installeer het met: + +```bash +dotnet add package Aspose.Words +``` + +Dat is alles—geen extra beeldverwerkingstools nodig. + +## Stap 1: Laad het DOCX Document (how to convert docx) + +Eerst hebben we een `Document`‑object nodig dat het bronbestand vertegenwoordigt. Beschouw het als de digitale versie van je Word‑bestand die de bibliotheek kan lezen en manipuleren. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Waarom dit belangrijk is:** Het laden van het document is de basis voor *how to render docx*. Als het bestand niet gelezen kan worden, zullen geen van de latere stappen werken, dus beginnen we hier. + +## Stap 2: Configureer Image Rendering Options (enable antialiasing) + +Nu komt het magische deel—het inschakelen van antialiasing en hinting. Antialiasing maakt de gekartelde randen die je normaal op diagonale lijnen ziet glad, terwijl hinting de helderheid van kleine tekst verbetert. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Pro tip:** Als je ooit een prestatie‑boost nodig hebt bij enorme documenten, kun je `UseAntialiasing` uitschakelen, maar de visuele kwaliteit zal merkbaar dalen. + +## Stap 3: Kies het uitvoerformaat – PNG of JPG (convert docx to png / convert docx to jpg) + +De `ImageDevice`‑klasse bepaalt waar de gerenderde pagina’s naartoe gaan. Door de `ImageSaveOptions` te wisselen kun je ofwel PNG (verliesvrij) of JPG (gecomprimeerd) outputten. Hieronder maken we twee aparte devices zodat je beide formaten in één run kunt genereren. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Waarom beide?** PNG behoudt elk pixel, wat perfect is wanneer je exacte getrouwheid nodig hebt (bijv. afdrukken). JPG daarentegen comprimeert de afbeelding, waardoor deze sneller laadt op een website. + +## Stap 4: Render de documentpagina’s naar afbeeldingen (how to render docx) + +Met de devices klaar, laten we de `Document` elke pagina renderen. De bibliotheek zal automatisch door alle pagina’s lopen en ze opslaan volgens het naamgevingspatroon dat we hebben gedefinieerd. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Na het uitvoeren van de code vind je een reeks bestanden zoals `page_0.png`, `page_1.png`, … en `page_0.jpg`, `page_1.jpg` in de `output`‑map. Elke afbeelding heeft antialiasing toegepast, zodat lijnen glad zijn en tekst kristalhelder. + +## Stap 5: Verifieer het resultaat (expected output) + +Open een van de gegenereerde afbeeldingen. Je zou moeten zien: + +- **Gladde krommen** op vormen en diagrammen (geen traptrede‑artefacten). +- **Scherpe, leesbare tekst** zelfs bij kleine lettergroottes, dankzij hinting. +- **Consistente kleuren** tussen PNG en JPG (hoewel JPG lichte compressie‑artefacten kan vertonen als je de kwaliteit verlaagt). + +Als je enige onscherpte opmerkt, controleer dan dubbel of `UseAntialiasing` is ingesteld op `true` en dat je bron‑DOCX geen lage‑resolutie raster‑afbeeldingen bevat. + +## Veelgestelde vragen & randgevallen + +### Wat als ik slechts één pagina nodig heb? + +Je kunt een specifieke pagina renderen door de `PageInfo`‑overload te gebruiken: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Kan ik de DPI (dots per inch) aanpassen voor een hogere resolutie output? + +Absoluut. Pas de `Resolution`‑eigenschap aan op `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Een hogere DPI betekent grotere bestanden, maar het antialiasing‑effect wordt nog duidelijker. + +### Hoe ga ik om met grote DOCX‑bestanden zonder geheugenproblemen? + +Render pagina’s één‑voor‑één en maak het device na elke iteratie vrij: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### Is het mogelijk om te converteren naar andere formaten zoals BMP of TIFF? + +Ja—vervang gewoon `SaveFormat.Png` of `SaveFormat.Jpeg` door `SaveFormat.Bmp` of `SaveFormat.Tiff`. Dezelfde antialiasing‑instellingen blijven van toepassing. + +## Volledig werkend voorbeeld (Klaar om te kopiëren‑plakken) + +Hieronder staat het volledige programma dat je in een nieuw console‑project kunt plaatsen. Het bevat alle using‑statements, foutafhandeling en commentaren voor duidelijkheid. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Resultaat:** Na het compileren (`dotnet run`) zie je een reeks PNG‑ en JPG‑bestanden in de `output`‑directory, elk met antialiasing toegepast. + +## Conclusie + +We hebben behandeld **hoe antialiasing in te schakelen** wanneer je **DOCX naar PNG of JPG converteert**, we hebben de exacte stappen doorlopen om **convert docx to png**, **convert docx to jpg** te doen, en zelfs aangeraakt **how to render docx** voor aangepaste + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/english/net/advanced-features/_index.md b/html/english/net/advanced-features/_index.md index 8fa00f2cc..0e3fe0130 100644 --- a/html/english/net/advanced-features/_index.md +++ b/html/english/net/advanced-features/_index.md @@ -42,7 +42,8 @@ Convert HTML to PDF dynamically with Aspose.HTML for .NET. Easy integration, cus Learn how to convert HTML to PDF, XPS, and images with Aspose.HTML for .NET. Step-by-step tutorial with code examples and FAQs. ### [Using HTML Templates in .NET with Aspose.HTML](./using-html-templates/) Learn how to use Aspose.HTML for .NET to dynamically generate HTML documents from JSON data. Harness the power of HTML manipulation in your .NET applications. - +### [Create memory stream c# – Custom stream creation guide](./create-memory-stream-c-custom-stream-creation-guide/) +Learn how to create a memory stream in C# using Aspose.HTML for .NET, with step-by-step examples and best practices. ## Conclusion @@ -52,4 +53,4 @@ Aspose.HTML for .NET opens the door to a world of possibilities when it comes to {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/english/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/english/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..2016b0d4f --- /dev/null +++ b/html/english/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,278 @@ +--- +category: general +date: 2025-12-27 +description: Create memory stream c# quickly with a step‑by‑step guide. Learn how + to create stream, handle resources, and implement custom stream creation in .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: en +og_description: Create memory stream c# in seconds. This tutorial shows how to create + stream, handle resources, and build custom stream creation with modern .NET APIs. +og_title: Create memory stream c# – Complete Custom Stream Guide +tags: +- stream +- csharp +- .net +- resource-handling +title: Create memory stream c# – Custom stream creation guide +url: /net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Create memory stream c# – Custom stream creation guide + +Ever needed to **create memory stream c#** but weren't sure which API to pick? You're not the only one. In many legacy projects you’ll find `IOutputStorage`, while newer codebases prefer `ResourceHandler`. Either way, the goal is the same: produce a `Stream` that your framework can consume. + +In this tutorial you’ll learn **how to create stream** objects, **how to handle resources** safely, and master **custom stream creation** for both pre‑24.2 and 24.2+ versions of the library. By the end you’ll have a working example you can drop into any .NET solution—no mystery references, just pure C#. + +## What you’ll walk away with + +- A clear comparison of the legacy `IOutputStorage` pattern vs. the modern `ResourceHandler` approach. +- Complete, copy‑paste‑ready code that compiles against .NET 6+ (or earlier, if you need it). +- Tips for edge cases like disposing streams, handling large payloads, and testing your custom stream. + +> **Pro tip:** If you’re targeting .NET 8, the newer `ResourceHandler` gives you built‑in async support, which can shave milliseconds off high‑throughput scenarios. + +--- + +## Create memory stream c# – Legacy approach (pre‑24.2) + +When you’re stuck on an older version of the library, the contract you have to satisfy is `IOutputStorage`. The interface only asks for a method that returns a `Stream` for a given resource name. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Why this works + +- **Interface contract** – The framework will call `CreateStream` whenever it needs to write output. +- **Flexibility** – Because you return a `Stream`, you can swap `MemoryStream` for `FileStream` or even a custom buffered stream later without touching the rest of the code. +- **Resource safety** – The caller is responsible for disposing the returned stream, which is why we don’t call `Dispose` inside the method. + +### Common pitfalls + +| Issue | What happens | Fix | +|-------|--------------|-----| +| Returning a closed stream | Consumers will get `ObjectDisposedException` on write. | Ensure the stream is **open** when you hand it off. | +| Forgetting to set `Position = 0` after writing | Data appears empty when read later. | Call `stream.Seek(0, SeekOrigin.Begin)` before returning if you pre‑populate it. | +| Using a huge `MemoryStream` for large files | Out‑of‑memory crashes. | Switch to a temporary `FileStream` or a custom buffered stream. | + +--- + +## Create memory stream c# – Modern approach (24.2+) + +Starting with version 24.2 the library introduced `ResourceHandler`. Instead of an interface you now inherit from a base class and override a single method. This gives you a cleaner, async‑friendly entry point. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Why prefer `ResourceHandler` + +- **Async support** – The `HandleResourceAsync` method lets you perform I/O without blocking threads. +- **Built‑in error handling** – The base class catches exceptions and converts them into framework‑specific error codes. +- **Future‑proof** – Newer releases add hooks (e.g., logging, telemetry) that only work with the handler pattern. + +### Edge‑case handling + +1. **Disposal** – The framework disposes the stream after it’s done, but if you wrap another disposable (like a `FileStream`) you should implement a `using` block inside the method and return a wrapper that forwards `Dispose`. +2. **Large payloads** – If you anticipate > 100 MB payloads, replace `MemoryStream` with a `FileStream` pointing at a temp file. Example: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – Unit‑test your handler by injecting a mock `IServiceProvider` if the base class pulls services from DI. Verify that `HandleResource` returns a stream that can be written to and read from. + +--- + +## How to create stream – A quick cheat sheet + +| Scenario | Recommended API | Sample Code | +|----------|----------------|-------------| +| Simple in‑memory data | `MemoryStream` | `new MemoryStream()` | +| Large temporary files | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Network‑based source | `NetworkStream` | `new NetworkStream(socket)` | +| Custom buffering | Derive from `Stream` | See [Microsoft docs] for custom stream implementation | + +> **Note:** Always set `stream.Position = 0` before returning if you pre‑populate the stream; otherwise downstream readers will think the stream is empty. + +--- + +## Image illustration + +![Diagram showing create memory stream c# process](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* diagram showing create memory stream c# process + +--- + +## Full runnable example + +Below is a minimal console app that demonstrates both the legacy and modern approaches. You can copy‑paste it into a new .NET 6 console project and run it as‑is. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Expected output** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +The program shows three ways to **how to create stream**: the old `IOutputStorage`, the new synchronous `HandleResource`, and the asynchronous `HandleResourceAsync`. All three return a `MemoryStream`, proving that custom stream creation works no matter which version you target. + +--- + +## Frequently asked questions (FAQ) + +**Q: Do I need to call `Dispose` on the stream I get back?** +A: The framework (or your calling code) is responsible for disposal. If you wrap another disposable inside your returned stream, make sure it propagates the `Dispose` call. + +**Q: Can I return a read‑only stream?** +A: Yes, but the contract usually expects a writable stream. If you only need to read, implement `CanWrite => false` and document the limitation. + +**Q: What if my data is larger than available RAM?** +A: Switch to a `FileStream` backed by a temporary file, or implement a custom buffered stream that writes to disk in chunks. + +**Q: Is there any performance difference between the two approaches?** +A: The modern `ResourceHandler` adds a tiny overhead for the extra base‑class logic, but the async version can dramatically improve throughput under high concurrency. + +--- + +## Wrap‑up + +We’ve just covered **create memory stream c#** from every angle you might encounter in the wild. You now know **how to create stream** using both the legacy `IOutputStorage` pattern and the newer `ResourceHandler` class, plus you’ve seen practical tips for **how to handle resources** responsibly and extend the pattern with **custom stream creation** for large files or async scenarios. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/english/net/generate-jpg-and-png-images/_index.md b/html/english/net/generate-jpg-and-png-images/_index.md index 28011c7de..31e5725e2 100644 --- a/html/english/net/generate-jpg-and-png-images/_index.md +++ b/html/english/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Integrating Aspose.HTML for .NET into your .NET projects is hassle-free. The lib Learn how to create dynamic web pages using Aspose.HTML for .NET. This step-by-step tutorial covers prerequisites, namespaces, and rendering HTML to images. ### [Generate PNG Images by ImageDevice in .NET with Aspose.HTML](./generate-png-images-by-imagedevice/) Learn to use Aspose.HTML for .NET to manipulate HTML documents, convert HTML to images, and more. Step-by-step tutorial with FAQs. +### [How to Enable Antialiasing When Converting DOCX to PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Learn how to enable antialiasing for sharper PNG/JPG output when converting DOCX files using Aspose.HTML for .NET. ## Conclusion @@ -52,4 +54,4 @@ So, why wait? Start exploring the world of HTML to image conversion with Aspose. {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/english/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/english/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..791cb28ba --- /dev/null +++ b/html/english/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,276 @@ +--- +category: general +date: 2025-12-27 +description: Learn how to enable antialiasing while converting DOCX to PNG or JPG. + This step‑by‑step guide also covers convert docx to png and convert docx to jpg. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: en +og_description: How to enable antialiasing while converting DOCX files to PNG or JPG. + Follow this complete guide for smooth, high‑quality output. +og_title: How to Enable Antialiasing When Converting DOCX to PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: How to Enable Antialiasing When Converting DOCX to PNG/JPG +url: /net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to Enable Antialiasing When Converting DOCX to PNG/JPG + +Ever wondered **how to enable antialiasing** so your converted DOCX images look crisp instead of jagged? You’re not alone. Many developers hit a wall when they need to turn a Word document into a PNG or JPG and end up with fuzzy edges on lines and text. The good news? With a few lines of C# you can turn that rough output into pixel‑perfect graphics—no third‑party image editors required. + +In this tutorial we’ll walk through the entire process of **convert docx to png** and **convert docx to jpg** using a modern rendering library. You’ll learn not only *how to convert docx* but also *how to render docx* with antialiasing and hinting enabled, so every curve and character looks smooth. No prior experience with graphics programming is needed; just a basic C# setup and a DOCX file you want to turn into an image. + +--- + +## What You’ll Need + +- **.NET 6+** (or .NET Framework 4.6+ if you prefer the classic runtime) +- A **DOCX** file you’d like to render (place it in a folder called `input` for the demo) +- The **Aspose.Words for .NET** NuGet package (or any library that exposes `Document`, `ImageRenderingOptions`, and `ImageDevice`). Install it with: + +```bash +dotnet add package Aspose.Words +``` + +That’s it—no extra image‑processing tools required. + +--- + +## Step 1: Load the DOCX Document (how to convert docx) + +First we need a `Document` object that represents the source file. Think of it as the digital version of your Word file that the library can read and manipulate. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Why this matters:** Loading the document is the foundation for *how to render docx*. If the file can’t be read, none of the later steps will work, so we start here. + +--- + +## Step 2: Configure Image Rendering Options (enable antialiasing) + +Now comes the magic part—turning on antialiasing and hinting. Antialiasing smooths the jagged edges you’d normally see on diagonal lines, while hinting improves the clarity of small text. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Pro tip:** If you ever need a performance boost on massive documents, you can toggle `UseAntialiasing` off, but the visual quality will drop noticeably. + +--- + +## Step 3: Choose the Output Format – PNG or JPG (convert docx to png / convert docx to jpg) + +The `ImageDevice` class decides where the rendered pages go. By swapping the `ImageSaveOptions` you can output either PNG (lossless) or JPG (compressed). Below we create two separate devices so you can generate both formats in one run. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Why both?** PNG preserves every pixel, which is perfect when you need exact fidelity (e.g., printing). JPG, on the other hand, compresses the image, making it faster to load on a website. + +--- + +## Step 4: Render the Document Pages to Images (how to render docx) + +With the devices ready, we tell the `Document` to render each page. The library will automatically loop through all pages and save them using the naming pattern we defined. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +After running the code, you’ll find a series of files like `page_0.png`, `page_1.png`, … and `page_0.jpg`, `page_1.jpg` inside the `output` folder. Each image will have antialiasing applied, so lines are smooth and text is crystal‑clear. + +--- + +## Step 5: Verify the Result (expected output) + +Open any of the generated images. You should see: + +- **Smooth curves** on shapes and charts (no stair‑step artifacts). +- **Sharp, readable text** even at small font sizes, thanks to hinting. +- **Consistent colors** between PNG and JPG (though JPG may show slight compression artifacts if you lower the quality). + +If you notice any fuzziness, double‑check that `UseAntialiasing` is set to `true` and that your source DOCX doesn’t contain low‑resolution raster images. + +--- + +## Common Questions & Edge Cases + +### What if I only need a single page? + +You can render a specific page by using the `PageInfo` overload: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Can I change the DPI (dots per inch) for higher‑resolution output? + +Absolutely. Adjust the `Resolution` property on `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Higher DPI means larger files, but the antialiasing effect becomes even more noticeable. + +### How do I handle large DOCX files without running out of memory? + +Render pages one‑by‑one and dispose of the device after each iteration: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### Is it possible to convert to other formats like BMP or TIFF? + +Yes—just swap `SaveFormat.Png` or `SaveFormat.Jpeg` with `SaveFormat.Bmp` or `SaveFormat.Tiff`. The same antialiasing settings carry over. + +--- + +## Full Working Example (Copy‑Paste Ready) + +Below is the complete program you can drop into a new console project. It includes all using statements, error handling, and comments for clarity. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Result:** After compiling (`dotnet run`) you’ll see a series of PNG and JPG files in the `output` directory, each with antialiasing applied. + +--- + +## Conclusion + +We’ve covered **how to enable antialiasing** when you **convert DOCX to PNG or JPG**, walked through the exact steps to **convert docx to png**, **convert docx to jpg**, and even touched on **how to render docx** for custom + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/french/net/advanced-features/_index.md b/html/french/net/advanced-features/_index.md index e9b9aa3e2..29c2ad471 100644 --- a/html/french/net/advanced-features/_index.md +++ b/html/french/net/advanced-features/_index.md @@ -32,6 +32,8 @@ Découvrez comment travailler avec des documents HTML dans .NET à l'aide d'Aspo Découvrez comment utiliser Aspose.HTML pour .NET pour manipuler efficacement des documents HTML. Tutoriel étape par étape pour les développeurs. ### [Fournisseur de flux de mémoire dans .NET avec Aspose.HTML](./memory-stream-provider/) Découvrez comment créer de superbes documents HTML dans .NET avec Aspose.HTML. Suivez notre tutoriel étape par étape et découvrez la puissance de la manipulation HTML. +### [Créer un flux mémoire C# – Guide de création de flux personnalisé](./create-memory-stream-c-custom-stream-creation-guide/) +Apprenez à créer un flux mémoire personnalisé en C# avec Aspose.HTML, incluant des exemples pas à pas et des conseils pratiques. ### [Web Scraping en .NET avec Aspose.HTML](./web-scraping/) Apprenez à manipuler des documents HTML dans .NET avec Aspose.HTML. Parcourez, filtrez, interrogez et sélectionnez des éléments de manière efficace pour un développement Web amélioré. ### [Utiliser la propriété de contenu étendu dans .NET avec Aspose.HTML](./use-extended-content-property/) @@ -52,4 +54,4 @@ Aspose.HTML pour .NET ouvre la porte à un monde de possibilités lorsqu'il s'ag {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/french/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/french/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..c25fb8803 --- /dev/null +++ b/html/french/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,280 @@ +--- +category: general +date: 2025-12-27 +description: Créez rapidement un flux mémoire en C# avec un guide étape par étape. + Apprenez à créer un flux, à gérer les ressources et à implémenter la création de + flux personnalisés dans .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: fr +og_description: Créez un flux mémoire en C# en quelques secondes. Ce tutoriel montre + comment créer un flux, gérer les ressources et concevoir une création de flux personnalisée + avec les API .NET modernes. +og_title: Créer un flux mémoire en C# – Guide complet du flux personnalisé +tags: +- stream +- csharp +- .net +- resource-handling +title: Créer un flux mémoire C# – Guide de création de flux personnalisé +url: /fr/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Créer un flux mémoire c# – Guide de création de flux personnalisé + +Vous avez déjà eu besoin de **créer un flux mémoire c#** sans savoir quelle API choisir ? Vous n'êtes pas seul. Dans de nombreux projets hérités, vous trouverez `IOutputStorage`, tandis que les bases de code plus récentes privilégient `ResourceHandler`. Dans les deux cas, l'objectif est le même : produire un `Stream` que votre framework peut consommer. + +Dans ce tutoriel, vous apprendrez **comment créer des objets stream**, **comment gérer les ressources** en toute sécurité, et maîtriserez **la création de flux personnalisés** pour les versions pré‑24.2 et 24.2+ de la bibliothèque. À la fin, vous disposerez d'un exemple fonctionnel à intégrer dans n'importe quelle solution .NET—sans références mystères, juste du pur C#. + +## Ce que vous allez retenir + +- Une comparaison claire du modèle hérité `IOutputStorage` vs. l'approche moderne `ResourceHandler`. +- Un code complet, prêt à copier‑coller, qui compile avec .NET 6+ (ou antérieur, si besoin). +- Des astuces pour les cas limites comme la libération des flux, la gestion de gros chargements, et les tests de votre flux personnalisé. + +> **Astuce pro :** Si vous ciblez .NET 8, le nouveau `ResourceHandler` vous offre un support asynchrone intégré, ce qui peut économiser des millisecondes dans les scénarios à haut débit. + +--- + +## Créer un flux mémoire c# – Approche héritée (pré‑24.2) + +Lorsque vous êtes bloqué sur une version plus ancienne de la bibliothèque, le contrat à satisfaire est `IOutputStorage`. L'interface ne demande qu'une méthode qui renvoie un `Stream` pour un nom de ressource donné. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Pourquoi cela fonctionne + +- **Contrat d'interface** – Le framework appellera `CreateStream` chaque fois qu'il devra écrire la sortie. +- **Flexibilité** – Comme vous renvoyez un `Stream`, vous pouvez remplacer `MemoryStream` par `FileStream` ou même un flux tampon personnalisé plus tard sans toucher au reste du code. +- **Sécurité des ressources** – L'appelant est responsable de la libération du flux retourné, c'est pourquoi nous n'appelons pas `Dispose` à l'intérieur de la méthode. + +### Pièges courants + +| Problème | Ce qui se passe | Solution | +|----------|-----------------|----------| +| Retour d'un flux fermé | Les consommateurs recevront `ObjectDisposedException` lors de l'écriture. | Assurez‑vous que le flux est **ouvert** lorsqu'il est remis. | +| Oublier de définir `Position = 0` après l'écriture | Les données semblent vides lors de la lecture ultérieure. | Appelez `stream.Seek(0, SeekOrigin.Begin)` avant de retourner le flux si vous le pré‑remplissez. | +| Utiliser un `MemoryStream` gigantesque pour de gros fichiers | Crashs pour manque de mémoire. | Passez à un `FileStream` temporaire ou à un flux tampon personnalisé. | + +--- + +## Créer un flux mémoire c# – Approche moderne (24.2+) + +À partir de la version 24.2, la bibliothèque a introduit `ResourceHandler`. Au lieu d'une interface, vous héritez maintenant d'une classe de base et surchargez une seule méthode. Cela vous donne un point d'entrée plus propre et compatible async. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Pourquoi privilégier `ResourceHandler` + +- **Support async** – La méthode `HandleResourceAsync` vous permet d'effectuer des I/O sans bloquer les threads. +- **Gestion d'erreurs intégrée** – La classe de base intercepte les exceptions et les convertit en codes d'erreur spécifiques au framework. +- **Préparation au futur** – Les versions récentes ajoutent des hooks (par ex., journalisation, télémétrie) qui ne fonctionnent qu'avec le pattern handler. + +### Gestion des cas limites + +1. **Libération** – Le framework libère le flux après utilisation, mais si vous encapsulez un autre objet jetable (comme un `FileStream`) vous devez implémenter un bloc `using` à l'intérieur de la méthode et retourner un wrapper qui transmet `Dispose`. +2. **Gros chargements** – Si vous prévoyez des charges > 100 Mo, remplacez `MemoryStream` par un `FileStream` pointant vers un fichier temporaire. Exemple : + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Tests** – Testez votre handler en injectant un `IServiceProvider` factice si la classe de base récupère des services via DI. Vérifiez que `HandleResource` renvoie un flux pouvant être écrit et lu. + +--- + +## Comment créer un flux – Fiche mémo rapide + +| Scénario | API recommandée | Exemple de code | +|----------|-----------------|-----------------| +| Données simples en mémoire | `MemoryStream` | `new MemoryStream()` | +| Gros fichiers temporaires | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Source réseau | `NetworkStream` | `new NetworkStream(socket)` | +| Bufferisation personnalisée | Dériver de `Stream` | Voir [Microsoft docs] pour l'implémentation d'un flux personnalisé | + +> **Remarque :** Toujours définir `stream.Position = 0` avant de retourner le flux si vous le pré‑remplissez ; sinon les lecteurs en aval penseront que le flux est vide. + +--- + +## Illustration d'image + +![Diagramme montrant le processus de création d'un flux mémoire c# process](https://example.com/images/create-memory-stream-diagram.png) + +*Texte alternatif :* diagramme montrant le processus de création d'un flux mémoire c# process + +--- + +## Exemple complet exécutable + +Voici une application console minimale qui montre les deux approches, héritée et moderne. Vous pouvez la copier‑coller dans un nouveau projet console .NET 6 et l'exécuter tel quel. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Sortie attendue** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +Le programme montre trois façons de **créer un flux** : l'ancienne `IOutputStorage`, le nouveau `HandleResource` synchrone, et le `HandleResourceAsync` asynchrone. Les trois retournent un `MemoryStream`, prouvant que la création de flux personnalisés fonctionne quel que soit la version ciblée. + +--- + +## Questions fréquemment posées (FAQ) + +**Q : Dois‑je appeler `Dispose` sur le flux que je récupère ?** +R : Le framework (ou votre code appelant) est responsable de la libération. Si vous encapsulez un autre objet jetable dans votre flux retourné, assurez‑vous qu'il propage l'appel `Dispose`. + +**Q : Puis‑je retourner un flux en lecture seule ?** +R : Oui, mais le contrat attend généralement un flux inscriptible. Si vous avez seulement besoin de lecture, implémentez `CanWrite => false` et documentez la limitation. + +**Q : Que faire si mes données dépassent la RAM disponible ?** +R : Passez à un `FileStream` basé sur un fichier temporaire, ou implémentez un flux tampon personnalisé qui écrit sur disque par blocs. + +**Q : Y a‑t‑il une différence de performance entre les deux approches ?** +R : `ResourceHandler` moderne ajoute un léger surcoût lié à la logique de la classe de base, mais la version async peut améliorer considérablement le débit sous forte concurrence. + +--- + +## Conclusion + +Nous venons de couvrir **créer un flux mémoire c#** sous tous les angles que vous pourriez rencontrer. Vous savez maintenant **comment créer des flux** en utilisant à la fois le modèle hérité `IOutputStorage` et la classe moderne `ResourceHandler`, ainsi que des astuces pratiques pour **gérer les ressources** de façon responsable et étendre le pattern avec **la création de flux personnalisés** pour les gros fichiers ou les scénarios async. + +Prêt pour + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/french/net/generate-jpg-and-png-images/_index.md b/html/french/net/generate-jpg-and-png-images/_index.md index 59d76b924..f6a049f56 100644 --- a/html/french/net/generate-jpg-and-png-images/_index.md +++ b/html/french/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ L'intégration d'Aspose.HTML pour .NET dans vos projets .NET est simple. La bibl Découvrez comment créer des pages Web dynamiques à l'aide d'Aspose.HTML pour .NET. Ce didacticiel étape par étape couvre les prérequis, les espaces de noms et le rendu HTML en images. ### [Générer des images PNG par ImageDevice dans .NET avec Aspose.HTML](./generate-png-images-by-imagedevice/) Apprenez à utiliser Aspose.HTML pour .NET pour manipuler des documents HTML, convertir du HTML en images, etc. Tutoriel étape par étape avec FAQ. +### [Comment activer l'anticrénelage lors de la conversion de DOCX en PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Apprenez à activer l'anticrénelage pour améliorer la qualité des images PNG/JPG générées à partir de documents DOCX avec Aspose.HTML. ## Conclusion @@ -52,4 +54,4 @@ Alors, pourquoi attendre ? Commencez dès aujourd'hui à explorer le monde de la {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/french/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/french/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..e5f826518 --- /dev/null +++ b/html/french/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,278 @@ +--- +category: general +date: 2025-12-27 +description: Apprenez comment activer l'anticrénelage lors de la conversion de DOCX + en PNG ou JPG. Ce guide étape par étape couvre également la conversion de DOCX en + PNG et la conversion de DOCX en JPG. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: fr +og_description: Comment activer l'anticrénelage lors de la conversion de fichiers + DOCX en PNG ou JPG. Suivez ce guide complet pour obtenir un rendu fluide et de haute + qualité. +og_title: Comment activer l'anticrénelage lors de la conversion de DOCX en PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: Comment activer l'anticrénelage lors de la conversion de DOCX en PNG/JPG +url: /fr/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Comment activer l'anticrénelage lors de la conversion de DOCX en PNG/JPG + +Vous vous êtes déjà demandé **comment activer l'anticrénelage** pour que vos images DOCX converties soient nettes plutôt que dentelées ? Vous n'êtes pas seul. De nombreux développeurs se heurtent à un mur lorsqu'ils doivent transformer un document Word en PNG ou JPG et se retrouvent avec des bords flous sur les lignes et le texte. Bonne nouvelle ? En quelques lignes de C#, vous pouvez transformer ce rendu approximatif en graphiques pixel‑parfait—sans aucun éditeur d'images tiers. + +Dans ce tutoriel, nous parcourrons l’ensemble du processus de **convert docx to png** et **convert docx to jpg** en utilisant une bibliothèque de rendu moderne. Vous apprendrez non seulement *comment convertir docx* mais aussi *comment rendre docx* avec l'anticrénelage et le hinting activés, afin que chaque courbe et chaque caractère soient lisses. Aucune expérience préalable en programmation graphique n’est requise ; il vous suffit d’une configuration C# basique et d’un fichier DOCX que vous souhaitez transformer en image. + +--- + +## Ce dont vous aurez besoin + +- **.NET 6+** (ou .NET Framework 4.6+ si vous préférez le runtime classique) +- Un fichier **DOCX** que vous souhaitez rendre (placez‑le dans un dossier nommé `input` pour la démonstration) +- Le package NuGet **Aspose.Words for .NET** (ou toute bibliothèque exposant `Document`, `ImageRenderingOptions` et `ImageDevice`). Installez‑le avec : + +```bash +dotnet add package Aspose.Words +``` + +C’est tout—aucun outil de traitement d’image supplémentaire n’est requis. + +--- + +## Étape 1 : Charger le document DOCX (how to convert docx) + +Tout d'abord, nous avons besoin d'un objet `Document` qui représente le fichier source. Considérez‑le comme la version numérique de votre fichier Word que la bibliothèque peut lire et manipuler. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Pourquoi c’est important :** Charger le document est la base pour *how to render docx*. Si le fichier ne peut pas être lu, aucune des étapes suivantes ne fonctionnera, nous commençons donc ici. + +--- + +## Étape 2 : Configurer les options de rendu d’image (enable antialiasing) + +Voici la partie magique — activer l'anticrénelage et le hinting. L'anticrénelage adoucit les bords dentelés que l’on voit habituellement sur les lignes diagonales, tandis que le hinting améliore la clarté du petit texte. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Astuce :** Si vous avez besoin d’un gain de performance sur des documents volumineux, vous pouvez désactiver `UseAntialiasing`, mais la qualité visuelle diminuera de façon notable. + +--- + +## Étape 3 : Choisir le format de sortie – PNG ou JPG (convert docx to png / convert docx to jpg) + +La classe `ImageDevice` détermine où les pages rendues sont enregistrées. En échangeant `ImageSaveOptions`, vous pouvez produire soit du PNG (sans perte) soit du JPG (compressé). Ci-dessous, nous créons deux appareils distincts afin que vous puissiez générer les deux formats en une seule exécution. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Pourquoi les deux ?** PNG préserve chaque pixel, ce qui est parfait lorsque vous avez besoin d’une fidélité exacte (par ex., impression). JPG, en revanche, compresse l’image, ce qui la rend plus rapide à charger sur un site web. + +--- + +## Étape 4 : Rendre les pages du document en images (how to render docx) + +Avec les appareils prêts, nous demandons au `Document` de rendre chaque page. La bibliothèque parcourra automatiquement toutes les pages et les enregistrera en utilisant le modèle de nommage que nous avons défini. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Après l’exécution du code, vous trouverez une série de fichiers comme `page_0.png`, `page_1.png`, … et `page_0.jpg`, `page_1.jpg` dans le dossier `output`. Chaque image aura l’anticrénelage appliqué, de sorte que les lignes sont lisses et le texte est cristallin. + +--- + +## Étape 5 : Vérifier le résultat (expected output) + +Ouvrez l’une des images générées. Vous devriez voir : + +- **Des courbes lisses** sur les formes et les graphiques (pas d’artefacts en escalier). +- **Un texte net et lisible** même à petite taille de police, grâce au hinting. +- **Des couleurs cohérentes** entre PNG et JPG (bien que le JPG puisse montrer de légers artefacts de compression si vous réduisez la qualité). + +Si vous remarquez un flou, vérifiez que `UseAntialiasing` est bien réglé sur `true` et que votre DOCX source ne contient pas d’images raster basse résolution. + +--- + +## Questions fréquentes & cas particuliers + +### Et si je n’ai besoin que d’une seule page ? + +Vous pouvez rendre une page spécifique en utilisant la surcharge `PageInfo` : + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Puis‑je modifier le DPI (points par pouce) pour une sortie à plus haute résolution ? + +Absolument. Ajustez la propriété `Resolution` sur `ImageRenderingOptions` : + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Un DPI plus élevé signifie des fichiers plus volumineux, mais l’effet d’anticrénelage devient encore plus perceptible. + +### Comment gérer de gros fichiers DOCX sans épuiser la mémoire ? + +Rendez les pages une par une et libérez l’appareil après chaque itération : + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### Est‑il possible de convertir vers d’autres formats comme BMP ou TIFF ? + +Oui—il suffit d’échanger `SaveFormat.Png` ou `SaveFormat.Jpeg` avec `SaveFormat.Bmp` ou `SaveFormat.Tiff`. Les mêmes paramètres d’anticrénelage sont conservés. + +--- + +## Exemple complet fonctionnel (prêt à copier‑coller) + +Ci‑dessous se trouve le programme complet que vous pouvez placer dans un nouveau projet console. Il inclut toutes les instructions `using`, la gestion des erreurs et des commentaires pour plus de clarté. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Résultat :** Après compilation (`dotnet run`), vous verrez une série de fichiers PNG et JPG dans le répertoire `output`, chacun avec l’anticrénelage appliqué. + +--- + +## Conclusion + +Nous avons couvert **comment activer l'anticrénelage** lors de la **conversion de DOCX en PNG ou JPG**, parcouru les étapes exactes pour **convert docx to png**, **convert docx to jpg**, et même abordé **how to render docx** pour des besoins personnalisés + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/german/net/advanced-features/_index.md b/html/german/net/advanced-features/_index.md index b842ee975..69653c192 100644 --- a/html/german/net/advanced-features/_index.md +++ b/html/german/net/advanced-features/_index.md @@ -32,6 +32,10 @@ Erfahren Sie, wie Sie mit Aspose.HTML mit HTML-Dokumenten in .NET für Aufgaben Erfahren Sie, wie Sie mit Aspose.HTML für .NET HTML-Dokumente effizient bearbeiten. Schritt-für-Schritt-Anleitung für Entwickler. ### [Memory Stream Provider in .NET mit Aspose.HTML](./memory-stream-provider/) Erfahren Sie, wie Sie mit Aspose.HTML beeindruckende HTML-Dokumente in .NET erstellen. Folgen Sie unserem Schritt-für-Schritt-Tutorial und entfesseln Sie die Möglichkeiten der HTML-Manipulation. + +### [Erstellen Sie einen Memory Stream in C# – Leitfaden zur benutzerdefinierten Stream-Erstellung](./create-memory-stream-c-custom-stream-creation-guide/) +Erfahren Sie, wie Sie mit Aspose.HTML in C# benutzerdefinierte Memory Streams erstellen und effizient nutzen. + ### [Web Scraping in .NET mit Aspose.HTML](./web-scraping/) Erfahren Sie, wie Sie HTML-Dokumente in .NET mit Aspose.HTML bearbeiten. Navigieren, filtern, abfragen und wählen Sie Elemente effektiv aus, um die Webentwicklung zu verbessern. ### [Verwenden Sie die erweiterte Inhaltseigenschaft in .NET mit Aspose.HTML](./use-extended-content-property/) @@ -52,4 +56,4 @@ Aspose.HTML für .NET öffnet Ihnen die Tür zu einer Welt voller Möglichkeiten {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/german/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/german/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..3ea486718 --- /dev/null +++ b/html/german/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,267 @@ +--- +category: general +date: 2025-12-27 +description: Erstelle schnell einen MemoryStream in C# mit einer Schritt‑für‑Schritt‑Anleitung. + Lerne, wie du einen Stream erstellst, Ressourcen verwaltest und die benutzerdefinierte + Stream‑Erstellung in .NET implementierst. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: de +og_description: Erstelle MemoryStream in C# in Sekundenschnelle. Dieses Tutorial zeigt, + wie man einen Stream erstellt, Ressourcen verwaltet und die Erstellung benutzerdefinierter + Streams mit modernen .NET‑APIs aufbaut. +og_title: Memory-Stream in C# erstellen – Vollständiger Leitfaden für benutzerdefinierte + Streams +tags: +- stream +- csharp +- .net +- resource-handling +title: Memory-Stream in C# erstellen – Leitfaden zur benutzerdefinierten Stream-Erstellung +url: /de/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Memory-Stream in C# erstellen – Anleitung zur benutzerdefinierten Stream-Erstellung + +Haben Sie jemals **create memory stream c#** benötigt, waren sich aber nicht sicher, welche API Sie wählen sollen? Sie sind nicht allein. In vielen Legacy‑Projekten finden Sie `IOutputStorage`, während neuere Codebasen `ResourceHandler` bevorzugen. In beiden Fällen ist das Ziel dasselbe: einen `Stream` erzeugen, den Ihr Framework konsumieren kann. + +In diesem Tutorial lernen Sie **how to create stream** Objekte, **how to handle resources** sicher zu handhaben und meistern **custom stream creation** für sowohl pre‑24.2 als auch 24.2+ Versionen der Bibliothek. Am Ende haben Sie ein funktionierendes Beispiel, das Sie in jede .NET‑Lösung einbinden können – keine mysteriösen Referenzen, nur reines C#. + +## Was Sie mitnehmen werden + +- Ein klarer Vergleich des Legacy‑`IOutputStorage`‑Musters gegenüber dem modernen `ResourceHandler`‑Ansatz. +- Vollständiger, copy‑paste‑fertiger Code, der gegen .NET 6+ (oder früher, falls nötig) kompiliert. +- Tipps für Randfälle wie das Entsorgen von Streams, das Verarbeiten großer Payloads und das Testen Ihres benutzerdefinierten Streams. + +> **Pro‑Tipp:** Wenn Sie .NET 8 anvisieren, bietet der neuere `ResourceHandler` integrierte Async‑Unterstützung, die Millisekunden bei Hochdurchsatz‑Szenarien einsparen kann. + +## Memory-Stream in C# erstellen – Legacy‑Ansatz (pre‑24.2) + +Wenn Sie auf einer älteren Version der Bibliothek feststecken, müssen Sie den Vertrag `IOutputStorage` erfüllen. Das Interface verlangt nur eine Methode, die für einen gegebenen Ressourcennamen einen `Stream` zurückgibt. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Warum das funktioniert + +- **Interface‑Vertrag** – Das Framework ruft `CreateStream` auf, wann immer es Ausgaben schreiben muss. +- **Flexibilität** – Da Sie einen `Stream` zurückgeben, können Sie später `MemoryStream` durch `FileStream` oder sogar einen benutzerdefinierten gepufferten Stream ersetzen, ohne den Rest des Codes zu berühren. +- **Ressourcensicherheit** – Der Aufrufer ist für das Entsorgen des zurückgegebenen Streams verantwortlich, weshalb wir `Dispose` nicht innerhalb der Methode aufrufen. + +### Häufige Fallstricke + +| Problem | Was passiert | Lösung | +|---------|--------------|--------| +| Rückgabe eines geschlossenen Streams | Verbraucher erhalten beim Schreiben eine `ObjectDisposedException`. | Stellen Sie sicher, dass der Stream **offen** ist, wenn Sie ihn übergeben. | +| Vergessen, nach dem Schreiben `Position = 0` zu setzen | Daten erscheinen leer, wenn sie später gelesen werden. | Rufen Sie `stream.Seek(0, SeekOrigin.Begin)` vor der Rückgabe auf, wenn Sie ihn vorher befüllen. | +| Verwendung eines riesigen `MemoryStream` für große Dateien | Out‑of‑Memory‑Abstürze. | Wechseln Sie zu einem temporären `FileStream` oder einem benutzerdefinierten gepufferten Stream. | + +## Memory-Stream in C# erstellen – Moderner Ansatz (24.2+) + +Ab Version 24.2 hat die Bibliothek `ResourceHandler` eingeführt. Statt eines Interfaces erben Sie jetzt von einer Basisklasse und überschreiben eine einzige Methode. Das bietet Ihnen einen saubereren, async‑freundlichen Einstiegspunkt. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Warum `ResourceHandler` bevorzugen + +- **Async‑Unterstützung** – Die Methode `HandleResourceAsync` ermöglicht I/O ohne Blockierung von Threads. +- **Integrierte Fehlerbehandlung** – Die Basisklasse fängt Ausnahmen ab und wandelt sie in framework‑spezifische Fehlercodes um. +- **Zukunftssicher** – Neuere Versionen fügen Hooks (z. B. Logging, Telemetrie) hinzu, die nur mit dem Handler‑Muster funktionieren. + +### Umgang mit Randfällen + +1. **Entsorgung** – Das Framework entsorgt den Stream, sobald er fertig ist, aber wenn Sie ein weiteres `IDisposable` (wie einen `FileStream`) einbetten, sollten Sie innerhalb der Methode einen `using`‑Block implementieren und einen Wrapper zurückgeben, der `Dispose` weiterleitet. +2. **Große Payloads** – Wenn Sie Payloads > 100 MB erwarten, ersetzen Sie `MemoryStream` durch einen `FileStream`, der auf eine temporäre Datei zeigt. Beispiel: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – Testen Sie Ihren Handler per Unit‑Test, indem Sie einen Mock `IServiceProvider` injizieren, falls die Basisklasse Dienste aus DI bezieht. Verifizieren Sie, dass `HandleResource` einen Stream zurückgibt, der beschrieben und gelesen werden kann. + +## Wie man einen Stream erstellt – Schnellübersicht + +| Szenario | Empfohlene API | Beispielcode | +|----------|----------------|--------------| +| Einfacher In‑Memory‑Daten | `MemoryStream` | `new MemoryStream()` | +| Große temporäre Dateien | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Netzwerkbasierte Quelle | `NetworkStream` | `new NetworkStream(socket)` | +| Benutzerdefiniertes Puffering | Derive from `Stream` | Siehe [Microsoft docs] for custom stream implementation | + +> **Hinweis:** Setzen Sie immer `stream.Position = 0`, bevor Sie zurückgeben, wenn Sie den Stream vorher befüllen; andernfalls gehen nachgelagerte Leser davon aus, dass der Stream leer ist. + +## Bildillustration + +![Diagramm, das den Prozess zum Erstellen eines Memory-Streams in C# zeigt](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* diagram showing create memory stream c# process + +## Vollständiges ausführbares Beispiel + +Unten finden Sie eine minimale Konsolen‑App, die sowohl den Legacy‑ als auch den modernen Ansatz demonstriert. Sie können sie in ein neues .NET 6‑Konsolenprojekt kopieren und unverändert ausführen. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Erwartete Ausgabe** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +Das Programm zeigt drei Wege, **how to create stream** zu verwenden: das alte `IOutputStorage`, das neue synchrone `HandleResource` und das asynchrone `HandleResourceAsync`. Alle drei geben einen `MemoryStream` zurück, was beweist, dass benutzerdefinierte Stream‑Erstellung unabhängig von der Zielversion funktioniert. + +## Häufig gestellte Fragen (FAQ) + +**F: Muss ich `Dispose` für den zurückgegebenen Stream aufrufen?** +A: Das Framework (oder Ihr Aufrufercode) ist für das Entsorgen verantwortlich. Wenn Sie ein weiteres `IDisposable` in Ihrem zurückgegebenen Stream einbetten, stellen Sie sicher, dass es den `Dispose`‑Aufruf weiterleitet. + +**F: Kann ich einen schreibgeschützten Stream zurückgeben?** +A: Ja, aber der Vertrag erwartet normalerweise einen beschreibbaren Stream. Wenn Sie nur lesen müssen, implementieren Sie `CanWrite => false` und dokumentieren die Einschränkung. + +**F: Was, wenn meine Daten größer sind als der verfügbare RAM?** +A: Wechseln Sie zu einem `FileStream`, der auf einer temporären Datei basiert, oder implementieren Sie einen benutzerdefinierten gepufferten Stream, der in Stücke auf die Festplatte schreibt. + +**F: Gibt es Leistungsunterschiede zwischen den beiden Ansätzen?** +A: Der moderne `ResourceHandler` fügt einen kleinen Overhead durch die zusätzliche Basisklassen‑Logik hinzu, aber die Async‑Version kann den Durchsatz bei hoher Parallelität deutlich steigern. + +## Fazit + +Wir haben gerade **create memory stream c#** aus allen Blickwinkeln behandelt, die Sie in der Praxis antreffen können. Sie wissen jetzt **how to create stream** sowohl mit dem Legacy‑`IOutputStorage`‑Muster als auch mit der neueren `ResourceHandler`‑Klasse, und Sie haben praktische Tipps für **how to handle resources** verantwortungsbewusst erhalten sowie das Muster mit **custom stream creation** für große Dateien oder Async‑Szenarien erweitert. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/german/net/generate-jpg-and-png-images/_index.md b/html/german/net/generate-jpg-and-png-images/_index.md index c4609fed9..3b092f85b 100644 --- a/html/german/net/generate-jpg-and-png-images/_index.md +++ b/html/german/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Die Integration von Aspose.HTML für .NET in Ihre .NET-Projekte ist problemlos. Erfahren Sie, wie Sie mit Aspose.HTML für .NET dynamische Webseiten erstellen. Dieses Schritt-für-Schritt-Tutorial behandelt Voraussetzungen, Namespaces und das Rendern von HTML in Bilder. ### [Generieren Sie PNG-Bilder mit ImageDevice in .NET mit Aspose.HTML](./generate-png-images-by-imagedevice/) Erfahren Sie, wie Sie mit Aspose.HTML für .NET HTML-Dokumente bearbeiten, HTML in Bilder konvertieren und vieles mehr. Schritt-für-Schritt-Anleitung mit FAQs. +### [Antialiasing beim Konvertieren von DOCX in PNG/JPG aktivieren](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Erfahren Sie, wie Sie beim Konvertieren von DOCX-Dokumenten in PNG oder JPG Antialiasing aktivieren, um hochwertige Bilder zu erhalten. ## Abschluss @@ -52,4 +54,4 @@ Worauf also warten? Entdecken Sie noch heute die Welt der HTML-zu-Bild-Konvertie {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/german/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/german/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..621c8586d --- /dev/null +++ b/html/german/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,278 @@ +--- +category: general +date: 2025-12-27 +description: Erfahren Sie, wie Sie Antialiasing beim Konvertieren von DOCX zu PNG + oder JPG aktivieren. Diese Schritt‑für‑Schritt‑Anleitung behandelt außerdem das + Konvertieren von DOCX zu PNG und das Konvertieren von DOCX zu JPG. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: de +og_description: Wie man Antialiasing beim Konvertieren von DOCX-Dateien in PNG oder + JPG aktiviert. Folgen Sie dieser vollständigen Anleitung für ein glattes, hochwertiges + Ergebnis. +og_title: Wie man Antialiasing beim Konvertieren von DOCX in PNG/JPG aktiviert +tags: +- C# +- Document Rendering +- Image Processing +title: Wie man Antialiasing beim Konvertieren von DOCX in PNG/JPG aktiviert +url: /de/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Wie man Antialiasing beim Konvertieren von DOCX zu PNG/JPG aktiviert + +Haben Sie sich jemals gefragt **wie man Antialiasing aktiviert**, damit Ihre konvertierten DOCX‑Bilder scharf statt gezackt aussehen? Sie sind nicht allein. Viele Entwickler stoßen auf ein Problem, wenn sie ein Word‑Dokument in ein PNG‑ oder JPG‑Bild umwandeln und dabei unscharfe Kanten bei Linien und Text erhalten. Die gute Nachricht? Mit ein paar Zeilen C# können Sie diese grobe Ausgabe in pixelperfekte Grafiken verwandeln – ohne Drittanbieter‑Bildeditoren. + +In diesem Tutorial gehen wir den gesamten Prozess des **convert docx to png** und **convert docx to jpg** mit einer modernen Rendering‑Bibliothek durch. Sie lernen nicht nur *how to convert docx*, sondern auch *how to render docx* mit aktiviertem Antialiasing und Hinting, sodass jede Kurve und jedes Zeichen glatt wirkt. Vorkenntnisse in Grafikprogrammierung sind nicht nötig; ein einfaches C#‑Setup und eine DOCX‑Datei, die Sie in ein Bild umwandeln möchten, reichen aus. + +--- + +## Was Sie benötigen + +- **.NET 6+** (oder .NET Framework 4.6+, wenn Sie die klassische Laufzeit bevorzugen) +- Eine **DOCX**‑Datei, die Sie rendern möchten (legen Sie sie für das Demo‑Beispiel in einen Ordner namens `input`) +- Das **Aspose.Words for .NET** NuGet‑Paket (oder jede Bibliothek, die `Document`, `ImageRenderingOptions` und `ImageDevice` bereitstellt). Installieren Sie es mit: + +```bash +dotnet add package Aspose.Words +``` + +Das war’s – keine zusätzlichen Bild‑Verarbeitungstools nötig. + +--- + +## Schritt 1: DOCX‑Dokument laden (how to convert docx) + +Zuerst benötigen wir ein `Document`‑Objekt, das die Quelldatei repräsentiert. Denken Sie daran wie an die digitale Version Ihrer Word‑Datei, die die Bibliothek lesen und manipulieren kann. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Warum das wichtig ist:** Das Laden des Dokuments ist die Grundlage für *how to render docx*. Wenn die Datei nicht gelesen werden kann, funktionieren die nachfolgenden Schritte nicht, daher beginnen wir hier. + +--- + +## Schritt 2: Bild‑Rendering‑Optionen konfigurieren (enable antialiasing) + +Jetzt kommt der magische Teil – das Einschalten von Antialiasing und Hinting. Antialiasing glättet die gezackten Kanten, die Sie normalerweise bei diagonalen Linien sehen, während Hinting die Klarheit kleiner Texte verbessert. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Pro‑Tipp:** Wenn Sie bei sehr großen Dokumenten einen Performance‑Boost benötigen, können Sie `UseAntialiasing` deaktivieren, aber die visuelle Qualität wird merklich sinken. + +--- + +## Schritt 3: Ausgabeformat wählen – PNG oder JPG (convert docx to png / convert docx to jpg) + +Die Klasse `ImageDevice` bestimmt, wohin die gerenderten Seiten gehen. Durch den Austausch von `ImageSaveOptions` können Sie entweder PNG (verlustfrei) oder JPG (komprimiert) ausgeben. Im Folgenden erstellen wir zwei separate Geräte, sodass Sie beide Formate in einem Durchlauf erzeugen können. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Warum beides?** PNG bewahrt jedes Pixel, was perfekt ist, wenn Sie absolute Treue benötigen (z. B. beim Druck). JPG hingegen komprimiert das Bild, wodurch es schneller auf einer Website geladen werden kann. + +--- + +## Schritt 4: Dokumentseiten in Bilder rendern (how to render docx) + +Mit den vorbereiteten Geräten weisen wir das `Document` an, jede Seite zu rendern. Die Bibliothek durchläuft automatisch alle Seiten und speichert sie nach dem von uns definierten Namensmuster. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Nach dem Ausführen des Codes finden Sie eine Reihe von Dateien wie `page_0.png`, `page_1.png`, … und `page_0.jpg`, `page_1.jpg` im Ordner `output`. Jede Bilddatei hat Antialiasing angewendet, sodass Linien glatt und Text kristallklar ist. + +--- + +## Schritt 5: Ergebnis überprüfen (expected output) + +Öffnen Sie eines der erzeugten Bilder. Sie sollten sehen: + +- **Glatte Kurven** bei Formen und Diagrammen (keine Treppeneffekte). +- **Scharfen, gut lesbaren Text** selbst bei kleinen Schriftgrößen, dank Hinting. +- **Konsistente Farben** zwischen PNG und JPG (obwohl JPG bei niedrigerer Qualität leichte Kompressionsartefakte zeigen kann). + +Falls Sie Unschärfen bemerken, prüfen Sie, ob `UseAntialiasing` auf `true` gesetzt ist und ob Ihr Quell‑DOCX keine niedrig aufgelösten Rasterbilder enthält. + +--- + +## Häufige Fragen & Sonderfälle + +### Was, wenn ich nur eine einzelne Seite benötige? + +Sie können eine bestimmte Seite rendern, indem Sie die `PageInfo`‑Überladung verwenden: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Kann ich die DPI (dots per inch) für eine höherauflösende Ausgabe ändern? + +Absolut. Passen Sie die `Resolution`‑Eigenschaft von `ImageRenderingOptions` an: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Eine höhere DPI bedeutet größere Dateien, aber der Antialiasing‑Effekt wird noch deutlicher. + +### Wie gehe ich mit sehr großen DOCX‑Dateien um, ohne den Speicher zu überlasten? + +Rendern Sie die Seiten einzeln und entsorgen Sie das Gerät nach jeder Iteration: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### Ist es möglich, in andere Formate wie BMP oder TIFF zu konvertieren? + +Ja – tauschen Sie einfach `SaveFormat.Png` oder `SaveFormat.Jpeg` gegen `SaveFormat.Bmp` bzw. `SaveFormat.Tiff` aus. Die gleichen Antialiasing‑Einstellungen bleiben erhalten. + +--- + +## Vollständiges Beispiel (Copy‑Paste‑bereit) + +Unten finden Sie das komplette Programm, das Sie in ein neues Konsolen‑Projekt einfügen können. Es enthält alle `using`‑Anweisungen, Fehlerbehandlung und Kommentare zur Übersicht. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Ergebnis:** Nach dem Kompilieren (`dotnet run`) sehen Sie eine Reihe von PNG‑ und JPG‑Dateien im Verzeichnis `output`, jeweils mit angewendetem Antialiasing. + +--- + +## Fazit + +Wir haben **wie man Antialiasing aktiviert** behandelt, wenn Sie **DOCX zu PNG oder JPG konvertieren**, die genauen Schritte zu **convert docx to png**, **convert docx to jpg** durchgegangen und sogar einen Einblick in **how to render docx** für individuelle Anforderungen gegeben. + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/greek/net/advanced-features/_index.md b/html/greek/net/advanced-features/_index.md index 28c4b96db..ae882ac9d 100644 --- a/html/greek/net/advanced-features/_index.md +++ b/html/greek/net/advanced-features/_index.md @@ -32,6 +32,8 @@ url: /el/net/advanced-features/ Μάθετε πώς να χρησιμοποιείτε το Aspose.HTML για .NET για τον αποτελεσματικό χειρισμό εγγράφων HTML. Βήμα προς βήμα μάθημα για προγραμματιστές. ### [Πάροχος ροής μνήμης σε .NET με Aspose.HTML](./memory-stream-provider/) Μάθετε πώς να δημιουργείτε εκπληκτικά έγγραφα HTML στο .NET με το Aspose.HTML. Ακολουθήστε το βήμα προς βήμα σεμινάριο και ξεκλειδώστε τη δύναμη του χειρισμού HTML. +### [Δημιουργία μνήμης ροής c# – Οδηγός δημιουργίας προσαρμοσμένης ροής](./create-memory-stream-c-custom-stream-creation-guide/) +Μάθετε πώς να δημιουργήσετε προσαρμοσμένη μνήμη ροής σε C# χρησιμοποιώντας το Aspose.HTML για .NET, με παραδείγματα κώδικα. ### [Web Scraping σε .NET με Aspose.HTML](./web-scraping/) Μάθετε να χειρίζεστε έγγραφα HTML στο .NET με το Aspose.HTML. Πλοηγηθείτε, φιλτράρετε, αναζητήστε και επιλέξτε στοιχεία αποτελεσματικά για βελτιωμένη ανάπτυξη ιστού. ### [Χρησιμοποιήστε την ιδιότητα εκτεταμένου περιεχομένου στο .NET με το Aspose.HTML](./use-extended-content-property/) @@ -52,4 +54,4 @@ url: /el/net/advanced-features/ {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/greek/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/greek/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..dcb248a34 --- /dev/null +++ b/html/greek/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,266 @@ +--- +category: general +date: 2025-12-27 +description: Δημιουργήστε γρήγορα ένα MemoryStream σε C# με έναν οδηγό βήμα‑βήμα. + Μάθετε πώς να δημιουργείτε stream, να διαχειρίζεστε πόρους και να υλοποιείτε προσαρμοσμένη + δημιουργία stream στο .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: el +og_description: Δημιουργήστε ροή μνήμης c# σε δευτερόλεπτα. Αυτό το σεμινάριο δείχνει + πώς να δημιουργήσετε ροή, να διαχειριστείτε πόρους και να δημιουργήσετε προσαρμοσμένη + ροή με σύγχρονα .NET API. +og_title: Δημιουργία ροής μνήμης c# – Πλήρης Οδηγός Προσαρμοσμένης Ροής +tags: +- stream +- csharp +- .net +- resource-handling +title: Δημιουργία ροής μνήμης c# – Οδηγός δημιουργίας προσαρμοσμένης ροής +url: /el/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Δημιουργία memory stream c# – Οδηγός δημιουργίας προσαρμοσμένου stream + +Έχετε χρειαστεί ποτέ να **create memory stream c#** αλλά δεν ήσασταν σίγουροι ποιο API να επιλέξετε; Δεν είστε ο μόνος. Σε πολλά παλιά έργα θα βρείτε το `IOutputStorage`, ενώ τα νεότερα codebases προτιμούν το `ResourceHandler`. Σε κάθε περίπτωση, ο στόχος είναι ο ίδιος: να παραχθεί ένα `Stream` που το framework σας μπορεί να καταναλώσει. + +Σε αυτό το tutorial θα μάθετε **how to create stream** αντικείμενα, **how to handle resources** με ασφάλεια, και θα κυριαρχήσετε στη **custom stream creation** για εκδόσεις προ‑24.2 και 24.2+ της βιβλιοθήκης. Στο τέλος θα έχετε ένα λειτουργικό παράδειγμα που μπορείτε να ενσωματώσετε σε οποιαδήποτε .NET λύση—χωρίς μυστικές αναφορές, μόνο καθαρό C#. + +## Τι θα αποκομίσετε + +- Μια σαφής σύγκριση του legacy `IOutputStorage` pattern με τη σύγχρονη προσέγγιση `ResourceHandler`. +- Πλήρης, έτοιμος για copy‑paste κώδικας που μεταγλωττίζεται σε .NET 6+ (ή παλαιότερο, αν το χρειάζεστε). +- Συμβουλές για edge cases όπως η διαχείριση του disposing των streams, η επεξεργασία μεγάλων payloads, και ο έλεγχος του custom stream σας. + +> **Pro tip:** Αν στοχεύετε σε .NET 8, το νέο `ResourceHandler` σας παρέχει ενσωματωμένη υποστήριξη async, η οποία μπορεί να μειώσει κατά χιλιοστά του δευτερολέπτου τα σενάρια υψηλής απόδοσης. + +## Create memory stream c# – Παράδοση (προ‑24.2) + +Όταν είστε περιορισμένοι σε παλαιότερη έκδοση της βιβλιοθήκης, η σύμβαση που πρέπει να ικανοποιήσετε είναι το `IOutputStorage`. Η διεπαφή ζητά μόνο μια μέθοδο που επιστρέφει ένα `Stream` για ένα συγκεκριμένο όνομα πόρου. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Γιατί λειτουργεί αυτό + +- **Σύμβαση διεπαφής** – Το framework θα καλέσει το `CreateStream` όποτε χρειάζεται να γράψει έξοδο. +- **Ευελιξία** – Επειδή επιστρέφετε ένα `Stream`, μπορείτε να αντικαταστήσετε το `MemoryStream` με `FileStream` ή ακόμη και με ένα προσαρμοσμένο buffered stream αργότερα χωρίς να αγγίξετε τον υπόλοιπο κώδικα. +- **Ασφάλεια πόρων** – Ο καλών είναι υπεύθυνος για το disposing του επιστρεφόμενου stream, γι' αυτό δεν καλούμε το `Dispose` μέσα στη μέθοδο. + +### Συνηθισμένα προβλήματα + +| Πρόβλημα | Τι συμβαίνει | Διόρθωση | +|----------|--------------|----------| +| Επιστροφή κλειστού stream | Οι καταναλωτές θα λάβουν `ObjectDisposedException` κατά τη γραφή. | Βεβαιωθείτε ότι το stream είναι **ανοιχτό** όταν το παραδίδετε. | +| Ξεχάτε να ορίσετε `Position = 0` μετά τη γραφή | Τα δεδομένα φαίνονται κενά όταν διαβαστούν αργότερα. | Καλέστε `stream.Seek(0, SeekOrigin.Begin)` πριν την επιστροφή αν έχετε προ‑συμπληρώσει το stream. | +| Χρήση τεράστιου `MemoryStream` για μεγάλα αρχεία | Καταρρεύσεις λόγω έλλειψης μνήμης. | Αλλάξτε σε προσωρινό `FileStream` ή σε προσαρμοσμένο buffered stream. | + +## Create memory stream c# – Σύγχρονη προσέγγιση (24.2+) + +Από την έκδοση 24.2 η βιβλιοθήκη εισήγαγε το `ResourceHandler`. Αντί για διεπαφή, τώρα κληρονομείτε από μια βασική κλάση και υπερκαλύπτετε μια μόνο μέθοδο. Αυτό σας παρέχει ένα πιο καθαρό, φιλικό προς το async σημείο εισόδου. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Γιατί να προτιμήσετε το `ResourceHandler` + +- **Υποστήριξη Async** – Η μέθοδος `HandleResourceAsync` σας επιτρέπει να εκτελείτε I/O χωρίς να μπλοκάρει νήματα. +- **Ενσωματωμένη διαχείριση σφαλμάτων** – Η βασική κλάση παγιδεύει εξαιρέσεις και τις μετατρέπει σε κωδικούς σφαλμάτων ειδικούς για το framework. +- **Προετοιμασμένο για το μέλλον** – Νεότερες εκδόσεις προσθέτουν hooks (π.χ., logging, telemetry) που λειτουργούν μόνο με το πρότυπο handler. + +### Διαχείριση edge‑case + +1. **Disposal** – Το framework κάνει dispose το stream μετά το τέλος, αλλά αν τυλίξετε ένα άλλο disposable (όπως `FileStream`) θα πρέπει να υλοποιήσετε ένα `using` block μέσα στη μέθοδο και να επιστρέψετε έναν wrapper που προωθεί το `Dispose`. +2. **Large payloads** – Αν προβλέπετε payloads > 100 MB, αντικαταστήστε το `MemoryStream` με `FileStream` που δείχνει σε ένα προσωρινό αρχείο. Παράδειγμα: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – Κάντε unit‑test το handler σας εισάγοντας ένα mock `IServiceProvider` αν η βασική κλάση αντλεί υπηρεσίες από DI. Επαληθεύστε ότι το `HandleResource` επιστρέφει ένα stream που μπορεί να γραφτεί και να διαβαστεί. + +## Πώς να δημιουργήσετε stream – Γρήγορο cheat sheet + +| Σενάριο | Συνιστώμενο API | Δείγμα Κώδικα | +|----------|----------------|---------------| +| Απλά δεδομένα στη μνήμη | `MemoryStream` | `new MemoryStream()` | +| Μεγάλα προσωρινά αρχεία | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Πηγή δικτύου | `NetworkStream` | `new NetworkStream(socket)` | +| Προσαρμοσμένη προσωρινή αποθήκευση | Derive from `Stream` | See [Microsoft docs] for custom stream implementation | + +> **Σημείωση:** Πάντα ορίστε `stream.Position = 0` πριν την επιστροφή αν έχετε προ‑συμπληρώσει το stream· διαφορετικά οι downstream αναγνώστες θα θεωρήσουν ότι το stream είναι κενό. + +## Εικονογραφική απεικόνιση + +![Διάγραμμα που δείχνει τη διαδικασία create memory stream c# process](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* διάγραμμα που δείχνει τη διαδικασία create memory stream c# process + +## Πλήρες εκτελέσιμο παράδειγμα + +Παρακάτω υπάρχει μια ελάχιστη εφαρμογή console που δείχνει και τις δύο προσεγγίσεις, legacy και modern. Μπορείτε να το αντιγράψετε‑και‑επικολλήσετε σε ένα νέο .NET 6 console project και να το εκτελέσετε όπως είναι. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Αναμενόμενο αποτέλεσμα** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +Το πρόγραμμα δείχνει τρεις τρόπους για **how to create stream**: το παλιό `IOutputStorage`, το νέο συγχρονισμένο `HandleResource` και το ασύγχρονο `HandleResourceAsync`. Και τα τρία επιστρέφουν ένα `MemoryStream`, αποδεικνύοντας ότι η custom stream creation λειτουργεί ανεξάρτητα από την έκδοση στόχο. + +## Συχνές ερωτήσεις (FAQ) + +**Q: Χρειάζεται να καλέσω `Dispose` στο stream που λαμβάνω;** +A: Το framework (ή ο κώδικας που καλεί) είναι υπεύθυνο για το disposal. Αν τυλίξετε ένα άλλο disposable μέσα στο επιστρεφόμενο stream, βεβαιωθείτε ότι προωθεί την κλήση `Dispose`. + +**Q: Μπορώ να επιστρέψω ένα read‑only stream;** +A: Ναι, αλλά η σύμβαση συνήθως αναμένει ένα writable stream. Αν χρειάζεστε μόνο ανάγνωση, υλοποιήστε `CanWrite => false` και τεκμηριώστε τον περιορισμό. + +**Q: Τι γίνεται αν τα δεδομένα μου είναι μεγαλύτερα από τη διαθέσιμη RAM;** +A: Μεταβείτε σε `FileStream` που βασίζεται σε προσωρινό αρχείο, ή υλοποιήστε ένα custom buffered stream που γράφει στο δίσκο σε κομμάτια. + +**Q: Υπάρχει διαφορά απόδοσης μεταξύ των δύο προσεγγίσεων;** +A: Το σύγχρονο `ResourceHandler` προσθέτει μικρό overhead λόγω της επιπλέον λογικής της βάσης, αλλά η async έκδοση μπορεί να βελτιώσει δραματικά το throughput υπό υψηλή ταυτόχρονη χρήση. + +## Συμπέρασμα + +Μόλις καλύψαμε το **create memory stream c#** από κάθε γωνία που μπορεί να συναντήσετε. Τώρα ξέρετε **how to create stream** χρησιμοποιώντας τόσο το legacy pattern `IOutputStorage` όσο και τη νέα κλάση `ResourceHandler`, καθώς επίσης είδατε πρακτικές συμβουλές για **how to handle resources** με υπευθυνότητα και για την επέκταση του pattern με **custom stream creation** για μεγάλα αρχεία ή async σενάρια. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/greek/net/generate-jpg-and-png-images/_index.md b/html/greek/net/generate-jpg-and-png-images/_index.md index b33926382..fb2e1c1fe 100644 --- a/html/greek/net/generate-jpg-and-png-images/_index.md +++ b/html/greek/net/generate-jpg-and-png-images/_index.md @@ -18,7 +18,7 @@ url: /el/net/generate-jpg-and-png-images/ ## Γιατί το Aspose.HTML για .NET; -Αρχικά, ας συζητήσουμε γιατί πρέπει να επιλέξετε Aspose.HTML για .NET για δημιουργία εικόνων. Αυτή η βιβλιοθήκη παρέχει έναν απρόσκοπτο και αποτελεσματικό τρόπο μετατροπής HTML σε διάφορες μορφές εικόνας, συμπεριλαμβανομένων των JPG και PNG. Είτε θέλετε να δημιουργήσετε συναρπαστικές προεπισκοπήσεις ιστότοπου, να δημιουργήσετε μικρογραφίες εικόνων ή να δημιουργήσετε οπτικά ελκυστικές αναφορές, το Aspose.HTML για .NET σας καλύπτει. +Αρχικά, ας συζητήσουμε γιατί πρέπει να επιλέξετε Aspose.HTML για .NET για δημιουργία εικόνων. Αυτή η βιβλιοθήκη παρέχει έναν απρόσκοπτο και αποτελεσματικό τρόπο μετατροπής HTML σε διάφορες μορφές εικόνας, συμπλαμβανομένων των JPG και PNG. Είτε θέλετε να δημιουργήσετε συναρπαστικές προεπισκοπήσεις ιστότοπου, να δημιουργήσετε μικρογραφίες εικόνων ή να δημιουργήσετε οπτικά ελκυστικές αναφορές, το Aspose.HTML για .NET σας καλύπτει. ## Ξεκινώντας @@ -41,6 +41,8 @@ url: /el/net/generate-jpg-and-png-images/ Μάθετε πώς να δημιουργείτε δυναμικές ιστοσελίδες χρησιμοποιώντας το Aspose.HTML για .NET. Αυτό το σεμινάριο βήμα προς βήμα καλύπτει τις προϋποθέσεις, τους χώρους ονομάτων και την απόδοση HTML σε εικόνες. ### [Δημιουργήστε εικόνες PNG από ImageDevice σε .NET με Aspose.HTML](./generate-png-images-by-imagedevice/) Μάθετε να χρησιμοποιείτε το Aspose.HTML για .NET για χειρισμό εγγράφων HTML, μετατροπή HTML σε εικόνες και πολλά άλλα. Βήμα προς βήμα μάθημα με συχνές ερωτήσεις. +### [Πώς να ενεργοποιήσετε το Antialiasing κατά τη μετατροπή DOCX σε PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Μάθετε πώς να βελτιώσετε την ποιότητα των εικόνων ενεργοποιώντας το antialiasing κατά τη μετατροπή αρχείων DOCX σε PNG ή JPG. ## Σύναψη @@ -52,4 +54,4 @@ url: /el/net/generate-jpg-and-png-images/ {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/greek/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/greek/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..be5027d79 --- /dev/null +++ b/html/greek/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,261 @@ +--- +category: general +date: 2025-12-27 +description: Μάθετε πώς να ενεργοποιήσετε το antialiasing κατά τη μετατροπή DOCX σε + PNG ή JPG. Αυτός ο οδηγός βήμα‑βήμα καλύπτει επίσης τη μετατροπή docx σε png και + τη μετατροπή docx σε jpg. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: el +og_description: Πώς να ενεργοποιήσετε το antialiasing κατά τη μετατροπή αρχείων DOCX + σε PNG ή JPG. Ακολουθήστε αυτόν τον πλήρη οδηγό για ομαλή, υψηλής ποιότητας έξοδο. +og_title: Πώς να ενεργοποιήσετε την εξομάλυνση κατά τη μετατροπή DOCX σε PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: Πώς να ενεργοποιήσετε την εξομάλυνση κατά τη μετατροπή DOCX σε PNG/JPG +url: /el/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Πώς να Ενεργοποιήσετε το Antialiasing Κατά τη Μετατροπή DOCX σε PNG/JPG + +Έχετε αναρωτηθεί ποτέ **πώς να ενεργοποιήσετε το antialiasing** ώστε οι μετατρεπόμενες εικόνες DOCX να φαίνονται καθαρές αντί για τριγωνικές; Δεν είστε μόνοι. Πολλοί προγραμματιστές συναντούν πρόβλημα όταν πρέπει να μετατρέψουν ένα έγγραφο Word σε PNG ή JPG και καταλήγουν με θολές άκρες σε γραμμές και κείμενο. Τα καλά νέα; Με λίγες γραμμές C# μπορείτε να μετατρέψετε αυτό το ακατάστατο αποτέλεσμα σε γραφικά pixel‑perfect—χωρίς να χρειάζεστε εξωτερικούς επεξεργαστές εικόνας. + +Σε αυτό το tutorial θα περάσουμε από όλη τη διαδικασία **convert docx to png** και **convert docx to jpg** χρησιμοποιώντας μια σύγχρονη βιβλιοθήκη rendering. Θα μάθετε όχι μόνο *πώς να μετατρέψετε docx* αλλά και *πώς να render docx* με ενεργοποιημένο antialiasing και hinting, ώστε κάθε καμπύλη και χαρακτήρας να φαίνεται ομαλός. Δεν απαιτείται προηγούμενη εμπειρία προγραμματισμού γραφικών· αρκεί μια βασική ρύθμιση C# και ένα αρχείο DOCX που θέλετε να μετατρέψετε σε εικόνα. + +--- + +## Τι Θα Χρειαστεί + +- **.NET 6+** (ή .NET Framework 4.6+ εάν προτιμάτε το κλασικό runtime) +- Ένα αρχείο **DOCX** που θέλετε να render (τοποθετήστε το σε φάκελο που ονομάζεται `input` για την επίδειξη) +- Το πακέτο **Aspose.Words for .NET** NuGet (ή οποιαδήποτε βιβλιοθήκη που εκθέτει `Document`, `ImageRenderingOptions` και `ImageDevice`). Εγκαταστήστε το με: + +```bash +dotnet add package Aspose.Words +``` + +Αυτό είναι—δεν απαιτούνται επιπλέον εργαλεία επεξεργασίας εικόνας. + +## Βήμα 1: Φόρτωση του Εγγράφου DOCX (how to convert docx) + +Πρώτα χρειάζεται ένα αντικείμενο `Document` που αντιπροσωπεύει το αρχείο προέλευσης. Σκεφτείτε το ως την ψηφιακή έκδοση του αρχείου Word που η βιβλιοθήκη μπορεί να διαβάσει και να επεξεργαστεί. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Γιατί είναι σημαντικό:** Η φόρτωση του εγγράφου είναι η βάση για *how to render docx*. Αν το αρχείο δεν μπορεί να διαβαστεί, κανένα από τα επόμενα βήματα δεν θα λειτουργήσει, γι' αυτό ξεκινούμε εδώ. + +## Βήμα 2: Διαμόρφωση των Επιλογών Rendering Εικόνας (enable antialiasing) + +Τώρα έρχεται το μαγικό μέρος—η ενεργοποίηση του antialiasing και του hinting. Το antialiasing λειαίνει τις τριγωνικές άκρες που συνήθως βλέπετε σε διαγώνιες γραμμές, ενώ το hinting βελτιώνει την καθαρότητα του μικρού κειμένου. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Συμβουλή:** Αν χρειαστείτε αύξηση απόδοσης σε τεράστια έγγραφα, μπορείτε να απενεργοποιήσετε το `UseAntialiasing`, αλλά η οπτική ποιότητα θα μειωθεί αισθητά. + +## Βήμα 3: Επιλογή Μορφής Εξόδου – PNG ή JPG (convert docx to png / convert docx to jpg) + +Η κλάση `ImageDevice` καθορίζει πού θα αποθηκευτούν οι render-αρισμένες σελίδες. Αλλάζοντας το `ImageSaveOptions` μπορείτε να εξάγετε είτε PNG (χωρίς απώλειες) είτε JPG (συμπιεσμένο). Παρακάτω δημιουργούμε δύο ξεχωριστές συσκευές ώστε να μπορείτε να δημιουργήσετε και τις δύο μορφές σε μία εκτέλεση. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Γιατί και τα δύο;** Το PNG διατηρεί κάθε pixel, κάτι τέλειο όταν χρειάζεστε ακριβή πιστότητα (π.χ., εκτύπωση). Το JPG, από την άλλη, συμπιέζει την εικόνα, κάνοντάς την πιο γρήγορη στη φόρτωση σε ιστοσελίδα. + +## Βήμα 4: Rendering των Σελίδων του Εγγράφου σε Εικόνες (how to render docx) + +Με τις συσκευές έτοιμες, λέμε στο `Document` να render κάθε σελίδα. Η βιβλιοθήκη θα κάνει αυτόματα βρόχο σε όλες τις σελίδες και θα τις αποθηκεύσει χρησιμοποιώντας το μοτίβο ονοματοδοσίας που ορίσαμε. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Αφού εκτελέσετε τον κώδικα, θα βρείτε μια σειρά αρχείων όπως `page_0.png`, `page_1.png`, … και `page_0.jpg`, `page_1.jpg` μέσα στο φάκελο `output`. Κάθε εικόνα θα έχει εφαρμοσμένο antialiasing, έτσι οι γραμμές είναι ομαλές και το κείμενο κρυστάλλινα καθαρό. + +## Βήμα 5: Επαλήθευση του Αποτελέσματος (expected output) + +Ανοίξτε οποιαδήποτε από τις παραγόμενες εικόνες. Θα πρέπει να δείτε: + +- **Ομαλές καμπύλες** σε σχήματα και γραφήματα (χωρίς τετράγωνα artifacts). +- **Καθαρό, αναγνώσιμο κείμενο** ακόμη και σε μικρά μεγέθη γραμματοσειράς, χάρη στο hinting. +- **Συνεπή χρώματα** μεταξύ PNG και JPG (αν και το JPG μπορεί να εμφανίσει ελαφρά artifacts συμπίεσης αν μειώσετε την ποιότητα). + +Αν παρατηρήσετε θολότητα, ελέγξτε ξανά ότι το `UseAntialiasing` είναι ορισμένο σε `true` και ότι το πηγαίο DOCX δεν περιέχει εικόνες raster χαμηλής ανάλυσης. + +## Συχνές Ερωτήσεις & Ακραίες Περιπτώσεις + +### Τι γίνεται αν χρειάζομαι μόνο μία σελίδα; + +Μπορείτε να render μια συγκεκριμένη σελίδα χρησιμοποιώντας την υπερφόρτωση `PageInfo`: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Μπορώ να αλλάξω το DPI (dots per inch) για υψηλότερη ανάλυση εξόδου; + +Απόλυτα. Ρυθμίστε την ιδιότητα `Resolution` στο `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Υψηλότερο DPI σημαίνει μεγαλύτερα αρχεία, αλλά το αποτέλεσμα του antialiasing γίνεται ακόμη πιο εμφανές. + +### Πώς να διαχειριστώ μεγάλα αρχεία DOCX χωρίς να εξαντληθεί η μνήμη; + +Render τις σελίδες μία‑μία και απελευθερώστε τη συσκευή μετά από κάθε επανάληψη: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### Είναι δυνατόν να μετατρέψετε σε άλλες μορφές όπως BMP ή TIFF; + +Ναι—απλώς αντικαταστήστε το `SaveFormat.Png` ή `SaveFormat.Jpeg` με `SaveFormat.Bmp` ή `SaveFormat.Tiff`. Οι ίδιες ρυθμίσεις antialiasing μεταφέρονται. + +## Πλήρες Παράδειγμα Εργασίας (Έτοιμο για Αντιγραφή‑Επικόλληση) + +Παρακάτω είναι το πλήρες πρόγραμμα που μπορείτε να ενσωματώσετε σε ένα νέο έργο console. Περιλαμβάνει όλες τις δηλώσεις using, διαχείριση σφαλμάτων και σχόλια για σαφήνεια. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Αποτέλεσμα:** Μετά τη μεταγλώττιση (`dotnet run`) θα δείτε μια σειρά PNG και JPG αρχείων στον φάκελο `output`, το καθένα με εφαρμοσμένο antialiasing. + +## Συμπέρασμα + +Καλύψαμε **πώς να ενεργοποιήσετε το antialiasing** όταν **μετατρέπετε DOCX σε PNG ή JPG**, περάσαμε από τα ακριβή βήματα για **convert docx to png**, **convert docx to jpg**, και ακόμη αγγίξαμε το **how to render docx** για προσαρμοσμένες + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hindi/net/advanced-features/_index.md b/html/hindi/net/advanced-features/_index.md index 0bfead09c..c4e34e6b7 100644 --- a/html/hindi/net/advanced-features/_index.md +++ b/html/hindi/net/advanced-features/_index.md @@ -42,7 +42,7 @@ Aspose.HTML के साथ .NET में HTML दस्तावेज़ो .NET के लिए Aspose.HTML के साथ HTML को PDF, XPS और छवियों में कैसे बदलें, यह जानें। कोड उदाहरणों और FAQ के साथ चरण-दर-चरण ट्यूटोरियल। ### [Aspose.HTML के साथ .NET में HTML टेम्पलेट्स का उपयोग करना](./using-html-templates/) JSON डेटा से HTML दस्तावेज़ों को गतिशील रूप से जेनरेट करने के लिए .NET के लिए Aspose.HTML का उपयोग करना सीखें। अपने .NET अनुप्रयोगों में HTML हेरफेर की शक्ति का उपयोग करें। - +### [मेमोरी स्ट्रीम बनाएं c# – कस्टम स्ट्रीम निर्माण गाइड](./create-memory-stream-c-custom-stream-creation-guide/) ## निष्कर्ष @@ -52,4 +52,4 @@ JSON डेटा से HTML दस्तावेज़ों को गति {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hindi/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/hindi/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..f823380c5 --- /dev/null +++ b/html/hindi/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,268 @@ +--- +category: general +date: 2025-12-27 +description: C# में मेमोरी स्ट्रीम जल्दी बनाएं, चरण-दर-चरण गाइड के साथ। सीखें कैसे + स्ट्रीम बनाएं, संसाधनों को संभालें, और .NET में कस्टम स्ट्रीम निर्माण लागू करें। +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: hi +og_description: सेकंड में C# मेमोरी स्ट्रीम बनाएं। यह ट्यूटोरियल दिखाता है कि स्ट्रीम + कैसे बनाएं, संसाधनों को कैसे संभालें, और आधुनिक .NET APIs के साथ कस्टम स्ट्रीम निर्माण + कैसे करें। +og_title: मेमोरी स्ट्रीम बनाएं C# – पूर्ण कस्टम स्ट्रीम गाइड +tags: +- stream +- csharp +- .net +- resource-handling +title: मेमोरी स्ट्रीम बनाएं C# – कस्टम स्ट्रीम निर्माण गाइड +url: /hi/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Create memory stream c# – कस्टम स्ट्रीम निर्माण गाइड + +क्या आपको कभी **create memory stream c#** बनाने की ज़रूरत पड़ी लेकिन नहीं पता था कि कौन सा API चुनें? आप अकेले नहीं हैं। कई लेगेसी प्रोजेक्ट्स में आपको `IOutputStorage` मिलेगा, जबकि नए कोडबेस `ResourceHandler` को प्राथमिकता देते हैं। किसी भी तरह, लक्ष्य वही है: एक `Stream` बनाना जिसे आपका फ्रेमवर्क उपयोग कर सके। + +इस ट्यूटोरियल में आप सीखेंगे **how to create stream** ऑब्जेक्ट्स, **how to handle resources** को सुरक्षित रूप से कैसे संभालें, और **custom stream creation** में महारत हासिल करेंगे, चाहे लाइब्रेरी का प्री‑24.2 संस्करण हो या 24.2+ संस्करण। अंत तक आपके पास एक कार्यशील उदाहरण होगा जिसे आप किसी भी .NET सॉल्यूशन में डाल सकते हैं—कोई रहस्यमय रेफ़रेंसेज़ नहीं, सिर्फ शुद्ध C#। + +## आप क्या सीखेंगे + +- लेगेसी `IOutputStorage` पैटर्न और आधुनिक `ResourceHandler` एप्रोच की स्पष्ट तुलना। +- पूर्ण, कॉपी‑पेस्ट‑रेडी कोड जो .NET 6+ (या यदि आवश्यक हो तो पुराना) के खिलाफ कम्पाइल होता है। +- ऐसे किनारे के मामलों के टिप्स जैसे स्ट्रीम्स को डिस्पोज़ करना, बड़े पेलोड को संभालना, और आपके कस्टम स्ट्रीम का परीक्षण करना। + +> **Pro tip:** यदि आप .NET 8 को टार्गेट कर रहे हैं, तो नया `ResourceHandler` बिल्ट‑इन async सपोर्ट देता है, जो हाई‑थ्रूपुट परिदृश्यों में मिलीसेकंड बचा सकता है। + +--- + +## Create memory stream c# – लेगेसी एप्रोच (pre‑24.2) + +जब आप लाइब्रेरी के पुराने संस्करण पर फंसे होते हैं, तो आपको जो कॉन्ट्रैक्ट पूरा करना होता है वह `IOutputStorage` है। इंटरफ़ेस केवल एक मेथड मांगता है जो दिए गए रिसोर्स नाम के लिए एक `Stream` रिटर्न करता है। + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### यह क्यों काम करता है + +- **Interface contract** – फ्रेमवर्क जब भी आउटपुट लिखने की ज़रूरत होगी, `CreateStream` को कॉल करेगा। +- **Flexibility** – क्योंकि आप एक `Stream` रिटर्न करते हैं, आप बाद में `MemoryStream` को `FileStream` या यहाँ तक कि कस्टम बफ़र्ड स्ट्रीम से बदल सकते हैं बिना बाकी कोड को छुए। +- **Resource safety** – कॉलर को रिटर्न किए गए स्ट्रीम को डिस्पोज़ करने की ज़िम्मेदारी होती है, इसलिए हम मेथड के अंदर `Dispose` नहीं कॉल करते। + +### सामान्य pitfalls + +| समस्या | क्या होता है | समाधान | +|--------|--------------|--------| +| बंद स्ट्रीम रिटर्न करना | उपभोक्ताओं को लिखते समय `ObjectDisposedException` मिलेगा। | स्ट्रीम को हैंड ऑफ़ करते समय **खुला** रखें। | +| लिखने के बाद `Position = 0` सेट करना भूल जाना | डेटा बाद में पढ़ने पर खाली दिखाई देता है। | यदि आप पहले से डेटा डालते हैं तो रिटर्न करने से पहले `stream.Seek(0, SeekOrigin.Begin)` कॉल करें। | +| बड़ी फ़ाइलों के लिए बहुत बड़ा `MemoryStream` उपयोग करना | मेमोरी खत्म होने के कारण क्रैश। | एक टेम्पररी `FileStream` या कस्टम बफ़र्ड स्ट्रीम में स्विच करें। | + +--- + +## Create memory stream c# – मॉडर्न एप्रोच (24.2+) + +वर्ज़न 24.2 से लाइब्रेरी ने `ResourceHandler` पेश किया। अब आप इंटरफ़ेस की बजाय एक बेस क्लास को इनहेरिट करते हैं और एक ही मेथड को ओवरराइड करते हैं। इससे आपको एक साफ़, async‑फ्रेंडली एंट्री पॉइंट मिलता है। + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### `ResourceHandler` को क्यों पसंद करें + +- **Async support** – `HandleResourceAsync` मेथड आपको थ्रेड्स को ब्लॉक किए बिना I/O करने देता है। +- **Built‑in error handling** – बेस क्लास एक्सेप्शन को पकड़ता है और उन्हें फ्रेमवर्क‑स्पेसिफिक एरर कोड में बदल देता है। +- **Future‑proof** – नए रिलीज़ में हुक्स (जैसे लॉगिंग, टेलीमेट्री) जोड़ते हैं जो केवल हैंडलर पैटर्न के साथ काम करते हैं। + +### किनारे के मामलों का हैंडलिंग + +1. **Disposal** – फ्रेमवर्क स्ट्रीम को उपयोग के बाद डिस्पोज़ कर देता है, लेकिन यदि आप किसी अन्य डिस्पोज़ेबल (जैसे `FileStream`) को रैप करते हैं तो आपको मेथड के अंदर एक `using` ब्लॉक लागू करना चाहिए और ऐसा रैपर रिटर्न करना चाहिए जो `Dispose` को फ़ॉरवर्ड करे। +2. **Large payloads** – यदि आप > 100 MB पेलोड की उम्मीद करते हैं, तो `MemoryStream` को एक टेम्प फ़ाइल की ओर इशारा करने वाले `FileStream` से बदलें। उदाहरण: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – यदि बेस क्लास DI से सर्विसेज लेता है तो एक मॉक `IServiceProvider` इंजेक्ट करके अपने हैंडलर का यूनिट‑टेस्ट करें। यह सत्यापित करें कि `HandleResource` एक ऐसा स्ट्रीम रिटर्न करता है जिसे लिखा और पढ़ा जा सकता है। + +## How to create stream – एक त्वरित चीट शीट + +| परिदृश्य | सिफ़ारिश किया गया API | उदाहरण कोड | +|----------|------------------------|-------------| +| सरल इन‑मेमोरी डेटा | `MemoryStream` | `new MemoryStream()` | +| बड़ी टेम्पररी फ़ाइलें | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| नेटवर्क‑आधारित स्रोत | `NetworkStream` | `new NetworkStream(socket)` | +| कस्टम बफ़रिंग | Derive from `Stream` | [Microsoft docs] देखें कस्टम स्ट्रीम इम्प्लीमेंटेशन के लिए | + +**Note:** यदि आप स्ट्रीम को पहले से भरते हैं तो रिटर्न करने से पहले हमेशा `stream.Position = 0` सेट करें; अन्यथा डाउनस्ट्रीम रीडर्स को स्ट्रीम खाली लगेगा। + +## चित्रण + +![Create memory stream c# प्रक्रिया दिखाने वाला डायग्राम](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* create memory stream c# प्रक्रिया दिखाने वाला डायग्राम + +## पूर्ण चलाने योग्य उदाहरण + +नीचे एक न्यूनतम कंसोल ऐप है जो लेगेसी और मॉडर्न दोनों एप्रोच को दर्शाता है। आप इसे कॉपी‑पेस्ट करके एक नए .NET 6 कंसोल प्रोजेक्ट में डाल सकते हैं और जैसा है वैसा चला सकते हैं। + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**अपेक्षित आउटपुट** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +यह प्रोग्राम तीन तरीकों से **how to create stream** दिखाता है: पुराना `IOutputStorage`, नया सिंक्रोनस `HandleResource`, और असिंक्रोनस `HandleResourceAsync`। सभी तीन एक `MemoryStream` रिटर्न करते हैं, यह सिद्ध करता है कि कस्टम स्ट्रीम निर्माण लक्ष्य किए गए संस्करण की परवाह किए बिना काम करता है। + +## अक्सर पूछे जाने वाले प्रश्न (FAQ) + +**Q: क्या मुझे प्राप्त स्ट्रीम पर `Dispose` कॉल करने की ज़रूरत है?** +A: फ्रेमवर्क (या आपका कॉलिंग कोड) डिस्पोज़ल के लिए ज़िम्मेदार है। यदि आप रिटर्न किए गए स्ट्रीम के अंदर कोई अन्य डिस्पोज़ेबल रैप करते हैं, तो सुनिश्चित करें कि वह `Dispose` कॉल को फ़ॉरवर्ड करे। + +**Q: क्या मैं रीड‑ओनली स्ट्रीम रिटर्न कर सकता हूँ?** +A: हाँ, लेकिन कॉन्ट्रैक्ट आमतौर पर एक राइटेबल स्ट्रीम की अपेक्षा करता है। यदि आपको केवल पढ़ना है, तो `CanWrite => false` इम्प्लीमेंट करें और इस सीमा को डॉक्यूमेंट करें। + +**Q: अगर मेरा डेटा उपलब्ध RAM से बड़ा है तो क्या करें?** +A: एक टेम्पररी फ़ाइल पर आधारित `FileStream` में स्विच करें, या एक कस्टम बफ़र्ड स्ट्रीम इम्प्लीमेंट करें जो डेटा को चंक्स में डिस्क पर लिखे। + +**Q: क्या दोनों एप्रोच में कोई प्रदर्शन अंतर है?** +A: मॉडर्न `ResourceHandler` अतिरिक्त बेस‑क्लास लॉजिक के कारण थोड़ा ओवरहेड जोड़ता है, लेकिन async वर्ज़न उच्च समवर्तीता पर थ्रूपुट को काफी बढ़ा सकता है। + +## निष्कर्ष + +हमने अभी **create memory stream c#** को हर उस पहलू से कवर किया है जो आप वास्तविक दुनिया में मिल सकते हैं। अब आप दोनों लेगेसी `IOutputStorage` पैटर्न और नए `ResourceHandler` क्लास का उपयोग करके **how to create stream** करना जानते हैं, साथ ही **how to handle resources** को जिम्मेदारी से संभालने के व्यावहारिक टिप्स और बड़े फ़ाइलों या async परिदृश्यों के लिए **custom stream creation** को विस्तारित करने के तरीके देखे हैं। +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hindi/net/generate-jpg-and-png-images/_index.md b/html/hindi/net/generate-jpg-and-png-images/_index.md index fd2cc0408..2aab7826c 100644 --- a/html/hindi/net/generate-jpg-and-png-images/_index.md +++ b/html/hindi/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Aspose.HTML for .NET को अपने .NET प्रोजेक्ट मे जानें कि .NET के लिए Aspose.HTML का उपयोग करके गतिशील वेब पेज कैसे बनाएं। यह चरण-दर-चरण ट्यूटोरियल पूर्वापेक्षाएँ, नामस्थान और HTML को छवियों में प्रस्तुत करने को कवर करता है। ### [Aspose.HTML के साथ .NET में ImageDevice द्वारा PNG छवियाँ उत्पन्न करें](./generate-png-images-by-imagedevice/) HTML दस्तावेज़ों में हेरफेर करने, HTML को छवियों में बदलने, और बहुत कुछ करने के लिए .NET के लिए Aspose.HTML का उपयोग करना सीखें। FAQ के साथ चरण-दर-चरण ट्यूटोरियल। +### [DOCX को PNG/JPG में बदलते समय एंटीएलियासिंग कैसे सक्षम करें](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +DOCX फ़ाइलों को PNG या JPG में परिवर्तित करते समय एंटीएलियासिंग को सक्षम करने के चरणों को जानें। ## निष्कर्ष @@ -52,4 +54,4 @@ HTML दस्तावेज़ों में हेरफेर करने {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hindi/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/hindi/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..2d7e112e0 --- /dev/null +++ b/html/hindi/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,277 @@ +--- +category: general +date: 2025-12-27 +description: DOCX को PNG या JPG में बदलते समय एंटीएलियासिंग कैसे सक्षम करें, सीखें। + यह चरण‑दर‑चरण गाइड DOCX को PNG में बदलने और DOCX को JPG में बदलने को भी कवर करता + है। +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: hi +og_description: DOCX फ़ाइलों को PNG या JPG में बदलते समय एंटीएलियासिंग कैसे सक्षम + करें। सुगम, उच्च‑गुणवत्ता वाले आउटपुट के लिए इस पूर्ण गाइड का पालन करें। +og_title: DOCX को PNG/JPG में बदलते समय एंटीएलियासिंग कैसे सक्षम करें +tags: +- C# +- Document Rendering +- Image Processing +title: DOCX को PNG/JPG में बदलते समय एंटीएलियासिंग कैसे सक्षम करें +url: /hi/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# DOCX को PNG/JPG में बदलते समय एंटीएलियासिंग कैसे सक्षम करें + +क्या आपने कभी **एंटीएलियासिंग को सक्षम करने** के बारे में सोचा है ताकि आपके परिवर्तित DOCX चित्र स्पष्ट दिखें, किनारे खुरदुरे न हों? आप अकेले नहीं हैं। कई डेवलपर्स को Word दस्तावेज़ को PNG या JPG में बदलते समय रेखाओं और टेक्स्ट के किनारे धुंधले मिलते हैं। अच्छी खबर? कुछ ही C# लाइनों से आप इस खुरदुरे आउटपुट को पिक्सेल‑परफेक्ट ग्राफ़िक्स में बदल सकते हैं—बिना किसी थर्ड‑पार्टी इमेज एडिटर के। + +इस ट्यूटोरियल में हम **convert docx to png** और **convert docx to jpg** को एक आधुनिक रेंडरिंग लाइब्रेरी का उपयोग करके पूरा करेंगे। आप न केवल *how to convert docx* सीखेंगे, बल्कि *how to render docx* को एंटीएलियासिंग और हिन्टिंग के साथ कैसे सक्षम करें, ताकि हर कर्व और अक्षर स्मूद दिखे। ग्राफ़िक्स प्रोग्रामिंग का कोई पूर्व अनुभव आवश्यक नहीं; बस एक बेसिक C# सेटअप और वह DOCX फ़ाइल जिसे आप इमेज में बदलना चाहते हैं। + +--- + +## आपको क्या चाहिए + +- **.NET 6+** (या यदि आप क्लासिक रनटाइम पसंद करते हैं तो .NET Framework 4.6+) +- एक **DOCX** फ़ाइल जिसे आप रेंडर करना चाहते हैं (डेमो के लिए इसे `input` फ़ोल्डर में रखें) +- **Aspose.Words for .NET** NuGet पैकेज (या कोई भी लाइब्रेरी जो `Document`, `ImageRenderingOptions`, और `ImageDevice` प्रदान करती हो)। इसे इस तरह इंस्टॉल करें: + +```bash +dotnet add package Aspose.Words +``` + +बस इतना ही—कोई अतिरिक्त इमेज‑प्रोसेसिंग टूल्स की जरूरत नहीं। + +--- + +## चरण 1: DOCX दस्तावेज़ लोड करें (how to convert docx) + +सबसे पहले हमें एक `Document` ऑब्जेक्ट चाहिए जो स्रोत फ़ाइल का प्रतिनिधित्व करता है। इसे आप अपने Word फ़ाइल का डिजिटल संस्करण मान सकते हैं जिसे लाइब्रेरी पढ़ और मैनीपुलेट कर सकती है। + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **क्यों महत्वपूर्ण है:** दस्तावेज़ को लोड करना *how to render docx* का आधार है। यदि फ़ाइल पढ़ी नहीं जा सकती, तो बाद के कोई भी चरण काम नहीं करेंगे, इसलिए हम यहीं से शुरू करते हैं। + +--- + +## चरण 2: इमेज रेंडरिंग विकल्प कॉन्फ़िगर करें (enable antialiasing) + +अब आता है जादू—एंटीएलियासिंग और हिन्टिंग को ऑन करना। एंटीएलियासिंग तिरछी रेखाओं के खुरदुरे किनारों को स्मूद करता है, जबकि हिन्टिंग छोटे टेक्स्ट की स्पष्टता बढ़ाता है। + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **प्रो टिप:** यदि आपको बड़े दस्तावेज़ों पर प्रदर्शन बढ़ाना है, तो आप `UseAntialiasing` को बंद कर सकते हैं, लेकिन विज़ुअल क्वालिटी स्पष्ट रूप से घटेगी। + +--- + +## चरण 3: आउटपुट फ़ॉर्मेट चुनें – PNG या JPG (convert docx to png / convert docx to jpg) + +`ImageDevice` क्लास तय करता है कि रेंडर किए गए पेज़ कहाँ जाएँगे। `ImageSaveOptions` को बदलकर आप या तो PNG (लॉसलेस) या JPG (कम्प्रेस्ड) आउटपुट कर सकते हैं। नीचे हम दो अलग‑अलग डिवाइस बनाते हैं ताकि एक ही रन में दोनों फ़ॉर्मेट जनरेट किए जा सकें। + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **दोनों क्यों?** PNG हर पिक्सेल को बरकरार रखता है, जो सटीक फ़िडेलिटी (जैसे प्रिंटिंग) के लिए परफेक्ट है। JPG इमेज को कम्प्रेस करता है, जिससे वेबसाइट पर लोडिंग तेज़ हो जाती है। + +--- + +## चरण 4: दस्तावेज़ पेज़ को इमेज में रेंडर करें (how to render docx) + +डिवाइस तैयार होने के बाद, हम `Document` को प्रत्येक पेज़ रेंडर करने के लिए कहते हैं। लाइब्रेरी स्वचालित रूप से सभी पेज़ों पर लूप करेगी और हमने जो नेमिंग पैटर्न तय किया है, उसके अनुसार सेव करेगी। + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +कोड चलाने के बाद, आपको `output` फ़ोल्डर में `page_0.png`, `page_1.png`, … और `page_0.jpg`, `page_1.jpg` जैसी फ़ाइलें मिलेंगी। प्रत्येक इमेज में एंटीएलियासिंग लागू होगा, इसलिए रेखाएँ स्मूद और टेक्स्ट क्रिस्टल‑क्लियर होगा। + +--- + +## चरण 5: परिणाम की जाँच करें (expected output) + +किसी भी जनरेटेड इमेज को खोलें। आपको दिखना चाहिए: + +- **स्मूद कर्व** शैप्स और चार्ट्स पर (कोई स्टेयर‑स्टेप आर्टिफैक्ट नहीं)। +- **तेज़, पढ़ने योग्य टेक्स्ट** छोटे फ़ॉन्ट साइज पर भी, हिन्टिंग के कारण। +- **रंगों में स्थिरता** PNG और JPG के बीच (हालाँकि JPG में क्वालिटी कम करने पर हल्का कम्प्रेशन आर्टिफैक्ट दिख सकता है)। + +यदि आप कोई धुंधलापन देखते हैं, तो दोबारा जांचें कि `UseAntialiasing` `true` पर सेट है और आपका स्रोत DOCX कम‑रिज़ॉल्यूशन रास्टर इमेज नहीं रखता। + +--- + +## सामान्य प्रश्न और किनारे के केस + +### यदि मुझे केवल एक पेज चाहिए तो? + +आप `PageInfo` ओवरलोड का उपयोग करके एक विशिष्ट पेज रेंडर कर सकते हैं: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### उच्च‑रिज़ॉल्यूशन आउटपुट के लिए DPI बदलना है? + +बिल्कुल। `ImageRenderingOptions` की `Resolution` प्रॉपर्टी को एडजस्ट करें: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +उच्च DPI का मतलब बड़े फ़ाइल साइज, लेकिन एंटीएलियासिंग प्रभाव और भी स्पष्ट हो जाता है। + +### बड़े DOCX फ़ाइलों को मेमोरी खत्म हुए बिना कैसे हैंडल करें? + +पेज‑बाय‑पेज रेंडर करें और प्रत्येक इटरेशन के बाद डिवाइस को डिस्पोज़ करें: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### क्या BMP या TIFF जैसे अन्य फ़ॉर्मेट में कन्वर्ट करना संभव है? + +हां—सिर्फ `SaveFormat.Png` या `SaveFormat.Jpeg` को `SaveFormat.Bmp` या `SaveFormat.Tiff` से बदलें। एंटीएलियासिंग सेटिंग्स वही रहेंगी। + +--- + +## पूर्ण कार्यशील उदाहरण (कॉपी‑पेस्ट तैयार) + +नीचे पूरा प्रोग्राम है जिसे आप नई कंसोल प्रोजेक्ट में डाल सकते हैं। इसमें सभी `using` स्टेटमेंट, एरर हैंडलिंग, और स्पष्टता के लिए कमेंट्स शामिल हैं। + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **परिणाम:** कंपाइल करने के बाद (`dotnet run`) आपको `output` डायरेक्टरी में कई PNG और JPG फ़ाइलें मिलेंगी, प्रत्येक में एंटीएलियासिंग लागू होगा। + +--- + +## निष्कर्ष + +हमने **DOCX को PNG या JPG में बदलते समय एंटीएलियासिंग को कैसे सक्षम करें** को कवर किया, **convert docx to png**, **convert docx to jpg**, और यहाँ तक कि **how to render docx** के कस्टम चरणों को भी समझा। + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hongkong/net/advanced-features/_index.md b/html/hongkong/net/advanced-features/_index.md index 50ee7c4da..0d029949d 100644 --- a/html/hongkong/net/advanced-features/_index.md +++ b/html/hongkong/net/advanced-features/_index.md @@ -32,6 +32,8 @@ Aspose.HTML for .NET 是一個功能強大的工具,可讓開發人員以程 了解如何使用 Aspose.HTML for .NET 有效率地操作 HTML 文件。面向開發人員的分步教程。 ### [.NET 中的記憶體流提供者與 Aspose.HTML](./memory-stream-provider/) 了解如何使用 Aspose.HTML 在 .NET 中建立令人驚嘆的 HTML 文件。遵循我們的分步教程並釋放 HTML 操作的力量。 +### [在 C# 中建立記憶體串流 – 自訂串流建立指南](./create-memory-stream-c-custom-stream-creation-guide/) +了解如何在 C# 中使用 Aspose.HTML 建立自訂記憶體串流,以提升 HTML 處理效能。 ### [使用 Aspose.HTML 在 .NET 中進行網頁抓取](./web-scraping/) 學習使用 Aspose.HTML 操作 .NET 中的 HTML 文件。有效地導航、過濾、查詢和選擇元素以增強 Web 開發。 ### [將 .NET 中的擴充內容屬性與 Aspose.HTML 結合使用](./use-extended-content-property/) @@ -52,4 +54,4 @@ Aspose.HTML for .NET 是一個功能強大的工具,可讓開發人員以程 {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hongkong/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/hongkong/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..f17ab724c --- /dev/null +++ b/html/hongkong/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,276 @@ +--- +category: general +date: 2025-12-27 +description: 快速使用一步一步指南建立 C# 記憶體串流。了解如何建立串流、處理資源,以及在 .NET 中實作自訂串流的建立。 +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: zh-hant +og_description: 在秒內建立 C# 記憶體串流。本教學示範如何建立串流、處理資源,以及使用現代 .NET API 建構自訂串流。 +og_title: 建立記憶體串流 C# – 完整自訂串流指南 +tags: +- stream +- csharp +- .net +- resource-handling +title: 建立記憶體串流 C# – 自訂串流建立指南 +url: /zh-hant/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 建立 memory stream c# – 自訂串流建立指南 + +有沒有曾經需要 **create memory stream c#** 但不確定該選哪個 API?你並非唯一遇到這個問題的人。在許多舊有專案中會看到 `IOutputStorage`,而較新的程式碼庫則偏好使用 `ResourceHandler`。不論哪種方式,目標都相同:產生一個可供你的框架使用的 `Stream`。 + +在本教學中,你將學會 **how to create stream** 物件、**how to handle resources** 的安全處理方式,並精通針對 24.2 之前與 24.2 以上版本的函式庫的 **custom stream creation**。完成後,你將擁有一個可直接放入任何 .NET 解決方案的可執行範例——不需要神祕的參考,只要純粹的 C#。 + +## 你將學到的內容 + +- 清楚比較舊有的 `IOutputStorage` 模式與現代的 `ResourceHandler` 方法。 +- 完整、可直接複製貼上的程式碼,能編譯於 .NET 6+(或更早版本,視需求而定)。 +- 針對邊緣案例的技巧,例如釋放串流、處理大型負載,以及測試你的自訂串流。 + +> **專業提示:** 若你的目標是 .NET 8,較新的 `ResourceHandler` 內建 async 支援,能在高吞吐量情境下節省毫秒級的時間。 + +--- + +## 建立 memory stream c# – 傳統做法(pre‑24.2) + +當你被迫使用舊版函式庫時,需要符合的合約是 `IOutputStorage`。此介面僅要求提供一個方法,回傳給定資源名稱的 `Stream`。 + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### 為何這樣可行 + +- **介面合約** – 框架在需要寫入輸出時會呼叫 `CreateStream`。 +- **彈性** – 因為你回傳的是 `Stream`,之後可以將 `MemoryStream` 換成 `FileStream`,甚至自訂的緩衝串流,而不必修改其他程式碼。 +- **資源安全** – 呼叫端負責釋放回傳的串流,這也是我們在方法內不呼叫 `Dispose` 的原因。 + +### 常見陷阱 + +| 問題 | 會發生什麼 | 解決方式 | +|------|------------|----------| +| 回傳已關閉的串流 | 使用者在寫入時會拋出 `ObjectDisposedException`。 | 確保在交付時串流是 **開啟** 的。 | +| 寫入後忘記將 `Position = 0` | 之後讀取時資料顯示為空。 | 若事先填入資料,返回前請呼叫 `stream.Seek(0, SeekOrigin.Begin)`。 | +| 對大型檔案使用巨大的 `MemoryStream` | 導致記憶體不足而當機。 | 改用暫存的 `FileStream` 或自訂緩衝串流。 | + +--- + +## 建立 memory stream c# – 現代做法(24.2+) + +自 24.2 版起,函式庫引入了 `ResourceHandler`。不再使用介面,而是繼承自基底類別並覆寫單一方法。這提供了更簡潔、支援 async 的入口點。 + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### 為何偏好 `ResourceHandler` + +- **非同步支援** – `HandleResourceAsync` 方法讓你在不阻塞執行緒的情況下執行 I/O。 +- **內建錯誤處理** – 基底類別會捕捉例外並轉換為框架特定的錯誤代碼。 +- **未來保證** – 新版會加入掛鉤(例如日誌、遙測),僅能於 handler 模式使用。 + +### 邊緣案例處理 + +1. **釋放** – 框架在使用完畢後會釋放串流,但若你包裝了其他可釋放物件(例如 `FileStream`),應在方法內使用 `using` 區塊,並回傳一個轉發 `Dispose` 的包裝器。 +2. **大型負載** – 若預期負載超過 100 MB,請將 `MemoryStream` 換成指向暫存檔的 `FileStream`。範例: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **測試** – 若基底類別從 DI 取得服務,可透過注入 mock `IServiceProvider` 來單元測試你的 handler。確認 `HandleResource` 回傳的串流可寫入且可讀取。 + +--- + +## 如何建立串流 – 快速速查表 + +| 情境 | 推薦 API | 範例程式碼 | +|------|----------|------------| +| 簡單的記憶體資料 | `MemoryStream` | `new MemoryStream()` | +| 大型暫存檔 | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| 基於網路的來源 | `NetworkStream` | `new NetworkStream(socket)` | +| 自訂緩衝 | Derive from `Stream` | See [Microsoft docs] for custom stream implementation | + +> **注意:** 若事先填入資料,返回前務必設定 `stream.Position = 0`;否則下游讀取者會認為串流是空的。 + +--- + +## 圖片說明 + +![顯示建立 memory stream c# 流程的圖示](https://example.com/images/create-memory-stream-diagram.png) + +*替代文字:* 顯示建立 memory stream c# 流程的圖示 + +--- + +## 完整可執行範例 + +以下是一個最小的主控台應用程式,示範舊版與新版兩種做法。你可以直接複製貼上到新的 .NET 6 主控台專案並直接執行。 + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**預期輸出** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +程式展示了三種 **how to create stream** 的方式:舊的 `IOutputStorage`、新的同步 `HandleResource`,以及非同步的 `HandleResourceAsync`。三者皆回傳 `MemoryStream`,證明自訂串流建立在任何目標版本下皆可運作。 + +--- + +## 常見問題 (FAQ) + +**Q: 我需要對取得的串流呼叫 `Dispose` 嗎?** +A: 框架(或呼叫端程式碼)負責釋放。若你在回傳的串流內包裝了其他可釋放物件,請確保它會傳遞 `Dispose` 呼叫。 + +**Q: 我可以回傳唯讀串流嗎?** +A: 可以,但合約通常預期可寫入的串流。若僅需讀取,請實作 `CanWrite => false` 並在文件中說明此限制。 + +**Q: 若我的資料大於可用記憶體該怎麼辦?** +A: 改用以暫存檔為基礎的 `FileStream`,或實作會分段寫入磁碟的自訂緩衝串流。 + +**Q: 兩種做法在效能上有差異嗎?** +A: 現代的 `ResourceHandler` 會因額外的基底類別邏輯產生少量開銷,但非同步版本在高併發情況下可顯著提升吞吐量。 + +--- + +## 結語 + +我們剛剛從各個可能遇到的角度說明了 **create memory stream c#**。現在你已了解如何使用舊版的 `IOutputStorage` 模式與新版的 `ResourceHandler` 類別來 **how to create stream**,同時也掌握了負責任地 **how to handle resources** 的實用技巧,並能以 **custom stream creation** 方式擴充至大型檔案或非同步情境。 + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hongkong/net/generate-jpg-and-png-images/_index.md b/html/hongkong/net/generate-jpg-and-png-images/_index.md index 25aae2c13..1db9aac53 100644 --- a/html/hongkong/net/generate-jpg-and-png-images/_index.md +++ b/html/hongkong/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Aspose.HTML for .NET 提供了一種將 HTML 轉換為映像的簡單方法。 了解如何使用 Aspose.HTML for .NET 建立動態網頁。本逐步教學涵蓋先決條件、命名空間以及將 HTML 渲染為圖片。 ### [使用 Aspose.HTML 在 .NET 中透過 ImageDevice 產生 PNG 映像](./generate-png-images-by-imagedevice/) 學習使用 Aspose.HTML for .NET 來操作 HTML 文件、將 HTML 轉換為圖片等。包含常見問題的逐步教學。 +### [在將 DOCX 轉換為 PNG/JPG 時啟用抗鋸齒的方法](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +了解如何在使用 Aspose.HTML for .NET 將 DOCX 轉換為 PNG 或 JPG 時啟用抗鋸齒,以提升圖像品質。 ## 結論 @@ -52,4 +54,4 @@ Aspose.HTML for .NET 提供了一種將 HTML 轉換為映像的簡單方法。 {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hongkong/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/hongkong/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..1b56053a9 --- /dev/null +++ b/html/hongkong/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,275 @@ +--- +category: general +date: 2025-12-27 +description: 了解在將 DOCX 轉換為 PNG 或 JPG 時如何啟用抗鋸齒。此一步一步的指南亦涵蓋將 DOCX 轉為 PNG 以及將 DOCX 轉為 + JPG 的方法。 +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: zh-hant +og_description: 如何在將 DOCX 檔案轉換為 PNG 或 JPG 時啟用抗鋸齒。請參考此完整指南,以獲得流暢且高品質的輸出。 +og_title: 將 DOCX 轉換為 PNG/JPG 時如何啟用抗鋸齒 +tags: +- C# +- Document Rendering +- Image Processing +title: 將 DOCX 轉換為 PNG/JPG 時如何啟用抗鋸齒 +url: /zh-hant/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何在將 DOCX 轉換為 PNG/JPG 時啟用抗鋸齒 + +你是否曾經想過 **如何啟用抗鋸齒**,讓轉換後的 DOCX 圖片看起來更清晰而不是鋸齒狀?你並不孤單。許多開發者在需要將 Word 文件轉成 PNG 或 JPG 時會卡住,結果線條和文字的邊緣模糊不清。好消息是,只要幾行 C# 程式碼,就能把粗糙的輸出變成像素完美的圖形——不需要第三方圖像編輯器。 + +在本教學中,我們將完整示範使用現代渲染函式庫將 **convert docx to png** 與 **convert docx to jpg**。你不僅會學會 *how to convert docx*,還會學會在啟用抗鋸齒與 hinting 的情況下 *how to render docx*,讓每條曲線與每個字元都呈現平滑。即使沒有圖形程式設計經驗,只要有基本的 C# 環境與想要轉成圖像的 DOCX 檔案,即可上手。 + +--- + +## 需要的環境 + +- **.NET 6+**(或若偏好傳統執行環境則使用 .NET Framework 4.6+) +- 一個你想要渲染的 **DOCX** 檔案(請放在名為 `input` 的資料夾中以供示範) +- **Aspose.Words for .NET** NuGet 套件(或任何提供 `Document`、`ImageRenderingOptions` 與 `ImageDevice` 的函式庫)。使用以下指令安裝: + +```bash +dotnet add package Aspose.Words +``` + +就這樣——不需要額外的圖像處理工具。 + +--- + +## 步驟 1:載入 DOCX 文件(how to convert docx) + +首先,我們需要一個代表來源檔案的 `Document` 物件。它相當於你的 Word 檔的數位版本,讓函式庫能讀取並操作。 + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **為什麼這很重要:** 載入文件是 *how to render docx* 的基礎。如果檔案無法讀取,後續步驟都無法執行,所以必須從這裡開始。 + +--- + +## 步驟 2:設定影像渲染選項(enable antialiasing) + +接下來就是魔法時間——開啟抗鋸齒與 hinting。抗鋸齒會平滑對角線上常見的鋸齒邊緣,而 hinting 則提升小字體的清晰度。 + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **小技巧:** 若在處理超大型文件時需要提升效能,可以將 `UseAntialiasing` 關閉,但畫面品質會明顯下降。 + +--- + +## 步驟 3:選擇輸出格式 – PNG 或 JPG(convert docx to png / convert docx to jpg) + +`ImageDevice` 類別決定渲染後的頁面要寫到哪裡。只要切換 `ImageSaveOptions`,就能輸出 PNG(無損)或 JPG(有損)。以下範例同時建立兩個裝置,讓你一次執行即可產生兩種格式。 + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **為什麼要兩種?** PNG 能完整保留每個像素,適合需要精確還原的情境(例如列印)。JPG 則會壓縮圖像,讓網站載入更快。 + +--- + +## 步驟 4:將文件頁面渲染為影像(how to render docx) + +裝置準備好後,我們指示 `Document` 渲染每一頁。函式庫會自動遍歷所有頁面,並依照先前設定的命名規則儲存。 + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +執行程式後,你會在 `output` 資料夾中看到一系列檔案,如 `page_0.png`、`page_1.png` … 以及 `page_0.jpg`、`page_1.jpg`。每張影像皆已套用抗鋸齒,線條平滑、文字清晰。 + +--- + +## 步驟 5:驗證結果(expected output) + +打開任一產生的影像,你應該會看到: + +- **平滑的曲線**(圖形與圖表不會出現階梯狀雜訊)。 +- **銳利且易讀的文字**,即使在小字體下也因 hinting 而清晰。 +- **PNG 與 JPG 之間的顏色一致**(不過若降低 JPG 品質,可能會出現輕微壓縮雜訊)。 + +如果發現任何模糊,請再次確認 `UseAntialiasing` 已設為 `true`,且來源 DOCX 中未包含低解析度的點陣圖。 + +--- + +## 常見問題與特殊情況 + +### 只需要單一頁面該怎麼辦? + +可以使用 `PageInfo` 的重載,只渲染特定頁面: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### 能否調整 DPI(每英吋點數)以取得更高解析度的輸出? + +當然可以。只要調整 `ImageRenderingOptions` 的 `Resolution` 屬性: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +較高的 DPI 會產生較大的檔案,但抗鋸齒效果會更加明顯。 + +### 大型 DOCX 檔案會不會因記憶體不足而失敗? + +請逐頁渲染,並在每次迭代後釋放裝置: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### 能否轉換成其他格式,例如 BMP 或 TIFF? + +可以,只要將 `SaveFormat.Png` 或 `SaveFormat.Jpeg` 換成 `SaveFormat.Bmp` 或 `SaveFormat.Tiff`。抗鋸齒設定會自動套用。 + +--- + +## 完整範例(可直接複製貼上) + +以下是可直接放入新 Console 專案的完整程式碼,包含所有 using 陳述式、錯誤處理與說明註解。 + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **結果:** 編譯完成(`dotnet run`)後,你會在 `output` 目錄看到一系列 PNG 與 JPG 檔案,皆已套用抗鋸齒。 + +--- + +## 結論 + +我們已說明 **如何在將 DOCX 轉換為 PNG 或 JPG 時啟用抗鋸齒**,完整示範 **convert docx to png**、**convert docx to jpg** 的步驟,並簡要提及 **how to render docx** 的自訂應用。 + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hungarian/net/advanced-features/_index.md b/html/hungarian/net/advanced-features/_index.md index 8acbf5b4a..091189516 100644 --- a/html/hungarian/net/advanced-features/_index.md +++ b/html/hungarian/net/advanced-features/_index.md @@ -31,7 +31,7 @@ Tanulja meg, hogyan dolgozhat HTML-dokumentumokkal .NET-ben az Aspose.HTML haszn ### [Hozzon létre Stream Provider-t .NET-ben az Aspose.HTML segítségével](./create-stream-provider/) Ismerje meg az Aspose.HTML for .NET használatát a HTML-dokumentumok hatékony kezeléséhez. Lépésről lépésre bemutató fejlesztőknek. ### [Memóriafolyam-szolgáltató .NET-ben Aspose.HTML-lel](./memory-stream-provider/) -Ismerje meg, hogyan hozhat létre lenyűgöző HTML-dokumentumokat .NET-ben az Aspose.HTML segítségével. Kövesse lépésről lépésre bemutató oktatóanyagunkat, és szabadítsa fel a HTML-manipuláció erejét. +Ismerje meg, hogyan hozhat lenyűgöző HTML-dokumentumokat .NET-ben az Aspose.HTML segítségével. Kövesse lépésről lépésre bemutató oktatóanyagunkat, és szabadítsa fel a HTML-manipuláció erejét. ### [Webkaparás .NET-ben Aspose.HTML-lel](./web-scraping/) Tanulja meg a HTML dokumentumok kezelését .NET-ben az Aspose.HTML segítségével. Hatékonyan navigálhat, szűrhet, lekérdezhet és kiválaszthat elemeket a továbbfejlesztett webfejlesztés érdekében. ### [Használja a kiterjesztett tartalomtulajdonságot a .NET-ben az Aspose.HTML-lel](./use-extended-content-property/) @@ -42,7 +42,8 @@ Konvertálja dinamikusan HTML-t PDF-be az Aspose.HTML for .NET segítségével. Ismerje meg, hogyan konvertálhat HTML-t PDF-be, XPS-be és képekké az Aspose.HTML for .NET segítségével. Lépésről lépésre bemutató oktatóprogram kódpéldákkal és GYIK-vel. ### [HTML-sablonok használata .NET-ben az Aspose.HTML-lel](./using-html-templates/) Ismerje meg, hogyan használhatja az Aspose.HTML for .NET-et HTML-dokumentumok dinamikus generálására JSON-adatokból. Használja ki a HTML-kezelés erejét .NET-alkalmazásaiban. - +### [Memóriafolyam létrehozása C# – Egyéni stream létrehozási útmutató](./create-memory-stream-c-custom-stream-creation-guide/) +Tanulja meg, hogyan hozhat létre egyedi memóriafolyamot C#-ban az Aspose.HTML használatával. ## Következtetés @@ -52,4 +53,4 @@ Az Aspose.HTML for .NET a lehetőségek világa előtt nyitja meg az ajtót, ami {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hungarian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/hungarian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..c01e34e3b --- /dev/null +++ b/html/hungarian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,270 @@ +--- +category: general +date: 2025-12-27 +description: Hozzon létre memóriafolyamot C#‑ban gyorsan egy lépésről‑lépésre útmutatóval. + Tanulja meg, hogyan hozhat létre folyamot, kezelje az erőforrásokat, és valósítsa + meg az egyedi folyam létrehozását a .NET‑ben. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: hu +og_description: Hozzon létre memóriafolyamot C#-ban néhány másodperc alatt. Ez az + útmutató bemutatja, hogyan hozhat létre folyamot, kezelheti az erőforrásokat, és + építhet egyedi folyamkészítést a modern .NET API-kkal. +og_title: Memóriafolyam létrehozása C# – Teljes egyedi stream útmutató +tags: +- stream +- csharp +- .net +- resource-handling +title: Memóriastream létrehozása C# – Egyéni stream létrehozási útmutató +url: /hu/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Memory stream létrehozása c# – Egyéni stream létrehozás útmutatója + +Valaha szükséged volt **memory stream létrehozása c#**-ra, de nem tudtad, melyik API-t válaszd? Nem vagy egyedül. Sok régi projektben megtalálod a `IOutputStorage`-t, míg az újabb kódbázisok a `ResourceHandler`-t részesítik előnyben. Bármelyik is legyen, a cél ugyanaz: egy `Stream` előállítása, amelyet a keretrendszered felhasználhat. + +Ebben az útmutatóban megtanulod, hogyan **hozz létre stream** objektumokat, hogyan **kezelj biztonságosan erőforrásokat**, és elsajátítod az **egyéni stream létrehozását** a könyvtár pre‑24.2 és 24.2+ verzióihoz egyaránt. A végére egy működő példát kapsz, amelyet bármely .NET megoldásba beilleszthetsz – nincsenek rejtett hivatkozások, csak tiszta C#. + +## Mit fogsz elsajátítani + +- A régi `IOutputStorage` minta és a modern `ResourceHandler` megközelítés közötti világos összehasonlítás. +- Teljes, másolásra kész kód, amely .NET 6+ (vagy régebbi, ha szükséges) verzióval fordul. +- Tippek a szélhelyzetekhez, például a stream-ek felszabadítása, nagy adatmennyiségek kezelése és az egyéni stream tesztelése. + +> **Pro tipp:** Ha a .NET 8-ra célozol, az újabb `ResourceHandler` beépített aszinkron támogatást nyújt, amely ezredmásodperceket takaríthat meg a nagy áteresztőképességű szcenáriókban. + +--- + +## Memory stream létrehozása c# – Örökölt megközelítés (pre‑24.2) + +Amikor egy régebbi könyvtárverzióval vagy elakadva, a teljesítendő szerződés a `IOutputStorage`. Az interfész csak egy metódust kér, amely egy adott erőforrásnévhez `Stream`-et ad vissza. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Miért működik ez + +- **Interface contract** – A keretrendszer meghívja a `CreateStream`-et, amikor kimenetet kell írnia. +- **Flexibility** – Mivel egy `Stream`-et adsz vissza, később kicserélheted a `MemoryStream`-et `FileStream`-re vagy akár egy egyéni pufferelt stream-re anélkül, hogy a többi kódot módosítanád. +- **Resource safety** – A hívó felelős a visszaadott stream felszabadításáért, ezért a metódusban nem hívunk `Dispose`-t. + +### Gyakori buktatók + +| Probléma | Mi történik | Megoldás | +|----------|--------------|----------| +| Lezárt stream visszaadása | A fogyasztók `ObjectDisposedException`-t kapnak íráskor. | Győződj meg róla, hogy a stream **nyitott** amikor átadod. | +| `Position = 0` beállításának elfelejtése írás után | Az adatok üresnek tűnnek későbbi olvasáskor. | Hívja a `stream.Seek(0, SeekOrigin.Begin)`-et a visszaadás előtt, ha előre feltöltöd. | +| Nagy `MemoryStream` használata nagy fájlokhoz | Memóriahiányos összeomlások. | Válts át egy ideiglenes `FileStream`-re vagy egy egyéni pufferelt stream-re. | + +--- + +## Memory stream létrehozása c# – Modern megközelítés (24.2+) + +A 24.2-es verziótól a könyvtár bevezette a `ResourceHandler`-t. Az interfész helyett most egy bázisosztályból öröklődsz, és felülírsz egyetlen metódust. Ez tisztább, aszinkron‑barát belépési pontot biztosít. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Miért érdemes a `ResourceHandler`-t használni + +- **Async support** – A `HandleResourceAsync` metódus lehetővé teszi I/O végrehajtását szálak blokkolása nélkül. +- **Built‑in error handling** – A bázisosztály elkapja a kivételeket, és keretrendszer‑specifikus hibakódokká alakítja őket. +- **Future‑proof** – Az újabb kiadások hook-okat (pl. naplózás, telemetria) adnak hozzá, amelyek csak a handler mintával működnek. + +### Szélhelyzetek kezelése + +1. **Disposal** – A keretrendszer felszabadítja a stream-et, miután befejeződött, de ha egy másik felszabadítható objektumot (például `FileStream`) csomagolsz, akkor a metóduson belül egy `using` blokkot kell alkalmaznod, és egy olyan wrappert kell visszaadnod, amely továbbítja a `Dispose`-t. +2. **Large payloads** – Ha > 100 MB méretű terhelésre számítasz, cseréld le a `MemoryStream`-et egy `FileStream`-re, amely egy ideiglenes fájlra mutat. Példa: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – Egységteszteld a handleredet úgy, hogy egy mock `IServiceProvider`-t injektálsz, ha a bázisosztály a DI-ből szolgáltatásokat kér. Ellenőrizd, hogy a `HandleResource` olyan stream-et ad vissza, amelybe lehet írni és amelyből olvasni lehet. + +## Hogyan hozz létre stream-et – Gyors segédlet + +| Forgatókönyv | Ajánlott API | Minta kód | +|--------------|--------------|-----------| +| Egyszerű memóriaadat | `MemoryStream` | `new MemoryStream()` | +| Nagy ideiglenes fájlok | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Hálózati forrás | `NetworkStream` | `new NetworkStream(socket)` | +| Egyéni pufferelés | Derive from `Stream` | See [Microsoft docs] for custom stream implementation | + +> **Megjegyzés:** Mindig állítsd be a `stream.Position = 0`-t a visszaadás előtt, ha előre feltöltöd a stream-et; különben a downstream olvasók üresnek fogják gondolni a stream-et. + +## Kép illusztráció + +![Diagram showing create memory stream c# process](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* diagram a memory stream létrehozásának c# folyamatáról + +## Teljes futtatható példa + +Az alábbiakban egy minimális konzolalkalmazás látható, amely bemutatja mind az örökölt, mind a modern megközelítést. A kódot egyszerűen másold be egy új .NET 6 konzolprojektbe, és futtasd változtatás nélkül. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Várható kimenet** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +A program három módot mutat be arra, hogyan **hozz létre stream**-et: a régi `IOutputStorage`, az új szinkron `HandleResource`, és az aszinkron `HandleResourceAsync`. Mindhárom `MemoryStream`-et ad vissza, bizonyítva, hogy az egyéni stream létrehozás működik, függetlenül attól, hogy melyik verziót célozod. + +## Gyakran ismételt kérdések (GYIK) + +**K: Kell hívnom a `Dispose`-t a visszakapott stream-en?** +V: A keretrendszer (vagy a hívó kód) felelős a felszabadításért. Ha egy másik felszabadítható objektumot csomagolsz a visszaadott stream-be, győződj meg róla, hogy továbbítja a `Dispose` hívást. + +**K: Visszaadhatok csak olvasható stream-et?** +V: Igen, de a szerződés általában írható stream-et vár. Ha csak olvasni kell, implementáld a `CanWrite => false`-t, és dokumentáld a korlátozást. + +**K: Mi van, ha az adataim nagyobbak, mint a rendelkezésre álló RAM?** +V: Cseréld le egy ideiglenes fájlon alapuló `FileStream`-re, vagy implementálj egy egyéni pufferelt stream-et, amely darabokban ír a lemezre. + +**K: Van teljesítménykülönbség a két megközelítés között?** +V: A modern `ResourceHandler` kis extra terhet jelent a bázisosztály logikája miatt, de az aszinkron változat jelentősen javíthatja a teljesítményt magas párhuzamosság esetén. + +## Összegzés + +Most lefedtük a **memory stream létrehozása c#** minden szempontját, amellyel a gyakorlatban találkozhatsz. Most már tudod, hogyan **hozz létre stream**-et a régi `IOutputStorage` mintával és az új `ResourceHandler` osztállyal, valamint láttál gyakorlati tippeket arra, hogyan **kezelj erőforrásokat** felelősségteljesen, és hogyan bővítsd a mintát **egyéni stream létrehozással** nagy fájlok vagy aszinkron szcenáriók esetén. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hungarian/net/generate-jpg-and-png-images/_index.md b/html/hungarian/net/generate-jpg-and-png-images/_index.md index 1b75e9ec3..8c4419a38 100644 --- a/html/hungarian/net/generate-jpg-and-png-images/_index.md +++ b/html/hungarian/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Az Aspose.HTML for .NET integrálása a .NET-projektekbe problémamentes. A kön Ismerje meg, hogyan hozhat létre dinamikus weboldalakat az Aspose.HTML for .NET használatával. Ez a lépésenkénti oktatóanyag az előfeltételeket, a névtereket és a HTML képekben való megjelenítését ismerteti. ### [PNG-képek létrehozása ImageDevice segítségével .NET-ben az Aspose.HTML-lel](./generate-png-images-by-imagedevice/) Tanulja meg az Aspose.HTML for .NET használatát HTML-dokumentumok kezeléséhez, HTML-kódok képpé konvertálásához stb. Lépésről lépésre bemutató GYIK. +### [Hogyan engedélyezzük az antialiasingot a DOCX PNG/JPG konvertálásakor](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Ismerje meg, hogyan állíthatja be az antialiasingot a DOCX dokumentumok PNG vagy JPG képekké konvertálásakor az Aspose.HTML for .NET használatával. ## Következtetés @@ -52,4 +54,4 @@ Szóval minek várni? Kezdje el felfedezni a HTML-kép konvertálás világát a {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hungarian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/hungarian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..9b6c032a2 --- /dev/null +++ b/html/hungarian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,262 @@ +--- +category: general +date: 2025-12-27 +description: Ismerje meg, hogyan engedélyezhető az antialiasing a DOCX PNG vagy JPG + formátumba történő konvertálása közben. Ez a lépésről‑lépésre útmutató a DOCX PNG‑re + és DOCX JPG‑re konvertálásáról is szól. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: hu +og_description: Hogyan engedélyezzük az antialiasingot a DOCX fájlok PNG vagy JPG + formátumba konvertálása során. Kövesd ezt a teljes útmutatót a sima, magas minőségű + kimenetért. +og_title: Hogyan kapcsoljunk be antialiasingot a DOCX PNG/JPG formátumba konvertálásakor +tags: +- C# +- Document Rendering +- Image Processing +title: Hogyan kapcsoljuk be az antialiasingot a DOCX PNG/JPG formátumba konvertálásakor +url: /hu/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hogyan engedélyezzük az antialiasingot a DOCX PNG/JPG formátumba konvertálásakor + +Gondolkodtál már azon, **hogyan engedélyezzük az antialiasingot**, hogy a konvertált DOCX képek élesek legyenek ahelyett, hogy szaggatottak? Nem vagy egyedül. Sok fejlesztő akad el, amikor Word dokumentumot kell PNG vagy JPG formátumba alakítani, és a vonalak és szöveg elmosódott szélekkel végződik. A jó hír? Néhány C# sorral a durva kimenetet pixel‑tökéletes grafikává alakíthatod—harmadik fél képszerkesztői nélkül. + +Ebben az útmutatóban végigvezetünk a teljes **convert docx to png** és **convert docx to jpg** folyamaton egy modern renderelő könyvtár használatával. Megtanulod nem csak *how to convert docx*-t, hanem *how to render docx*-t is antialiasing és hinting engedélyezésével, így minden görbület és karakter sima lesz. Nem szükséges előzetes grafikus programozási tapasztalat; csak egy alap C# beállítás és egy DOCX fájl, amelyet képpé szeretnél alakítani. + +--- + +## Amire szükséged lesz + +- **.NET 6+** (vagy .NET Framework 4.6+, ha a klasszikus futtatókörnyezetet részesíted előnyben) +- Egy **DOCX** fájl, amelyet renderelni szeretnél (helyezd el egy `input` nevű mappában a bemutatóhoz) +- A **Aspose.Words for .NET** NuGet csomag (vagy bármely könyvtár, amely elérhetővé teszi a `Document`, `ImageRenderingOptions` és `ImageDevice` osztályokat). Telepítsd a következővel: + +```bash +dotnet add package Aspose.Words +``` + +Ennyi—nem szükséges extra képfeldolgozó eszköz. + +## 1. lépés: A DOCX dokumentum betöltése (how to convert docx) + +Először szükségünk van egy `Document` objektumra, amely a forrásfájlt képviseli. Tekintsd úgy, mint a Word fájl digitális változatát, amelyet a könyvtár be tud olvasni és manipulálni. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Miért fontos:** A dokumentum betöltése az alapja a *how to render docx*-nek. Ha a fájlt nem lehet beolvasni, a későbbi lépések egyike sem fog működni, ezért itt kezdünk. + +## 2. lépés: Képrenderelési beállítások konfigurálása (enable antialiasing) + +Most jön a varázslatos rész—az antialiasing és a hinting bekapcsolása. Az antialiasing simítja a szaggatott éleket, amelyeket általában a átlós vonalaknál látsz, míg a hinting javítja a kis szövegek tisztaságát. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Pro tipp:** Ha valaha teljesítményjavításra van szükséged nagy dokumentumoknál, kikapcsolhatod a `UseAntialiasing`-t, de a vizuális minőség észrevehetően csökken. + +## 3. lépés: Kimeneti formátum kiválasztása – PNG vagy JPG (convert docx to png / convert docx to jpg) + +A `ImageDevice` osztály határozza meg, hová kerülnek a renderelt oldalak. Az `ImageSaveOptions` cseréjével PNG (veszteségmentes) vagy JPG (tömörített) formátumot állíthatsz be. Az alábbiakban két különálló eszközt hozunk létre, hogy egy futtatás során mindkét formátumot előállíthasd. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Miért mindkettő?** A PNG minden pixelt megőriz, ami tökéletes, ha pontos hűségre van szükség (pl. nyomtatás). A JPG ezzel szemben tömöríti a képet, így gyorsabban betölthető egy weboldalon. + +## 4. lépés: A dokumentum oldalak renderelése képekké (how to render docx) + +A kész eszközökkel megmondjuk a `Document`-nek, hogy renderelje az egyes oldalakat. A könyvtár automatikusan végigjárja az összes oldalt, és a megadott elnevezési mintát használva menti őket. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +A kód futtatása után egy sor fájlt találsz, például `page_0.png`, `page_1.png`, … és `page_0.jpg`, `page_1.jpg` a `output` mappában. Minden képre alkalmazva lesz az antialiasing, így a vonalak simák és a szöveg kristálytiszta lesz. + +## 5. lépés: Az eredmény ellenőrzése (expected output) + +Nyisd meg a generált képek egyikét. A következőket kell látnod: + +- **Sima görbék** alakzatokon és diagramokon (nincsenek lépcsőzetes hibák). +- **Éles, olvasható szöveg** még kis betűméreteknél is, a hintingnek köszönhetően. +- **Konzisztensebb színek** a PNG és JPG között (bár a JPG enyhe tömörítési hibákat mutathat, ha alacsonyabb minőséget állítasz be). + +Ha bármilyen elmosódást észlelsz, ellenőrizd, hogy a `UseAntialiasing` `true`-ra van állítva, és hogy a forrás DOCX nem tartalmaz alacsony felbontású raszteres képeket. + +## Gyakori kérdések és szélhelyzetek + +### Mi van, ha csak egy oldalra van szükségem? + +Specifikus oldalt renderelhetsz a `PageInfo` túlterhelés használatával: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Módosíthatom a DPI-t (pont per hüvelyk) a nagyobb felbontású kimenethez? + +Természetesen. Állítsd be a `Resolution` tulajdonságot az `ImageRenderingOptions`-on: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +A magasabb DPI nagyobb fájlokat jelent, de az antialiasing hatása még észrevehetőbb lesz. + +### Hogyan kezeljem a nagy DOCX fájlokat memóriahiány nélkül? + +Renderelj oldalanként, és minden iteráció után szabadítsd fel az eszközt: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### Lehetséges más formátumokra, például BMP vagy TIFF konvertálni? + +Igen—csak cseréld le a `SaveFormat.Png` vagy `SaveFormat.Jpeg`-et `SaveFormat.Bmp` vagy `SaveFormat.Tiff`-re. Az ugyanazok a antialiasing beállítások maradnak. + +## Teljes működő példa (másolás-beillesztés kész) + +Az alábbiakban a teljes program található, amelyet beilleszthetsz egy új konzolprojektbe. Tartalmazza az összes using utasítást, hibakezelést és megjegyzéseket a tisztaság kedvéért. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Eredmény:** A lefordítás után (`dotnet run`) egy sor PNG és JPG fájlt látsz majd a `output` könyvtárban, mindegyikre alkalmazva az antialiasingot. + +## Összegzés + +Áttekintettük, **hogyan engedélyezzük az antialiasingot**, amikor **DOCX-et PNG vagy JPG formátumba konvertálunk**, végigmentünk a pontos lépéseken a **convert docx to png**, **convert docx to jpg** esetén, és még a **how to render docx** témakörre is kitértünk egyedi + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/indonesian/net/advanced-features/_index.md b/html/indonesian/net/advanced-features/_index.md index c267cded6..c52678daf 100644 --- a/html/indonesian/net/advanced-features/_index.md +++ b/html/indonesian/net/advanced-features/_index.md @@ -32,6 +32,8 @@ Pelajari cara bekerja dengan dokumen HTML dalam .NET menggunakan Aspose.HTML unt Pelajari cara menggunakan Aspose.HTML untuk .NET guna memanipulasi dokumen HTML secara efisien. Tutorial langkah demi langkah untuk pengembang. ### [Penyedia Aliran Memori di .NET dengan Aspose.HTML](./memory-stream-provider/) Pelajari cara membuat dokumen HTML yang menakjubkan dalam .NET dengan Aspose.HTML. Ikuti tutorial langkah demi langkah kami dan dapatkan kekuatan manipulasi HTML. +### [Buat Memory Stream C# – Panduan Pembuatan Stream Kustom](./create-memory-stream-c-custom-stream-creation-guide/) +Pelajari cara membuat memory stream di C# dengan panduan langkah demi langkah untuk membuat stream kustom menggunakan Aspose.HTML. ### [Pengikisan Web dalam .NET dengan Aspose.HTML](./web-scraping/) Pelajari cara memanipulasi dokumen HTML dalam .NET dengan Aspose.HTML. Navigasi, filter, kueri, dan pilih elemen secara efektif untuk pengembangan web yang lebih baik. ### [Gunakan Properti Konten yang Diperluas di .NET dengan Aspose.HTML](./use-extended-content-property/) @@ -52,4 +54,4 @@ Aspose.HTML untuk .NET membuka pintu ke dunia kemungkinan dalam hal bekerja deng {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/indonesian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/indonesian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..6b0d24410 --- /dev/null +++ b/html/indonesian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,265 @@ +--- +category: general +date: 2025-12-27 +description: Buat memory stream C# dengan cepat menggunakan panduan langkah demi langkah. + Pelajari cara membuat stream, mengelola sumber daya, dan mengimplementasikan pembuatan + stream khusus di .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: id +og_description: Buat memory stream C# dalam hitungan detik. Tutorial ini menunjukkan + cara membuat stream, mengelola sumber daya, dan membangun pembuatan stream khusus + dengan API .NET modern. +og_title: Buat memory stream C# – Panduan Lengkap Stream Kustom +tags: +- stream +- csharp +- .net +- resource-handling +title: Buat memory stream C# – Panduan pembuatan stream khusus +url: /id/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Buat memory stream c# – Panduan pembuatan stream khusus + +Pernah membutuhkan untuk **create memory stream c#** tetapi tidak yakin API mana yang harus dipilih? Anda tidak sendirian. Di banyak proyek legacy Anda akan menemukan `IOutputStorage`, sementara basis kode yang lebih baru lebih menyukai `ResourceHandler`. Bagaimanapun, tujuannya sama: menghasilkan sebuah `Stream` yang dapat dikonsumsi oleh kerangka kerja Anda. + +Dalam tutorial ini Anda akan belajar **how to create stream** objek, **how to handle resources** dengan aman, dan menguasai **custom stream creation** untuk versi perpustakaan pre‑24.2 dan 24.2+. Pada akhir tutorial Anda akan memiliki contoh yang dapat langsung digunakan dalam solusi .NET apa pun—tanpa referensi misterius, hanya C# murni. + +## Apa yang akan Anda dapatkan + +- Perbandingan jelas antara pola legacy `IOutputStorage` dengan pendekatan modern `ResourceHandler`. +- Kode lengkap, siap salin‑tempel yang dapat dikompilasi pada .NET 6+ (atau versi lebih lama, jika Anda membutuhkannya). +- Tips untuk kasus tepi seperti membuang (dispose) stream, menangani payload besar, dan menguji stream khusus Anda. + +> **Pro tip:** Jika Anda menargetkan .NET 8, `ResourceHandler` yang lebih baru memberikan dukungan async bawaan, yang dapat mengurangi beberapa milidetik pada skenario throughput tinggi. + +## Buat memory stream c# – Pendekatan Legacy (pre‑24.2) + +Ketika Anda terjebak pada versi perpustakaan yang lebih lama, kontrak yang harus Anda penuhi adalah `IOutputStorage`. Antarmuka hanya meminta sebuah metode yang mengembalikan `Stream` untuk nama sumber daya tertentu. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Mengapa ini berhasil + +- **Interface contract** – Kerangka kerja akan memanggil `CreateStream` setiap kali perlu menulis output. +- **Flexibility** – Karena Anda mengembalikan `Stream`, Anda dapat mengganti `MemoryStream` dengan `FileStream` atau bahkan stream berbuffer khusus nanti tanpa mengubah kode lainnya. +- **Resource safety** – Pemanggil bertanggung jawab untuk membuang (dispose) stream yang dikembalikan, itulah mengapa kami tidak memanggil `Dispose` di dalam metode. + +### Kesalahan umum + +| Masalah | Apa yang terjadi | Perbaikan | +|---------|------------------|-----------| +| Mengembalikan stream yang tertutup | Konsumen akan mendapatkan `ObjectDisposedException` saat menulis. | Pastikan stream **terbuka** saat Anda menyerahkannya. | +| Lupa mengatur `Position = 0` setelah menulis | Data terlihat kosong saat dibaca nanti. | Panggil `stream.Seek(0, SeekOrigin.Begin)` sebelum mengembalikan jika Anda telah mengisi sebelumnya. | +| Menggunakan `MemoryStream` yang sangat besar untuk file besar | Kegagalan karena kehabisan memori. | Beralih ke `FileStream` sementara atau stream berbuffer khusus. | + +## Buat memory stream c# – Pendekatan Modern (24.2+) + +Mulai dari versi 24.2 perpustakaan memperkenalkan `ResourceHandler`. Alih-alih antarmuka, Anda kini mewarisi dari kelas dasar dan menimpa satu metode. Ini memberi Anda titik masuk yang lebih bersih dan ramah async. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Mengapa memilih `ResourceHandler` + +- **Async support** – Metode `HandleResourceAsync` memungkinkan Anda melakukan I/O tanpa memblokir thread. +- **Built‑in error handling** – Kelas dasar menangkap pengecualian dan mengubahnya menjadi kode error spesifik kerangka kerja. +- **Future‑proof** – Rilis terbaru menambahkan hook (mis., logging, telemetry) yang hanya berfungsi dengan pola handler. + +### Penanganan kasus tepi + +1. **Disposal** – Kerangka kerja membuang (dispose) stream setelah selesai, tetapi jika Anda membungkus disposable lain (seperti `FileStream`) Anda harus mengimplementasikan blok `using` di dalam metode dan mengembalikan pembungkus yang meneruskan `Dispose`. +2. **Large payloads** – Jika Anda memperkirakan payload > 100 MB, gantilah `MemoryStream` dengan `FileStream` yang menunjuk ke file sementara. Contoh: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` +3. **Testing** – Uji unit handler Anda dengan menyuntikkan mock `IServiceProvider` jika kelas dasar mengambil layanan dari DI. Verifikasi bahwa `HandleResource` mengembalikan stream yang dapat ditulis dan dibaca. + +## Cara membuat stream – Panduan cepat + +| Skenario | API yang Disarankan | Contoh Kode | +|----------|---------------------|-------------| +| Data sederhana dalam memori | `MemoryStream` | `new MemoryStream()` | +| File sementara besar | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Sumber berbasis jaringan | `NetworkStream` | `new NetworkStream(socket)` | +| Buffering khusus | Derive from `Stream` | Lihat [Microsoft docs] untuk implementasi stream khusus | + +> **Catatan:** Selalu atur `stream.Position = 0` sebelum mengembalikan jika Anda mengisi stream sebelumnya; jika tidak, pembaca hilir akan menganggap stream kosong. + +## Ilustrasi Gambar + +![Diagram yang menunjukkan proses create memory stream c# process](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* diagram yang menunjukkan proses create memory stream c# process + +## Contoh lengkap yang dapat dijalankan + +Berikut adalah aplikasi console minimal yang menunjukkan kedua pendekatan legacy dan modern. Anda dapat menyalin‑tempelnya ke dalam proyek console .NET 6 baru dan menjalankannya apa adanya. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Output yang diharapkan** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +Program ini menunjukkan tiga cara untuk **how to create stream**: `IOutputStorage` lama, `HandleResource` sinkron baru, dan `HandleResourceAsync` async. Ketiga cara tersebut mengembalikan `MemoryStream`, membuktikan bahwa pembuatan stream khusus berfungsi terlepas dari versi mana yang Anda targetkan. + +## Pertanyaan yang sering diajukan (FAQ) + +**Q: Apakah saya perlu memanggil `Dispose` pada stream yang saya terima?** +A: Kerangka kerja (atau kode pemanggil Anda) bertanggung jawab atas pembuangan. Jika Anda membungkus disposable lain di dalam stream yang dikembalikan, pastikan ia meneruskan panggilan `Dispose`. + +**Q: Bisakah saya mengembalikan stream hanya-baca?** +A: Ya, tetapi kontrak biasanya mengharapkan stream yang dapat ditulis. Jika Anda hanya perlu membaca, implementasikan `CanWrite => false` dan dokumentasikan keterbatasannya. + +**Q: Bagaimana jika data saya lebih besar dari RAM yang tersedia?** +A: Beralih ke `FileStream` yang didukung oleh file sementara, atau implementasikan stream berbuffer khusus yang menulis ke disk dalam potongan. + +**Q: Apakah ada perbedaan kinerja antara kedua pendekatan?** +A: `ResourceHandler` modern menambahkan overhead kecil karena logika kelas dasar tambahan, tetapi versi async dapat secara dramatis meningkatkan throughput pada tingkat konkruensi tinggi. + +## Kesimpulan + +Kami baru saja membahas **create memory stream c#** dari semua sudut yang mungkin Anda temui di lapangan. Sekarang Anda tahu **how to create stream** menggunakan pola legacy `IOutputStorage` dan kelas `ResourceHandler` yang lebih baru, serta telah melihat tips praktis untuk **how to handle resources** secara bertanggung jawab dan memperluas pola dengan **custom stream creation** untuk file besar atau skenario async. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/indonesian/net/generate-jpg-and-png-images/_index.md b/html/indonesian/net/generate-jpg-and-png-images/_index.md index c39a02059..689d5921e 100644 --- a/html/indonesian/net/generate-jpg-and-png-images/_index.md +++ b/html/indonesian/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Mengintegrasikan Aspose.HTML untuk .NET ke dalam proyek .NET Anda tidak akan mer Pelajari cara membuat halaman web dinamis menggunakan Aspose.HTML untuk .NET. Tutorial langkah demi langkah ini mencakup prasyarat, namespace, dan rendering HTML ke gambar. ### [Hasilkan Gambar PNG dengan ImageDevice di .NET dengan Aspose.HTML](./generate-png-images-by-imagedevice/) Pelajari cara menggunakan Aspose.HTML untuk .NET guna memanipulasi dokumen HTML, mengonversi HTML menjadi gambar, dan banyak lagi. Tutorial langkah demi langkah dengan Tanya Jawab Umum. +### [Cara Mengaktifkan Antialiasing Saat Mengonversi DOCX ke PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Pelajari cara mengaktifkan antialiasing untuk meningkatkan kualitas gambar PNG atau JPG saat mengonversi dokumen DOCX menggunakan Aspose.HTML. ## Kesimpulan @@ -52,4 +54,4 @@ Jadi, tunggu apa lagi? Mulailah menjelajahi dunia konversi HTML ke gambar dengan {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/indonesian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/indonesian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..5a70e51ae --- /dev/null +++ b/html/indonesian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,277 @@ +--- +category: general +date: 2025-12-27 +description: Pelajari cara mengaktifkan antialiasing saat mengonversi DOCX ke PNG + atau JPG. Panduan langkah demi langkah ini juga mencakup cara mengonversi DOCX ke + PNG dan mengonversi DOCX ke JPG. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: id +og_description: Cara mengaktifkan antialiasing saat mengonversi file DOCX ke PNG atau + JPG. Ikuti panduan lengkap ini untuk output yang halus dan berkualitas tinggi. +og_title: Cara Mengaktifkan Antialiasing Saat Mengonversi DOCX ke PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: Cara Mengaktifkan Antialiasing Saat Mengonversi DOCX ke PNG/JPG +url: /id/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cara Mengaktifkan Antialiasing Saat Mengonversi DOCX ke PNG/JPG + +Pernah bertanya-tanya **bagaimana cara mengaktifkan antialiasing** sehingga gambar DOCX yang Anda konversi terlihat tajam bukan bergerigi? Anda tidak sendirian. Banyak pengembang menemui kendala ketika harus mengubah dokumen Word menjadi PNG atau JPG dan berakhir dengan tepi yang buram pada garis dan teks. Kabar baiknya? Dengan beberapa baris C# Anda dapat mengubah output yang kasar menjadi grafik pixel‑perfect—tanpa memerlukan editor gambar pihak ketiga. + +Dalam tutorial ini kami akan membahas seluruh proses **convert docx to png** dan **convert docx to jpg** menggunakan perpustakaan rendering modern. Anda akan belajar tidak hanya *how to convert docx* tetapi juga *how to render docx* dengan antialiasing dan hinting diaktifkan, sehingga setiap kurva dan karakter tampak halus. Tidak diperlukan pengalaman sebelumnya dalam pemrograman grafis; cukup dengan setup C# dasar dan file DOCX yang ingin Anda ubah menjadi gambar. + +--- + +## Apa yang Anda Butuhkan + +- **.NET 6+** (atau .NET Framework 4.6+ jika Anda lebih suka runtime klasik) +- File **DOCX** yang ingin Anda render (letakkan di folder bernama `input` untuk demo) +- Paket NuGet **Aspose.Words for .NET** (atau perpustakaan apa pun yang menyediakan `Document`, `ImageRenderingOptions`, dan `ImageDevice`). Instal dengan: + +```bash +dotnet add package Aspose.Words +``` + +Itu saja—tidak diperlukan alat pemrosesan gambar tambahan. + +--- + +## Langkah 1: Muat Dokumen DOCX (how to convert docx) + +Pertama kita memerlukan objek `Document` yang mewakili file sumber. Anggaplah ini sebagai versi digital dari file Word Anda yang dapat dibaca dan dimanipulasi oleh perpustakaan. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Mengapa ini penting:** Memuat dokumen adalah fondasi untuk *how to render docx*. Jika file tidak dapat dibaca, langkah-langkah selanjutnya tidak akan berfungsi, jadi kita mulai dari sini. + +--- + +## Langkah 2: Konfigurasikan Image Rendering Options (enable antialiasing) + +Sekarang bagian magis—mengaktifkan antialiasing dan hinting. Antialiasing melicinkan tepi bergerigi yang biasanya terlihat pada garis diagonal, sementara hinting meningkatkan kejelasan teks kecil. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Tips pro:** Jika Anda membutuhkan peningkatan performa pada dokumen yang sangat besar, Anda dapat mematikan `UseAntialiasing`, namun kualitas visual akan berkurang secara signifikan. + +--- + +## Langkah 3: Pilih Format Output – PNG atau JPG (convert docx to png / convert docx to jpg) + +Kelas `ImageDevice` menentukan ke mana halaman yang dirender akan disimpan. Dengan mengganti `ImageSaveOptions` Anda dapat menghasilkan PNG (lossless) atau JPG (terkompresi). Di bawah ini kami membuat dua perangkat terpisah sehingga Anda dapat menghasilkan kedua format dalam satu kali proses. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Mengapa keduanya?** PNG mempertahankan setiap pixel, yang sempurna ketika Anda memerlukan fidelitas tepat (misalnya untuk pencetakan). JPG, di sisi lain, mengompresi gambar, membuatnya lebih cepat dimuat di situs web. + +--- + +## Langkah 4: Render Halaman Dokumen ke Gambar (how to render docx) + +Dengan perangkat siap, kami memberi tahu `Document` untuk merender setiap halaman. Perpustakaan secara otomatis akan melintasi semua halaman dan menyimpannya menggunakan pola penamaan yang telah kami tentukan. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Setelah menjalankan kode, Anda akan menemukan serangkaian file seperti `page_0.png`, `page_1.png`, … dan `page_0.jpg`, `page_1.jpg` di dalam folder `output`. Setiap gambar akan memiliki antialiasing yang diterapkan, sehingga garis menjadi halus dan teks sangat jelas. + +--- + +## Langkah 5: Verifikasi Hasil (expected output) + +Buka salah satu gambar yang dihasilkan. Anda seharusnya melihat: + +- **Kurva halus** pada bentuk dan diagram (tanpa artefak bertingkat). +- **Teks tajam dan dapat dibaca** bahkan pada ukuran font kecil, berkat hinting. +- **Warna konsisten** antara PNG dan JPG (meskipun JPG mungkin menunjukkan artefak kompresi ringan jika Anda menurunkan kualitas). + +Jika Anda melihat keburaman, periksa kembali bahwa `UseAntialiasing` diset ke `true` dan bahwa file DOCX sumber Anda tidak berisi gambar raster beresolusi rendah. + +--- + +## Pertanyaan Umum & Kasus Khusus + +### Bagaimana jika saya hanya membutuhkan satu halaman? + +Anda dapat merender halaman tertentu dengan menggunakan overload `PageInfo`: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Bisakah saya mengubah DPI (dots per inch) untuk output beresolusi lebih tinggi? + +Tentu saja. Sesuaikan properti `Resolution` pada `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +DPI yang lebih tinggi berarti file yang lebih besar, tetapi efek antialiasing menjadi lebih terlihat. + +### Bagaimana cara menangani file DOCX besar tanpa kehabisan memori? + +Render halaman satu per satu dan buang (dispose) perangkat setelah setiap iterasi: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### Apakah memungkinkan mengonversi ke format lain seperti BMP atau TIFF? + +Ya—cukup ganti `SaveFormat.Png` atau `SaveFormat.Jpeg` dengan `SaveFormat.Bmp` atau `SaveFormat.Tiff`. Pengaturan antialiasing yang sama tetap berlaku. + +--- + +## Contoh Lengkap yang Siap Pakai (Copy‑Paste Ready) + +Berikut adalah program lengkap yang dapat Anda masukkan ke proyek konsol baru. Termasuk semua pernyataan `using`, penanganan error, dan komentar untuk kejelasan. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Hasil:** Setelah dikompilasi (`dotnet run`) Anda akan melihat serangkaian file PNG dan JPG di direktori `output`, masing‑masing dengan antialiasing yang diterapkan. + +--- + +## Kesimpulan + +Kami telah membahas **bagaimana cara mengaktifkan antialiasing** ketika Anda **mengonversi DOCX ke PNG atau JPG**, melangkah melalui proses **convert docx to png**, **convert docx to jpg**, dan bahkan menyentuh **how to render docx** untuk kebutuhan khusus. + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/italian/net/advanced-features/_index.md b/html/italian/net/advanced-features/_index.md index f41f6e261..7658a06fd 100644 --- a/html/italian/net/advanced-features/_index.md +++ b/html/italian/net/advanced-features/_index.md @@ -42,7 +42,8 @@ Converti dinamicamente HTML in PDF con Aspose.HTML per .NET. Facile integrazione Scopri come convertire HTML in PDF, XPS e immagini con Aspose.HTML per .NET. Esercitazione dettagliata con esempi di codice e FAQ. ### [Utilizzo di modelli HTML in .NET con Aspose.HTML](./using-html-templates/) Scopri come usare Aspose.HTML per .NET per generare dinamicamente documenti HTML da dati JSON. Sfrutta la potenza della manipolazione HTML nelle tue applicazioni .NET. - +### [Crea stream di memoria in C# – Guida alla creazione di stream personalizzati](./create-memory-stream-c-custom-stream-creation-guide/) +Scopri come creare uno stream di memoria personalizzato in C# usando Aspose.HTML per .NET. Esempi passo passo e consigli pratici. ## Conclusione @@ -52,4 +53,4 @@ Aspose.HTML per .NET apre le porte a un mondo di possibilità quando si tratta d {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/italian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/italian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..73a0d1036 --- /dev/null +++ b/html/italian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,280 @@ +--- +category: general +date: 2025-12-27 +description: Crea rapidamente un MemoryStream in C# con una guida passo‑passo. Scopri + come creare lo stream, gestire le risorse e implementare la creazione di stream + personalizzati in .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: it +og_description: Crea stream di memoria in C# in pochi secondi. Questo tutorial mostra + come creare uno stream, gestire le risorse e costruire la creazione di stream personalizzati + con le moderne API .NET. +og_title: Crea stream di memoria C# – Guida completa allo stream personalizzato +tags: +- stream +- csharp +- .net +- resource-handling +title: Crea stream di memoria c# – Guida alla creazione di stream personalizzati +url: /it/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Crea memory stream c# – Guida alla creazione di stream personalizzati + +Ti è mai capitato di dover **creare memory stream c#** senza sapere quale API scegliere? Non sei il solo. In molti progetti legacy troverai `IOutputStorage`, mentre i codebase più recenti preferiscono `ResourceHandler`. In entrambi i casi l’obiettivo è lo stesso: produrre uno `Stream` che il tuo framework possa consumare. + +In questo tutorial imparerai **come creare stream** oggetti, **come gestire le risorse** in modo sicuro e padroneggerai la **creazione di stream personalizzati** sia per le versioni pre‑24.2 sia per le versioni 24.2+ della libreria. Alla fine avrai un esempio funzionante da inserire in qualsiasi soluzione .NET—senza riferimenti misteriosi, solo puro C#. + +## Cosa otterrai + +- Un confronto chiaro tra il pattern legacy `IOutputStorage` e l’approccio moderno `ResourceHandler`. +- Codice completo, pronto da copiare‑incollare, che compila su .NET 6+ (o versioni precedenti, se necessario). +- Suggerimenti per casi limite come il rilascio degli stream, la gestione di payload di grandi dimensioni e il testing del tuo stream personalizzato. + +> **Pro tip:** Se punti a .NET 8, il nuovo `ResourceHandler` fornisce supporto async integrato, che può ridurre di qualche millisecondo gli scenari ad alto throughput. + +--- + +## Crea memory stream c# – Approccio legacy (pre‑24.2) + +Quando sei bloccato su una versione più vecchia della libreria, il contratto da soddisfare è `IOutputStorage`. L’interfaccia richiede solo un metodo che restituisca uno `Stream` per un dato nome di risorsa. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Perché funziona + +- **Contratto dell’interfaccia** – Il framework chiamerà `CreateStream` ogni volta che deve scrivere un output. +- **Flessibilità** – Poiché restituisci uno `Stream`, puoi sostituire `MemoryStream` con `FileStream` o anche con uno stream bufferizzato personalizzato in seguito senza toccare il resto del codice. +- **Sicurezza delle risorse** – Chi chiama è responsabile del rilascio dello stream restituito, per questo non chiamiamo `Dispose` all’interno del metodo. + +### Insidie comuni + +| Problema | Cosa succede | Correzione | +|----------|--------------|------------| +| Restituire uno stream chiuso | I consumatori otterranno `ObjectDisposedException` durante la scrittura. | Assicurati che lo stream sia **aperto** quando lo passi. | +| Dimenticare di impostare `Position = 0` dopo la scrittura | I dati appaiono vuoti quando letti in seguito. | Chiama `stream.Seek(0, SeekOrigin.Begin)` prima di restituirlo se lo hai pre‑popolato. | +| Usare un enorme `MemoryStream` per file grandi | Crash per out‑of‑memory. | Passa a un `FileStream` temporaneo o a uno stream bufferizzato personalizzato. | + +--- + +## Crea memory stream c# – Approccio moderno (24.2+) + +A partire dalla versione 24.2 la libreria ha introdotto `ResourceHandler`. Invece di un’interfaccia ora erediti da una classe base e sovrascrivi un unico metodo. Questo ti offre un punto di ingresso più pulito e compatibile con async. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Perché preferire `ResourceHandler` + +- **Supporto async** – Il metodo `HandleResourceAsync` ti permette di eseguire I/O senza bloccare i thread. +- **Gestione errori integrata** – La classe base cattura le eccezioni e le converte in codici di errore specifici del framework. +- **Future‑proof** – Le versioni più recenti aggiungono hook (es. logging, telemetry) che funzionano solo con il pattern handler. + +### Gestione dei casi limite + +1. **Disposizione** – Il framework dispone lo stream dopo l’uso, ma se avvolgi un altro disposable (come un `FileStream`) dovresti implementare un blocco `using` all’interno del metodo e restituire un wrapper che inoltri `Dispose`. +2. **Payload di grandi dimensioni** – Se prevedi payload > 100 MB, sostituisci `MemoryStream` con un `FileStream` puntato a un file temporaneo. Esempio: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – Testa unitariamente il tuo handler iniettando un mock `IServiceProvider` se la classe base preleva servizi dal DI. Verifica che `HandleResource` restituisca uno stream su cui è possibile scrivere e leggere. + +--- + +## Come creare stream – Cheat sheet veloce + +| Scenario | API consigliata | Codice di esempio | +|----------|-----------------|-------------------| +| Dati semplici in‑memory | `MemoryStream` | `new MemoryStream()` | +| File temporanei di grandi dimensioni | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Fonte basata su rete | `NetworkStream` | `new NetworkStream(socket)` | +| Buffering personalizzato | Deriva da `Stream` | Vedi [Microsoft docs] per l’implementazione di uno stream personalizzato | + +> **Nota:** Imposta sempre `stream.Position = 0` prima di restituirlo se lo hai pre‑popolato; altrimenti i lettori a valle penseranno che lo stream sia vuoto. + +--- + +## Illustrazione + +![Diagram showing create memory stream c# process](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* diagram showing create memory stream c# process + +--- + +## Esempio completo eseguibile + +Di seguito trovi una minima console app che dimostra sia l’approccio legacy sia quello moderno. Puoi copiarla e incollarla in un nuovo progetto console .NET 6 e farla girare così com’è. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Output previsto** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +Il programma mostra tre modi per **come creare stream**: il vecchio `IOutputStorage`, il nuovo `HandleResource` sincrono e il `HandleResourceAsync` asincrono. Tutti e tre restituiscono un `MemoryStream`, dimostrando che la creazione di stream personalizzati funziona indipendentemente dalla versione target. + +--- + +## Domande frequenti (FAQ) + +**D: Devo chiamare `Dispose` sullo stream restituito?** +R: Il framework (o il tuo codice chiamante) è responsabile del rilascio. Se avvolgi un altro disposable dentro lo stream restituito, assicurati che propaghi la chiamata a `Dispose`. + +**D: Posso restituire uno stream di sola lettura?** +R: Sì, ma il contratto solitamente si aspetta uno stream scrivibile. Se ti serve solo lettura, implementa `CanWrite => false` e documenta la limitazione. + +**D: Cosa succede se i miei dati superano la RAM disponibile?** +R: Passa a un `FileStream` basato su un file temporaneo, oppure implementa uno stream bufferizzato personalizzato che scrive su disco a blocchi. + +**D: C’è qualche differenza di performance tra i due approcci?** +R: `ResourceHandler` aggiunge un piccolo overhead per la logica della classe base, ma la versione async può migliorare notevolmente il throughput in scenari ad alta concorrenza. + +--- + +## Conclusione + +Abbiamo appena coperto **create memory stream c#** da ogni angolazione possibile. Ora sai **come creare stream** usando sia il pattern legacy `IOutputStorage` sia la nuova classe `ResourceHandler`, hai visto consigli pratici per **come gestire le risorse** in modo responsabile e come estendere il pattern con **creazione di stream personalizzati** per file di grandi dimensioni o scenari async. + +Pronto per + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/italian/net/generate-jpg-and-png-images/_index.md b/html/italian/net/generate-jpg-and-png-images/_index.md index 436e507d9..d6812dd97 100644 --- a/html/italian/net/generate-jpg-and-png-images/_index.md +++ b/html/italian/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Integrare Aspose.HTML per .NET nei tuoi progetti .NET è semplice. La libreria Scopri come creare pagine web dinamiche usando Aspose.HTML per .NET. Questo tutorial passo dopo passo riguarda i prerequisiti, gli spazi dei nomi e il rendering di HTML in immagini. ### [Genera immagini PNG tramite ImageDevice in .NET con Aspose.HTML](./generate-png-images-by-imagedevice/) Impara a usare Aspose.HTML per .NET per manipolare documenti HTML, convertire HTML in immagini e altro ancora. Tutorial passo dopo passo con FAQ. +### [Come abilitare l'antialiasing durante la conversione di DOCX in PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Scopri come abilitare l'antialiasing durante la conversione di documenti DOCX in immagini PNG o JPG con Aspose.HTML per .NET. ## Conclusione @@ -52,4 +54,4 @@ Quindi, perché aspettare? Inizia a esplorare il mondo della conversione da HTML {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/italian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/italian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..74399b8b6 --- /dev/null +++ b/html/italian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,278 @@ +--- +category: general +date: 2025-12-27 +description: Scopri come abilitare l'antialiasing durante la conversione da DOCX a + PNG o JPG. Questa guida passo passo copre anche la conversione da DOCX a PNG e da + DOCX a JPG. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: it +og_description: Come abilitare l'antialiasing durante la conversione di file DOCX + in PNG o JPG. Segui questa guida completa per ottenere un output fluido e di alta + qualità. +og_title: Come abilitare l'antialiasing durante la conversione da DOCX a PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: Come abilitare l'anti-aliasing durante la conversione da DOCX a PNG/JPG +url: /it/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Come abilitare l'antialiasing durante la conversione da DOCX a PNG/JPG + +Ti sei mai chiesto **come abilitare l'antialiasing** così le immagini convertite da DOCX appaiono nitide invece che frastagliate? Non sei l'unico. Molti sviluppatori si trovano in difficoltà quando devono trasformare un documento Word in PNG o JPG e finiscono con bordi sfocati su linee e testo. La buona notizia? Con poche righe di C# puoi trasformare quell'output grezzo in grafiche pixel‑perfect—senza editor di immagini di terze parti. + +In questo tutorial percorreremo l'intero processo di **convert docx to png** e **convert docx to jpg** usando una libreria di rendering moderna. Imparerai non solo *come convertire docx* ma anche *come renderizzare docx* con antialiasing e hinting abilitati, così ogni curva e carattere appare fluido. Non è necessaria alcuna esperienza pregressa di programmazione grafica; basta un setup C# di base e un file DOCX che vuoi trasformare in immagine. + +--- + +## Cosa ti servirà + +- **.NET 6+** (o .NET Framework 4.6+ se preferisci il runtime classico) +- Un file **DOCX** che desideri renderizzare (posizionalo in una cartella chiamata `input` per la demo) +- Il pacchetto NuGet **Aspose.Words for .NET** (o qualsiasi libreria che esponga `Document`, `ImageRenderingOptions` e `ImageDevice`). Installalo con: + +```bash +dotnet add package Aspose.Words +``` + +Tutto qui—nessun tool extra di elaborazione immagini è richiesto. + +--- + +## Passo 1: Caricare il documento DOCX (how to convert docx) + +Per prima cosa abbiamo bisogno di un oggetto `Document` che rappresenti il file sorgente. Pensalo come la versione digitale del tuo file Word che la libreria può leggere e manipolare. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Perché è importante:** Il caricamento del documento è la base per *how to render docx*. Se il file non può essere letto, nessuno dei passaggi successivi funzionerà, quindi iniziamo da qui. + +--- + +## Passo 2: Configurare le opzioni di rendering dell'immagine (enable antialiasing) + +Ora arriva la parte magica—attivare antialiasing e hinting. L'antialiasing leviga i bordi frastagliati che normalmente vedresti su linee diagonali, mentre l'hinting migliora la chiarezza del testo piccolo. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Consiglio professionale:** Se hai bisogno di un boost di performance su documenti molto grandi, puoi disattivare `UseAntialiasing`, ma la qualità visiva ne risentirà visibilmente. + +--- + +## Passo 3: Scegliere il formato di output – PNG o JPG (convert docx to png / convert docx to jpg) + +La classe `ImageDevice` decide dove andare a finire le pagine renderizzate. Scambiando le `ImageSaveOptions` puoi produrre PNG (lossless) o JPG (compresso). Di seguito creiamo due dispositivi separati così puoi generare entrambi i formati in un'unica esecuzione. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Perché entrambi?** PNG conserva ogni pixel, perfetto quando ti serve fedeltà assoluta (es. stampa). JPG, invece, comprime l'immagine, rendendola più veloce da caricare su un sito web. + +--- + +## Passo 4: Renderizzare le pagine del documento in immagini (how to render docx) + +Con i dispositivi pronti, ordiniamo al `Document` di renderizzare ogni pagina. La libreria ciclerà automaticamente tutte le pagine e le salverà usando il pattern di denominazione che abbiamo definito. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Dopo aver eseguito il codice, troverai una serie di file come `page_0.png`, `page_1.png`, … e `page_0.jpg`, `page_1.jpg` nella cartella `output`. Ogni immagine avrà l'antialiasing applicato, quindi linee fluide e testo cristallino. + +--- + +## Passo 5: Verificare il risultato (expected output) + +Apri una delle immagini generate. Dovresti vedere: + +- **Curve fluide** su forme e grafici (nessun artefatto a gradini). +- **Testo nitido e leggibile** anche a dimensioni di font ridotte, grazie all'hinting. +- **Colori coerenti** tra PNG e JPG (anche se JPG può mostrare lievi artefatti di compressione se abbassi la qualità). + +Se noti qualche sfocatura, ricontrolla che `UseAntialiasing` sia impostato a `true` e che il tuo DOCX sorgente non contenga immagini raster a bassa risoluzione. + +--- + +## Domande frequenti & casi particolari + +### E se avessi bisogno di una sola pagina? + +Puoi renderizzare una pagina specifica usando la sovraccarico `PageInfo`: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Posso cambiare DPI (dots per inch) per un output ad alta risoluzione? + +Assolutamente. Modifica la proprietà `Resolution` su `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Un DPI più alto genera file più grandi, ma l'effetto dell'antialiasing diventa ancora più evidente. + +### Come gestire file DOCX molto grandi senza esaurire la memoria? + +Renderizza le pagine una alla volta e rilascia il dispositivo dopo ogni iterazione: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### È possibile convertire in altri formati come BMP o TIFF? + +Sì—basta sostituire `SaveFormat.Png` o `SaveFormat.Jpeg` con `SaveFormat.Bmp` o `SaveFormat.Tiff`. Le stesse impostazioni di antialiasing vengono mantenute. + +--- + +## Esempio completo funzionante (pronto per copia‑incolla) + +Di seguito trovi il programma completo da inserire in un nuovo progetto console. Include tutti i `using`, la gestione degli errori e i commenti per chiarezza. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Risultato:** Dopo la compilazione (`dotnet run`) vedrai una serie di file PNG e JPG nella directory `output`, ognuno con antialiasing applicato. + +--- + +## Conclusione + +Abbiamo coperto **come abilitare l'antialiasing** quando **converti DOCX in PNG o JPG**, illustrato i passaggi esatti per **convert docx to png**, **convert docx to jpg**, e persino accennato a **how to render docx** per personalizzazioni. + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/japanese/net/advanced-features/_index.md b/html/japanese/net/advanced-features/_index.md index 890654f4f..124414d1b 100644 --- a/html/japanese/net/advanced-features/_index.md +++ b/html/japanese/net/advanced-features/_index.md @@ -42,6 +42,8 @@ Aspose.HTML for .NET を使用して HTML を PDF に動的に変換します。 Aspose.HTML for .NET を使用して HTML を PDF、XPS、画像に変換する方法を学びます。コード例と FAQ を含むステップバイステップのチュートリアルです。 ### [Aspose.HTML を使用して .NET で HTML テンプレートを使用する](./using-html-templates/) Aspose.HTML for .NET を使用して JSON データから HTML ドキュメントを動的に生成する方法を学びます。.NET アプリケーションで HTML 操作のパワーを活用します。 +### [C# のメモリ ストリーム作成 – カスタム ストリーム作成ガイド](./create-memory-stream-c-custom-stream-creation-guide/) +C# でカスタム メモリ ストリームを作成し、Aspose.HTML での HTML 操作に活用する方法をステップバイステップで学びます。 ## 結論 @@ -52,4 +54,4 @@ Aspose.HTML for .NET は、.NET アプリケーションで HTML ドキュメン {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/japanese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/japanese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..9f15cc24a --- /dev/null +++ b/html/japanese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,281 @@ +--- +category: general +date: 2025-12-27 +description: ステップバイステップのガイドで、C# のメモリストリームをすぐに作成しましょう。ストリームの作成方法、リソースの管理、.NET でのカスタムストリーム作成の実装を学びます。 +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: ja +og_description: 数秒で C# のメモリストリームを作成する。このチュートリアルでは、ストリームの作成方法、リソースの管理方法、そして最新の .NET + API を使用したカスタムストリームの構築方法を示します。 +og_title: C#でメモリストリームを作成 – 完全カスタムストリームガイド +tags: +- stream +- csharp +- .net +- resource-handling +title: メモリストリームの作成 C# – カスタムストリーム作成ガイド +url: /ja/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Create memory stream c# – カスタムストリーム作成ガイド + +Ever needed to **create memory stream c#** but weren't sure which API to pick? You're not the only one. In many legacy projects you’ll find `IOutputStorage`, while newer codebases prefer `ResourceHandler`. Either way, the goal is the same: produce a `Stream` that your framework can consume. + +メモリストリーム c# を **create memory stream c#** したいことはありますか、どの API を選べばよいか分からないことはありませんか? あなただけではありません。多くのレガシープロジェクトでは `IOutputStorage` が見つかりますが、新しいコードベースでは `ResourceHandler` が好まれます。どちらにしても目的は同じです:フレームワークが使用できる `Stream` を生成することです。 + +In this tutorial you’ll learn **how to create stream** objects, **how to handle resources** safely, and master **custom stream creation** for both pre‑24.2 and 24.2+ versions of the library. By the end you’ll have a working example you can drop into any .NET solution—no mystery references, just pure C#. + +このチュートリアルでは **how to create stream** オブジェクトの作成方法、**how to handle resources** の安全な取り扱い方法、そしてライブラリの pre‑24.2 と 24.2+ バージョンの両方に対応した **custom stream creation** をマスターします。最後までに、任意の .NET ソリューションに組み込める動作例が手に入ります—不明な参照はなく、純粋な C# だけです。 + +## 学んだこと + +- レガシー `IOutputStorage` パターンとモダンな `ResourceHandler` アプローチの明確な比較。 +- コピー&ペーストで使用でき、.NET 6+(必要に応じてそれ以前)でコンパイルできる完全なコード。 +- ストリームの破棄、巨大ペイロードの処理、カスタムストリームのテストなど、エッジケースに関するヒント。 + +> **Pro tip:** .NET 8 を対象にしている場合、 newer `ResourceHandler` は組み込みの非同期サポートを提供し、高スループットシナリオで数ミリ秒の削減が可能です。 + +--- + +## Create memory stream c# – Legacy approach (pre‑24.2) + +ライブラリの古いバージョンに縛られている場合、満たすべき契約は `IOutputStorage` です。このインターフェースは、指定されたリソース名に対して `Stream` を返すメソッドだけを要求します。 + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### これが機能する理由 + +- **Interface contract** – フレームワークは出力を書き込む必要があるときに `CreateStream` を呼び出します。 +- **Flexibility** – `Stream` を返すので、後で `MemoryStream` を `FileStream` やカスタムバッファードストリームに差し替えても、他のコードを変更する必要はありません。 +- **Resource safety** – 呼び出し側が返されたストリームの破棄を担当するため、メソッド内で `Dispose` を呼び出さないようにしています。 + +### よくある落とし穴 + +| 問題 | 何が起こるか | 対策 | +|-------|--------------|-----| +| 閉じたストリームを返す | 書き込み時に `ObjectDisposedException` が発生します。 | ストリームを渡すときは **開いた状態** にしてください。 | +| 書き込み後に `Position = 0` を設定し忘れる | 後で読み取るとデータが空になっているように見えます。 | 事前にデータを入れる場合は、返す前に `stream.Seek(0, SeekOrigin.Begin)` を呼び出してください。 | +| 大きなファイルに巨大な `MemoryStream` を使用する | メモリ不足でクラッシュします。 | 一時的な `FileStream` またはカスタムバッファードストリームに切り替えてください。 | + +--- + +## Create memory stream c# – Modern approach (24.2+) + +バージョン 24.2 から、ライブラリは `ResourceHandler` を導入しました。インターフェースの代わりにベースクラスを継承し、単一のメソッドをオーバーライドします。これにより、よりクリーンで非同期対応のエントリーポイントが得られます。 + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### `ResourceHandler` を選ぶ理由 + +- **Async support** – `HandleResourceAsync` メソッドにより、スレッドをブロックせずに I/O を実行できます。 +- **Built‑in error handling** – ベースクラスが例外を捕捉し、フレームワーク固有のエラーコードに変換します。 +- **Future‑proof** – 新しいリリースでは、ハンドラーパターンでのみ機能するフック(例:ロギング、テレメトリ)が追加されます。 + +### エッジケースの処理 + +1. **Disposal** – フレームワークは完了後にストリームを破棄しますが、`FileStream` のような別の disposable をラップする場合は、メソッド内で `using` ブロックを実装し、`Dispose` を転送するラッパーを返すべきです。 +2. **Large payloads** – 100 MB 超のペイロードが予想される場合、`MemoryStream` を一時ファイルを指す `FileStream` に置き換えます。例: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – ベースクラスが DI からサービスを取得する場合、モック `IServiceProvider` を注入してハンドラをユニットテストします。`HandleResource` が書き込み・読み取り可能なストリームを返すことを検証してください。 + +--- + +## How to create stream – クイックチートシート + +| シナリオ | 推奨 API | サンプルコード | +|----------|----------------|-------------| +| シンプルなインメモリデータ | `MemoryStream` | `new MemoryStream()` | +| 大きな一時ファイル | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| ネットワークベースのソース | `NetworkStream` | `new NetworkStream(socket)` | +| カスタムバッファリング | Derive from `Stream` | See [Microsoft docs] for custom stream implementation | + +> **Note:** ストリームを事前に埋める場合は、返す前に必ず `stream.Position = 0` を設定してください。そうしないと、下流のリーダーはストリームが空だと判断します。 + +--- + +## 画像イラスト + +![create memory stream c# プロセスを示す図](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* create memory stream c# プロセスを示す図 + +--- + +## 完全な実行可能サンプル + +以下は、レガシーとモダンの両アプローチを示す最小限のコンソールアプリです。新しい .NET 6 コンソールプロジェクトにコピー&ペーストしてそのまま実行できます。 + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**期待される出力** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +このプログラムは、**how to create stream** の 3 つの方法、古い `IOutputStorage`、新しい同期 `HandleResource`、非同期 `HandleResourceAsync` を示します。3 つすべてが `MemoryStream` を返すため、対象バージョンに関係なくカスタムストリーム作成が機能することが証明されます。 + +--- + +## よくある質問 (FAQ) + +**Q: 取得したストリームに対して `Dispose` を呼び出す必要がありますか?** +A: フレームワーク(または呼び出し側のコード)が破棄を担当します。返したストリーム内で別の disposable をラップしている場合は、`Dispose` 呼び出しが伝搬するようにしてください。 + +**Q: 読み取り専用ストリームを返すことはできますか?** +A: はい、可能ですが、契約上は通常書き込み可能なストリームが期待されます。読み取りのみが必要な場合は `CanWrite => false` を実装し、制限をドキュメントに記載してください。 + +**Q: データが利用可能な RAM より大きい場合はどうすればよいですか?** +A: 一時ファイルをバックエンドとする `FileStream` に切り替えるか、ディスクにチャンクで書き込むカスタムバッファードストリームを実装してください。 + +**Q: 2 つのアプローチ間でパフォーマンスの違いはありますか?** +A: モダンな `ResourceHandler` は追加のベースクラスロジックによりわずかなオーバーヘッドが発生しますが、非同期バージョンは高い同時実行時にスループットを大幅に向上させる可能性があります。 + +--- + +## まとめ + +ここまでで、実際の現場で遭遇する可能性のあるすべての観点から **create memory stream c#** をカバーしました。レガシーな `IOutputStorage` パターンと新しい `ResourceHandler` クラスの両方を使った **how to create stream** の方法が分かり、**how to handle resources** を責任を持って扱う実践的なヒントや、大きなファイルや非同期シナリオ向けの **custom stream creation** の拡張方法も学びました。 + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/japanese/net/generate-jpg-and-png-images/_index.md b/html/japanese/net/generate-jpg-and-png-images/_index.md index 9bab5ba54..cf9a8e42b 100644 --- a/html/japanese/net/generate-jpg-and-png-images/_index.md +++ b/html/japanese/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Aspose.HTML for .NET を .NET プロジェクトに統合するのは簡単で Aspose.HTML for .NET を使用して動的な Web ページを作成する方法を学習します。このステップ バイ ステップのチュートリアルでは、前提条件、名前空間、および HTML から画像へのレンダリングについて説明します。 ### [Aspose.HTML を使用して .NET で ImageDevice によって PNG 画像を生成する](./generate-png-images-by-imagedevice/) Aspose.HTML for .NET を使用して HTML ドキュメントを操作したり、HTML を画像に変換したりする方法を学びます。FAQ 付きのステップバイステップのチュートリアルです。 +### [DOCX を PNG/JPG に変換する際のアンチエイリアシングの有効化方法](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +DOCX 文書を PNG または JPG 画像に変換する際に、アンチエイリアシングを有効にして高品質な出力を得る手順を解説します。 ## 結論 @@ -52,4 +54,4 @@ Aspose.HTML for .NET を使用して HTML ドキュメントを操作したり {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/japanese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/japanese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..fec100c1d --- /dev/null +++ b/html/japanese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,259 @@ +--- +category: general +date: 2025-12-27 +description: DOCX を PNG または JPG に変換する際にアンチエイリアシングを有効にする方法を学びましょう。このステップバイステップガイドでは、DOCX + を PNG に変換する方法と DOCX を JPG に変換する方法もカバーしています。 +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: ja +og_description: DOCXファイルをPNGまたはJPGに変換する際にアンチエイリアシングを有効にする方法。滑らかで高品質な出力を得るための完全ガイドをご覧ください。 +og_title: DOCX を PNG/JPG に変換するときにアンチエイリアシングを有効にする方法 +tags: +- C# +- Document Rendering +- Image Processing +title: DOCX を PNG/JPG に変換する際にアンチエイリアシングを有効にする方法 +url: /ja/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# DOCX を PNG/JPG に変換する際のアンチエイリアシングの有効化方法 + +変換した DOCX 画像がギザギザではなく鮮明になるように **アンチエイリアシングを有効にする方法** を疑問に思ったことはありませんか? あなただけではありません。Word 文書を PNG や JPG に変換する際に、線やテキストのエッジがぼやけてしまう壁にぶつかる開発者は多いです。良いニュースは、C# の数行でその粗い出力をピクセル単位で完璧なグラフィックに変えることができ、サードパーティの画像エディタは不要です。 + +このチュートリアルでは、最新のレンダリングライブラリを使用して **convert docx to png** と **convert docx to jpg** の全プロセスを解説します。*how to convert docx* だけでなく、アンチエイリアシングとヒンティングが有効な *how to render docx* も学べるので、すべての曲線や文字が滑らかに見えます。グラフィックスプログラミングの経験は不要です。基本的な C# 環境と、画像に変換したい DOCX ファイルさえあれば始められます。 + +--- + +## 必要なもの + +- **.NET 6+**(クラシックランタイムが好みの場合は .NET Framework 4.6+) +- **DOCX** ファイル(デモ用に `input` フォルダーに配置) +- **Aspose.Words for .NET** NuGet パッケージ(または `Document`、`ImageRenderingOptions`、`ImageDevice` を公開する任意のライブラリ)。以下でインストールします: + +```bash +dotnet add package Aspose.Words +``` + +以上です。追加の画像処理ツールは不要です。 + +## ステップ 1: DOCX ドキュメントをロードする (how to convert docx) + +まず、ソースファイルを表す `Document` オブジェクトが必要です。これは、ライブラリが読み取り・操作できる Word ファイルのデジタル版と考えてください。 + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **なぜ重要か:** ドキュメントのロードは *how to render docx* の基礎です。ファイルを読み取れなければ、後続のステップはすべて機能しないため、ここから始めます。 + +## ステップ 2: 画像レンダリングオプションを設定する (enable antialiasing) + +ここからがマジックパートです—アンチエイリアシングとヒンティングを有効にします。アンチエイリアシングは斜め線のギザギザを滑らかにし、ヒンティングは小さなテキストの鮮明さを向上させます。 + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **プロのコツ:** 大容量ドキュメントでパフォーマンスを向上させたい場合は `UseAntialiasing` をオフにできますが、視覚的品質が顕著に低下します。 + +## ステップ 3: 出力形式を選択 – PNG または JPG (convert docx to png / convert docx to jpg) + +`ImageDevice` クラスはレンダリングされたページの出力先を決定します。`ImageSaveOptions` を切り替えることで PNG(ロスレス)または JPG(圧縮)を出力できます。以下では、1 回の実行で両方の形式を生成できるように 2 つのデバイスを作成します。 + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **なぜ両方か?** PNG はすべてのピクセルを保持するため、正確な忠実度が必要な場合(例:印刷)に最適です。一方、JPG は画像を圧縮し、ウェブサイトでの読み込みが速くなります。 + +## ステップ 4: ドキュメントページを画像としてレンダリングする (how to render docx) + +デバイスの準備ができたら、`Document` に各ページをレンダリングするよう指示します。ライブラリは自動的にすべてのページをループし、定義した命名パターンで保存します。 + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +コードを実行すると、`output` フォルダー内に `page_0.png`、`page_1.png` … と `page_0.jpg`、`page_1.jpg` のようなファイルが生成されます。各画像にはアンチエイリアシングが適用されているため、線は滑らかでテキストはクリアです。 + +## ステップ 5: 結果を検証する (expected output) + +生成された画像のいずれかを開きます。以下が確認できるはずです: + +- **滑らかな曲線** が図形やチャートに表示されます(階段状のアーティファクトなし)。 +- ヒンティングのおかげで、小さいフォントサイズでも **鮮明で読みやすいテキスト** が表示されます。 +- PNG と JPG の間で **色が一貫** しています(ただし、品質を下げると JPG に軽微な圧縮アーティファクトが現れることがあります)。 + +ぼやけが見られる場合は、`UseAntialiasing` が `true` に設定されているか、ソースの DOCX に低解像度のラスタ画像が含まれていないかを再確認してください。 + +## よくある質問とエッジケース + +### 特定のページだけが必要な場合は? + +`PageInfo` のオーバーロードを使用して、特定のページだけをレンダリングできます: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### 高解像度出力のために DPI(ドットパーインチ)を変更できますか? + +もちろんです。`ImageRenderingOptions` の `Resolution` プロパティを調整します: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +DPI が高いほどファイルは大きくなりますが、アンチエイリアシング効果がさらに顕著になります。 + +### 大きな DOCX ファイルでメモリ不足にならないようにするには? + +ページを1つずつレンダリングし、各イテレーション後にデバイスを破棄します: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### BMP や TIFF など他の形式に変換できますか? + +はい。`SaveFormat.Png` や `SaveFormat.Jpeg` を `SaveFormat.Bmp` や `SaveFormat.Tiff` に置き換えるだけです。同じアンチエイリアシング設定が引き継がれます。 + +## 完全な動作例(コピー&ペースト可能) + +以下は、新しいコンソールプロジェクトに貼り付けられる完全なプログラムです。すべての using 文、エラーハンドリング、コメントが含まれています。 + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **結果:** コンパイル(`dotnet run`)後、`output` ディレクトリに PNG と JPG のファイルが一連で生成され、すべてにアンチエイリアシングが適用されています。 + +## 結論 + +私たちは **how to enable antialiasing** を **DOCX を PNG または JPG に変換** する際にカバーし、正確な手順として **convert docx to png**、**convert docx to jpg** を実行し、さらにカスタム **how to render docx** についても触れました。 + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/korean/net/advanced-features/_index.md b/html/korean/net/advanced-features/_index.md index 190c35c0c..2e5088deb 100644 --- a/html/korean/net/advanced-features/_index.md +++ b/html/korean/net/advanced-features/_index.md @@ -42,7 +42,8 @@ Aspose.HTML for .NET으로 HTML을 PDF로 동적으로 변환합니다. 쉬운 Aspose.HTML for .NET을 사용하여 HTML을 PDF, XPS 및 이미지로 변환하는 방법을 알아보세요. 코드 예제와 FAQ가 포함된 단계별 튜토리얼. ### [Aspose.HTML을 사용하여 .NET에서 HTML 템플릿 사용](./using-html-templates/) .NET용 Aspose.HTML을 사용하여 JSON 데이터에서 HTML 문서를 동적으로 생성하는 방법을 알아보세요. .NET 애플리케이션에서 HTML 조작의 힘을 활용하세요. - +### [c# 메모리 스트림 만들기 – 맞춤 스트림 생성 가이드](./create-memory-stream-c-custom-stream-creation-guide/) +Aspose.HTML을 사용하여 .NET에서 메모리 스트림을 직접 생성하고 활용하는 방법을 단계별로 안내합니다. ## 결론 @@ -52,4 +53,4 @@ Aspose.HTML for .NET은 .NET 애플리케이션에서 HTML 문서를 작업할 {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/korean/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/korean/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..7ac7131b9 --- /dev/null +++ b/html/korean/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,290 @@ +--- +category: general +date: 2025-12-27 +description: 단계별 가이드를 통해 C#에서 메모리 스트림을 빠르게 생성하세요. 스트림 생성 방법, 리소스 관리, .NET에서 사용자 정의 + 스트림 구현을 배워보세요. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: ko +og_description: 몇 초 만에 C# 메모리 스트림 만들기. 이 튜토리얼에서는 스트림을 생성하고, 리소스를 관리하며, 최신 .NET API를 + 사용하여 사용자 정의 스트림 생성을 구축하는 방법을 보여줍니다. +og_title: C# 메모리 스트림 만들기 – 완전 맞춤 스트림 가이드 +tags: +- stream +- csharp +- .net +- resource-handling +title: 메모리 스트림 생성 C# – 맞춤 스트림 생성 가이드 +url: /ko/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Create memory stream c# – 사용자 지정 스트림 생성 가이드 + +Ever needed to **create memory stream c#** but weren't sure which API to pick? You're not the only one. In many legacy projects you’ll find `IOutputStorage`, while newer codebases prefer `ResourceHandler`. Either way, the goal is the same: produce a `Stream` that your framework can consume. + +**create memory stream c#**가 필요했지만 어떤 API를 선택해야 할지 몰랐던 적이 있나요? 당신만 그런 것이 아닙니다. 많은 레거시 프로젝트에서는 `IOutputStorage`를 찾을 수 있고, 최신 코드베이스에서는 `ResourceHandler`를 선호합니다. 어느 쪽이든 목표는 동일합니다: 프레임워크가 사용할 수 있는 `Stream`을 생성하는 것입니다. + +In this tutorial you’ll learn **how to create stream** objects, **how to handle resources** safely, and master **custom stream creation** for both pre‑24.2 and 24.2+ versions of the library. By the end you’ll have a working example you can drop into any .NET solution—no mystery references, just pure C#. + +이 튜토리얼에서는 **how to create stream** 객체를 만드는 방법, **how to handle resources**를 안전하게 다루는 방법, 그리고 라이브러리의 pre‑24.2와 24.2+ 버전 모두에 대한 **custom stream creation**을 마스터하게 됩니다. 끝까지 하면 .NET 솔루션에 바로 넣어 사용할 수 있는 작동 예제를 얻게 됩니다—불명확한 참조 없이 순수 C#만 사용합니다. + +## 얻을 수 있는 내용 + +- 레거시 `IOutputStorage` 패턴과 최신 `ResourceHandler` 접근 방식의 명확한 비교. +- .NET 6+ (또는 필요에 따라 이전 버전)에서 컴파일되는 완전한 복사‑붙여넣기 가능한 코드. +- 스트림 해제, 대용량 페이로드 처리, 커스텀 스트림 테스트와 같은 엣지 케이스에 대한 팁. + +> **Pro tip:** .NET 8을 목표로 한다면, 최신 `ResourceHandler`는 내장된 async 지원을 제공하여 고처리량 시나리오에서 밀리초 단위의 성능 향상을 얻을 수 있습니다. + +--- + +## Create memory stream c# – 레거시 접근 방식 (pre‑24.2) + +When you’re stuck on an older version of the library, the contract you have to satisfy is `IOutputStorage`. The interface only asks for a method that returns a `Stream` for a given resource name. + +라이브러리의 오래된 버전에 얽매여 있다면, 충족해야 할 계약은 `IOutputStorage`입니다. 이 인터페이스는 주어진 리소스 이름에 대해 `Stream`을 반환하는 메서드만 요구합니다. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### 왜 이것이 작동하는가 + +- **Interface contract** – 프레임워크는 출력이 필요할 때마다 `CreateStream`을 호출합니다. +- **Flexibility** – `Stream`을 반환하기 때문에, 이후에 `MemoryStream`을 `FileStream`이나 커스텀 버퍼링 스트림으로 교체해도 다른 코드를 수정할 필요가 없습니다. +- **Resource safety** – 반환된 스트림의 해제는 호출자가 담당하므로 메서드 내부에서 `Dispose`를 호출하지 않습니다. + +### 흔히 발생하는 실수 + +| 문제 | 발생 현상 | 해결 방법 | +|------|----------|----------| +| 닫힌 스트림 반환 | 소비자는 쓰기 시 `ObjectDisposedException`을 받게 됩니다. | 스트림을 전달할 때 **열려 있는**지 확인합니다. | +| `Position = 0` 설정을 잊음 | 나중에 읽을 때 데이터가 비어 있는 것처럼 보입니다. | 미리 데이터를 채운 경우 반환하기 전에 `stream.Seek(0, SeekOrigin.Begin)`을 호출합니다. | +| 대용량 파일에 큰 `MemoryStream` 사용 | 메모리 부족으로 충돌합니다. | 임시 `FileStream`이나 커스텀 버퍼링 스트림으로 전환합니다. | + +--- + +## Create memory stream c# – 최신 접근 방식 (24.2+) + +Starting with version 24.2 the library introduced `ResourceHandler`. Instead of an interface you now inherit from a base class and override a single method. This gives you a cleaner, async‑friendly entry point. + +버전 24.2부터 라이브러리는 `ResourceHandler`를 도입했습니다. 인터페이스 대신 이제 기본 클래스를 상속하고 단일 메서드를 오버라이드합니다. 이를 통해 더 깔끔하고 async 친화적인 진입점을 얻을 수 있습니다. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### `ResourceHandler`를 선호하는 이유 + +- **Async support** – `HandleResourceAsync` 메서드를 사용하면 스레드를 차단하지 않고 I/O를 수행할 수 있습니다. +- **Built‑in error handling** – 기본 클래스가 예외를 잡아 프레임워크 전용 오류 코드로 변환합니다. +- **Future‑proof** – 최신 릴리스에서는 로깅, 텔레메트리와 같은 훅을 추가했으며, 이는 핸들러 패턴에서만 작동합니다. + +### 엣지 케이스 처리 + +1. **Disposal** – 프레임워크는 작업이 끝난 후 스트림을 해제하지만, `FileStream`과 같이 다른 disposable을 래핑한다면 메서드 내부에 `using` 블록을 구현하고 `Dispose` 호출이 전달되도록 하는 래퍼를 반환해야 합니다. +2. **Large payloads** – 100 MB 이상의 페이로드가 예상된다면 `MemoryStream`을 임시 파일을 가리키는 `FileStream`으로 교체합니다. 예시: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – 기본 클래스가 DI에서 서비스를 가져온다면, 모의 `IServiceProvider`를 주입하여 핸들러를 단위 테스트합니다. `HandleResource`가 쓰기 및 읽기가 가능한 스트림을 반환하는지 확인합니다. + +--- + +## 스트림 생성 방법 – 빠른 요약표 + +| 시나리오 | 추천 API | 샘플 코드 | +|----------|----------|-----------| +| 간단한 인‑메모리 데이터 | `MemoryStream` | `new MemoryStream()` | +| 대용량 임시 파일 | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| 네트워크 기반 소스 | `NetworkStream` | `new NetworkStream(socket)` | +| 커스텀 버퍼링 | Derive from `Stream` | 커스텀 스트림 구현에 대해서는 [Microsoft docs]를 참고하세요 | + +> **Note:** 스트림을 미리 채운 경우 반환하기 전에 항상 `stream.Position = 0`을 설정하세요; 그렇지 않으면 하위 리더가 스트림이 비어 있다고 판단합니다. + +--- + +## 이미지 일러스트레이션 + +![Create memory stream c# 프로세스를 보여주는 다이어그램](https://example.com/images/create-memory-stream-diagram.png) + +*대체 텍스트:* Create memory stream c# 프로세스를 보여주는 다이어그램 + +--- + +## 전체 실행 가능한 예제 + +Below is a minimal console app that demonstrates both the legacy and modern approaches. You can copy‑paste it into a new .NET 6 console project and run it as‑is. + +아래는 레거시와 최신 접근 방식을 모두 보여주는 최소 콘솔 앱 예제입니다. 이를 복사‑붙여넣기하여 새로운 .NET 6 콘솔 프로젝트에 넣고 그대로 실행할 수 있습니다. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**예상 출력** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +The program shows three ways to **how to create stream**: the old `IOutputStorage`, the new synchronous `HandleResource`, and the asynchronous `HandleResourceAsync`. All three return a `MemoryStream`, proving that custom stream creation works no matter which version you target. + +이 프로그램은 **how to create stream**을 구현하는 세 가지 방법을 보여줍니다: 기존 `IOutputStorage`, 새로운 동기 `HandleResource`, 그리고 비동기 `HandleResourceAsync`. 세 경우 모두 `MemoryStream`을 반환하므로, 대상 버전에 관계없이 커스텀 스트림 생성이 작동함을 증명합니다. + +--- + +## 자주 묻는 질문 (FAQ) + +**Q: 반환받은 스트림에 `Dispose`를 호출해야 하나요?** +A: 프레임워크(또는 호출 코드)가 해제를 담당합니다. 반환된 스트림 내부에 다른 disposable을 래핑했다면 `Dispose` 호출이 전달되도록 해야 합니다. + +**Q: 읽기 전용 스트림을 반환할 수 있나요?** +A: 가능합니다만, 계약상 보통 쓰기 가능한 스트림을 기대합니다. 읽기만 필요하다면 `CanWrite => false`를 구현하고 제한 사항을 문서화하세요. + +**Q: 데이터가 사용 가능한 RAM보다 크면 어떻게 해야 하나요?** +A: 임시 파일을 백업으로 하는 `FileStream`으로 전환하거나, 디스크에 청크 단위로 쓰는 커스텀 버퍼링 스트림을 구현하세요. + +**Q: 두 접근 방식 간에 성능 차이가 있나요?** +A: 최신 `ResourceHandler`는 추가 베이스 클래스 로직으로 인해 약간의 오버헤드가 있지만, async 버전은 높은 동시성 상황에서 처리량을 크게 향상시킬 수 있습니다. + +--- + +## 마무리 + +우리는 이제까지 실제 환경에서 마주칠 수 있는 모든 관점에서 **create memory stream c#**를 다루었습니다. 레거시 `IOutputStorage` 패턴과 최신 `ResourceHandler` 클래스를 사용한 **how to create stream** 방법을 알게 되었으며, **how to handle resources**를 책임감 있게 처리하고 대용량 파일이나 async 시나리오에 대한 **custom stream creation**을 확장하는 실용적인 팁도 확인했습니다. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/korean/net/generate-jpg-and-png-images/_index.md b/html/korean/net/generate-jpg-and-png-images/_index.md index 1c3413cc6..05396e4ac 100644 --- a/html/korean/net/generate-jpg-and-png-images/_index.md +++ b/html/korean/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Aspose.HTML for .NET을 .NET 프로젝트에 통합하는 것은 번거롭지 .NET용 Aspose.HTML을 사용하여 동적 웹 페이지를 만드는 방법을 알아보세요. 이 단계별 튜토리얼은 필수 구성 요소, 네임스페이스, HTML을 이미지로 렌더링하는 방법을 다룹니다. ### [Aspose.HTML을 사용하여 .NET에서 ImageDevice로 PNG 이미지 생성](./generate-png-images-by-imagedevice/) .NET용 Aspose.HTML을 사용하여 HTML 문서를 조작하고, HTML을 이미지로 변환하는 등의 방법을 알아보세요. FAQ가 포함된 단계별 튜토리얼. +### [DOCX를 PNG/JPG로 변환할 때 안티앨리어싱 활성화 방법](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +DOCX 문서를 PNG 또는 JPG 이미지로 변환할 때 안티앨리어싱을 적용하는 방법을 단계별로 안내합니다. ## 결론 @@ -52,4 +54,4 @@ Aspose.HTML for .NET을 .NET 프로젝트에 통합하는 것은 번거롭지 {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/korean/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/korean/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..529903302 --- /dev/null +++ b/html/korean/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,276 @@ +--- +category: general +date: 2025-12-27 +description: DOCX를 PNG 또는 JPG로 변환할 때 안티앨리어싱을 활성화하는 방법을 배워보세요. 이 단계별 가이드는 DOCX를 PNG로 + 변환하고 DOCX를 JPG로 변환하는 방법도 다룹니다. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: ko +og_description: DOCX 파일을 PNG 또는 JPG로 변환할 때 안티앨리어싱을 활성화하는 방법. 부드럽고 고품질의 출력을 위한 완전 가이드를 + 따라보세요. +og_title: DOCX를 PNG/JPG로 변환할 때 안티앨리어싱을 활성화하는 방법 +tags: +- C# +- Document Rendering +- Image Processing +title: DOCX를 PNG/JPG로 변환할 때 안티앨리어싱을 활성화하는 방법 +url: /ko/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# DOCX를 PNG/JPG로 변환할 때 안티앨리어싱을 활성화하는 방법 + +**안티앨리어싱을 활성화**하면 변환된 DOCX 이미지가 거친 대신 선명하게 보이게 할 수 있다는 생각을 해보셨나요? 여러분만 그런 것이 아닙니다. 많은 개발자들이 워드 문서를 PNG 또는 JPG로 변환해야 할 때 선과 텍스트 가장자리가 흐릿해지는 문제에 부딪히곤 합니다. 좋은 소식은? 몇 줄의 C# 코드만으로 거친 출력을 픽셀‑완벽 그래픽으로 바꿀 수 있다는 것입니다—타사 이미지 편집기가 필요 없습니다. + +이 튜토리얼에서는 최신 렌더링 라이브러리를 사용해 **convert docx to png**와 **convert docx to jpg** 전체 과정을 단계별로 살펴봅니다. *DOCX를 변환하는 방법*뿐만 아니라 안티앨리어싱과 힌팅이 활성화된 *DOCX를 렌더링하는 방법*도 배울 수 있습니다. 그래픽 프로그래밍 경험이 없어도 괜찮습니다; 기본적인 C# 환경과 이미지로 만들고 싶은 DOCX 파일만 있으면 됩니다. + +--- + +## 준비물 + +- **.NET 6+** (또는 클래식 런타임을 선호한다면 .NET Framework 4.6+) +- 렌더링하려는 **DOCX** 파일 (`input` 폴더에 넣어두세요) +- **Aspose.Words for .NET** NuGet 패키지 (또는 `Document`, `ImageRenderingOptions`, `ImageDevice`를 제공하는 라이브러리). 다음 명령으로 설치합니다: + +```bash +dotnet add package Aspose.Words +``` + +그게 전부—추가 이미지 처리 도구는 필요 없습니다. + +--- + +## Step 1: DOCX 문서 로드 (how to convert docx) + +먼저 소스 파일을 나타내는 `Document` 객체가 필요합니다. 이는 라이브러리가 읽고 조작할 수 있는 워드 파일의 디지털 버전이라고 생각하면 됩니다. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **왜 중요한가:** 문서를 로드하는 것이 *how to render docx*의 기반이 됩니다. 파일을 읽을 수 없으면 이후 단계가 모두 무용지물이므로 여기서 시작합니다. + +--- + +## Step 2: 이미지 렌더링 옵션 설정 (enable antialiasing) + +이제 마법의 단계—안티앨리어싱과 힌팅을 켭니다. 안티앨리어싱은 대각선 선에서 보이는 거친 가장자리를 부드럽게 만들고, 힌팅은 작은 텍스트의 선명도를 높입니다. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **프로 팁:** 대용량 문서에서 성능을 높이고 싶다면 `UseAntialiasing`을 끌 수 있지만, 시각적 품질이 눈에 띄게 떨어집니다. + +--- + +## Step 3: 출력 형식 선택 – PNG 또는 JPG (convert docx to png / convert docx to jpg) + +`ImageDevice` 클래스는 렌더링된 페이지가 어디에 저장될지를 결정합니다. `ImageSaveOptions`를 교체하면 PNG(무손실) 또는 JPG(압축) 중 하나를 선택할 수 있습니다. 아래 예시에서는 두 개의 디바이스를 만들어 한 번에 두 형식을 모두 생성합니다. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **왜 두 가지를?** PNG는 모든 픽셀을 보존하므로 정확한 충실도가 필요할 때(예: 인쇄) 이상적입니다. 반면 JPG는 이미지를 압축해 웹에서 로드 속도가 빨라집니다. + +--- + +## Step 4: 문서 페이지를 이미지로 렌더링 (how to render docx) + +디바이스가 준비되었으니 `Document`에 각 페이지를 렌더링하도록 지시합니다. 라이브러리는 자동으로 모든 페이지를 순회하며 정의한 이름 규칙대로 저장합니다. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +코드를 실행하면 `output` 폴더 안에 `page_0.png`, `page_1.png`, … 및 `page_0.jpg`, `page_1.jpg`와 같은 파일들이 생성됩니다. 각 이미지에는 안티앨리어싱이 적용돼 선이 부드럽고 텍스트가 선명합니다. + +--- + +## Step 5: 결과 확인 (expected output) + +생성된 이미지 중 하나를 열어보세요. 다음과 같이 표시됩니다: + +- **곡선이 부드럽게** 표시된 도형 및 차트(계단 현상 없음). +- **작은 폰트에서도 선명하고 읽기 쉬운 텍스트**, 힌팅 덕분에. +- **PNG와 JPG 간 색상 일관성**(단, JPG는 품질을 낮추면 약간의 압축 아티팩트가 나타날 수 있음). + +이미지가 흐릿하게 보이면 `UseAntialiasing`이 `true`로 설정됐는지, 그리고 원본 DOCX에 저해상도 래스터 이미지가 포함돼 있지는 않은지 다시 확인하세요. + +--- + +## Common Questions & Edge Cases + +### 단일 페이지만 필요할 때는? + +`PageInfo` 오버로드를 사용해 특정 페이지만 렌더링할 수 있습니다: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### 더 높은 해상도를 위해 DPI를 변경하고 싶다면? + +물론 가능합니다. `ImageRenderingOptions`의 `Resolution` 속성을 조정하세요: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +DPI를 높이면 파일 크기가 커지지만 안티앨리어싱 효과가 더욱 뚜렷해집니다. + +### 메모리 부족 없이 큰 DOCX 파일을 처리하려면? + +페이지를 하나씩 렌더링하고 각 반복 후 디바이스를 해제하세요: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### BMP나 TIFF 같은 다른 포맷으로 변환할 수 있나요? + +가능합니다—`SaveFormat.Png` 또는 `SaveFormat.Jpeg` 대신 `SaveFormat.Bmp` 혹은 `SaveFormat.Tiff`를 사용하면 됩니다. 동일한 안티앨리어싱 설정이 적용됩니다. + +--- + +## Full Working Example (Copy‑Paste Ready) + +아래는 새 콘솔 프로젝트에 바로 넣어 실행할 수 있는 전체 프로그램입니다. 모든 `using` 구문, 오류 처리, 주석이 포함되어 있습니다. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **결과:** `dotnet run`으로 컴파일한 뒤 `output` 디렉터리 안에 안티앨리어싱이 적용된 PNG와 JPG 파일들이 생성됩니다. + +--- + +## Conclusion + +**DOCX를 PNG 또는 JPG로 변환할 때 안티앨리어싱을 활성화하는 방법**을 살펴보았습니다. 이를 통해 **convert docx to png**, **convert docx to jpg**는 물론 **how to render docx**까지 완벽히 수행할 수 있습니다. + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/polish/net/advanced-features/_index.md b/html/polish/net/advanced-features/_index.md index d3ffd40e0..b4c4a5d5c 100644 --- a/html/polish/net/advanced-features/_index.md +++ b/html/polish/net/advanced-features/_index.md @@ -32,6 +32,8 @@ Dowiedz się, jak pracować z dokumentami HTML w .NET, używając Aspose.HTML do Dowiedz się, jak używać Aspose.HTML dla .NET do wydajnego manipulowania dokumentami HTML. Samouczek krok po kroku dla programistów. ### [Dostawca strumienia pamięci w .NET z Aspose.HTML](./memory-stream-provider/) Dowiedz się, jak tworzyć oszałamiające dokumenty HTML w .NET za pomocą Aspose.HTML. Postępuj zgodnie z naszym samouczkiem krok po kroku i odkryj moc manipulacji HTML. +### [Utwórz strumień pamięci w C# – Przewodnik tworzenia niestandardowego strumienia](./create-memory-stream-c-custom-stream-creation-guide/) +Dowiedz się, jak tworzyć strumień pamięci w C# przy użyciu Aspose.HTML, aby efektywnie manipulować dokumentami HTML. ### [Web Scraping w .NET z Aspose.HTML](./web-scraping/) Naucz się manipulować dokumentami HTML w .NET za pomocą Aspose.HTML. Nawiguj, filtruj, wysyłaj zapytania i wybieraj elementy efektywnie, aby usprawnić tworzenie stron internetowych. ### [Użyj rozszerzonej właściwości zawartości w .NET z Aspose.HTML](./use-extended-content-property/) @@ -52,4 +54,4 @@ Aspose.HTML for .NET otwiera drzwi do świata możliwości, jeśli chodzi o prac {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/polish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/polish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..7f3a67d32 --- /dev/null +++ b/html/polish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,280 @@ +--- +category: general +date: 2025-12-27 +description: Szybko utwórz strumień pamięci w C# dzięki przewodnikowi krok po kroku. + Dowiedz się, jak tworzyć strumień, zarządzać zasobami i implementować własne tworzenie + strumieni w .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: pl +og_description: Utwórz pamięciowy strumień w C# w kilka sekund. Ten samouczek pokazuje, + jak stworzyć strumień, zarządzać zasobami i budować własne tworzenie strumieni przy + użyciu nowoczesnych interfejsów .NET. +og_title: Tworzenie strumienia pamięci w C# – Kompletny przewodnik po własnych strumieniach +tags: +- stream +- csharp +- .net +- resource-handling +title: Tworzenie strumienia pamięci w C# – Przewodnik tworzenia własnych strumieni +url: /pl/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Utworzenie strumienia pamięci c# – Przewodnik tworzenia własnych strumieni + +Czy kiedykolwiek potrzebowałeś **create memory stream c#**, ale nie byłeś pewien, którego API wybrać? Nie jesteś jedyny. W wielu starszych projektach znajdziesz `IOutputStorage`, podczas gdy nowsze bazy kodu preferują `ResourceHandler`. W każdym razie cel jest ten sam: dostarczyć `Stream`, który może wykorzystać Twój framework. + +W tym samouczku nauczysz się **how to create stream** obiektów, **how to handle resources** bezpiecznie, oraz opanujesz **custom stream creation** zarówno dla wersji przed‑24.2, jak i 24.2+ biblioteki. Po zakończeniu będziesz mieć działający przykład, który możesz wstawić do dowolnego rozwiązania .NET — bez tajemniczych odwołań, po prostu czysty C#. + +## Co wyniesiesz z tego tutorialu + +- Jasne porównanie starszego wzorca `IOutputStorage` vs. nowoczesnego podejścia `ResourceHandler`. +- Kompletny kod gotowy do kopiowania i wklejania, kompilujący się z .NET 6+ (lub starszym, jeśli potrzebujesz). +- Wskazówki dotyczące przypadków brzegowych, takich jak zwalnianie strumieni, obsługa dużych ładunków i testowanie własnego strumienia. + +> **Pro tip:** Jeśli celujesz w .NET 8, nowszy `ResourceHandler` zapewnia wbudowane wsparcie async, co może zaoszczędzić milisekundy w scenariuszach o wysokiej przepustowości. + +--- + +## Utworzenie strumienia pamięci c# – Podejście legacy (przed‑24.2) + +Gdy utkniesz na starszej wersji biblioteki, kontrakt, który musisz spełnić, to `IOutputStorage`. Interfejs wymaga jedynie metody zwracającej `Stream` dla podanej nazwy zasobu. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Dlaczego to działa + +- **Interface contract** – Framework wywoła `CreateStream`, gdy będzie potrzebował zapisać wyjście. +- **Flexibility** – Ponieważ zwracasz `Stream`, możesz później zamienić `MemoryStream` na `FileStream` lub nawet własny buforowany strumień, nie modyfikując reszty kodu. +- **Resource safety** – Wywołujący jest odpowiedzialny za zwolnienie zwróconego strumienia, dlatego nie wywołujemy `Dispose` wewnątrz metody. + +### Typowe pułapki + +| Problem | Co się dzieje | Rozwiązanie | +|---------|---------------|-------------| +| Zwracanie zamkniętego strumienia | Konsumenci otrzymają `ObjectDisposedException` przy zapisie. | Upewnij się, że strumień jest **otwarty** przy przekazywaniu. | +| Zapomnienie o ustawieniu `Position = 0` po zapisie | Dane wydają się puste przy późniejszym odczycie. | Wywołaj `stream.Seek(0, SeekOrigin.Begin)` przed zwróceniem, jeśli wstępnie wypełniasz strumień. | +| Używanie dużego `MemoryStream` dla dużych plików | Awaria z powodu braku pamięci. | Przejdź na tymczasowy `FileStream` lub własny buforowany strumień. | + +--- + +## Utworzenie strumienia pamięci c# – Nowoczesne podejście (24.2+) + +Od wersji 24.2 biblioteka wprowadziła `ResourceHandler`. Zamiast interfejsu, teraz dziedziczysz po klasie bazowej i nadpisujesz jedną metodę. Daje to czystszy, przyjazny async punkt wejścia. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Dlaczego warto wybrać `ResourceHandler` + +- **Async support** – Metoda `HandleResourceAsync` pozwala wykonywać I/O bez blokowania wątków. +- **Built‑in error handling** – Klasa bazowa przechwytuje wyjątki i konwertuje je na kody błędów specyficzne dla frameworka. +- **Future‑proof** – Nowsze wydania dodają haki (np. logowanie, telemetry), które działają tylko z wzorcem handlera. + +### Obsługa przypadków brzegowych + +1. **Disposal** – Framework zwalnia strumień po zakończeniu, ale jeśli opakowujesz inny obiekt disposable (np. `FileStream`), powinieneś zaimplementować blok `using` wewnątrz metody i zwrócić wrapper, który przekazuje `Dispose`. +2. **Large payloads** – Jeśli spodziewasz się ładunków > 100 MB, zamień `MemoryStream` na `FileStream` wskazujący na plik tymczasowy. Przykład: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – Przetestuj jednostkowo swój handler, wstrzykując mock `IServiceProvider`, jeśli klasa bazowa pobiera usługi z DI. Zweryfikuj, że `HandleResource` zwraca strumień, do którego można zapisywać i odczytywać. + +--- + +## Jak utworzyć strumień – Szybka karta pomocy + +| Scenariusz | Zalecane API | Przykładowy kod | +|------------|--------------|-----------------| +| Proste dane w pamięci | `MemoryStream` | `new MemoryStream()` | +| Duże pliki tymczasowe | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Źródło sieciowe | `NetworkStream` | `new NetworkStream(socket)` | +| Własne buforowanie | Derive from `Stream` | See [dokumentacja Microsoft] for custom stream implementation | + +> **Uwaga:** Zawsze ustaw `stream.Position = 0` przed zwróceniem, jeśli wstępnie wypełniasz strumień; w przeciwnym razie czytniki dalszego przetwarzania uznają strumień za pusty. + +--- + +## Ilustracja + +![Diagram pokazujący proces tworzenia strumienia pamięci c#](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* diagram pokazujący proces tworzenia strumienia pamięci c# + +--- + +## Pełny działający przykład + +Poniżej znajduje się minimalna aplikacja konsolowa, która demonstruje zarówno podejście legacy, jak i nowoczesne. Możesz skopiować i wkleić ją do nowego projektu konsolowego .NET 6 i uruchomić bez zmian. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Oczekiwany wynik** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +Program pokazuje trzy sposoby **how to create stream**: stary `IOutputStorage`, nowy synchroniczny `HandleResource` oraz asynchroniczny `HandleResourceAsync`. Wszystkie trzy zwracają `MemoryStream`, co dowodzi, że własne tworzenie strumieni działa niezależnie od wersji, którą celujesz. + +--- + +## Najczęściej zadawane pytania (FAQ) + +**Q: Czy muszę wywołać `Dispose` na strumieniu, który otrzymuję?** +A: Framework (lub Twój kod wywołujący) jest odpowiedzialny za zwolnienie. Jeśli opakowujesz inny obiekt disposable w zwróconym strumieniu, upewnij się, że propaguje wywołanie `Dispose`. + +**Q: Czy mogę zwrócić strumień tylko do odczytu?** +A: Tak, ale kontrakt zazwyczaj oczekuje strumienia zapisywalnego. Jeśli potrzebujesz tylko odczytu, zaimplementuj `CanWrite => false` i udokumentuj ograniczenie. + +**Q: Co zrobić, jeśli moje dane są większe niż dostępna pamięć RAM?** +A: Przejdź na `FileStream` oparty na pliku tymczasowym lub zaimplementuj własny buforowany strumień zapisujący na dysk w fragmentach. + +**Q: Czy istnieje różnica wydajnościowa między tymi dwoma podejściami?** +A: Nowoczesny `ResourceHandler` wprowadza niewielki narzut związany z dodatkową logiką klasy bazowej, ale wersja async może znacząco zwiększyć przepustowość przy wysokiej współbieżności. + +--- + +## Podsumowanie + +Właśnie omówiliśmy **create memory stream c#** ze wszystkich perspektyw, które możesz napotkać w praktyce. Teraz wiesz **how to create stream** używając zarówno starszego wzorca `IOutputStorage`, jak i nowszej klasy `ResourceHandler`, a także zobaczyłeś praktyczne wskazówki dotyczące **how to handle resources** w odpowiedzialny sposób oraz rozszerzenia wzorca o **custom stream creation** dla dużych plików lub scenariuszy async. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/polish/net/generate-jpg-and-png-images/_index.md b/html/polish/net/generate-jpg-and-png-images/_index.md index c3973772b..422457b58 100644 --- a/html/polish/net/generate-jpg-and-png-images/_index.md +++ b/html/polish/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Zintegrowanie Aspose.HTML dla .NET z projektami .NET jest bezproblemowe. Bibliot Dowiedz się, jak tworzyć dynamiczne strony internetowe za pomocą Aspose.HTML dla .NET. Ten samouczek krok po kroku obejmuje wymagania wstępne, przestrzenie nazw i renderowanie HTML do obrazów. ### [Generuj obrazy PNG przez ImageDevice w .NET z Aspose.HTML](./generate-png-images-by-imagedevice/) Naucz się używać Aspose.HTML dla .NET do manipulowania dokumentami HTML, konwertowania HTML na obrazy i nie tylko. Samouczek krok po kroku z FAQ. +### [Jak włączyć antyaliasing przy konwertowaniu DOCX do PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Dowiedz się, jak włączyć antyaliasing przy konwersji dokumentów DOCX do formatów PNG i JPG przy użyciu Aspose.HTML. ## Wniosek @@ -52,4 +54,4 @@ Więc po co czekać? Zacznij eksplorować świat konwersji HTML na obraz z Aspos {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/polish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/polish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..5a986fd30 --- /dev/null +++ b/html/polish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,278 @@ +--- +category: general +date: 2025-12-27 +description: Dowiedz się, jak włączyć antyaliasing podczas konwertowania plików DOCX + na PNG lub JPG. Ten przewodnik krok po kroku obejmuje również konwersję DOCX na + PNG oraz konwersję DOCX na JPG. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: pl +og_description: Jak włączyć antyaliasing podczas konwertowania plików DOCX na PNG + lub JPG. Przeczytaj ten kompletny przewodnik, aby uzyskać płynny, wysokiej jakości + wynik. +og_title: Jak włączyć antyaliasing przy konwertowaniu DOCX na PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: Jak włączyć antyaliasing przy konwertowaniu DOCX na PNG/JPG +url: /pl/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak włączyć antyaliasing przy konwertowaniu DOCX na PNG/JPG + +Zastanawiałeś się kiedyś **jak włączyć antyaliasing**, aby obrazy po konwersji DOCX wyglądały ostro zamiast ząbkowanie? Nie jesteś sam. Wielu programistów napotyka problem, gdy muszą przekształcić dokument Worda w PNG lub JPG i kończą z rozmytymi krawędziami linii i tekstu. Dobra wiadomość? Kilka linijek C# pozwoli zamienić ten szorstki wynik w grafiki o perfekcyjnej jakości pikselowej — bez potrzeby używania zewnętrznych edytorów graficznych. + +W tym tutorialu przejdziemy przez cały proces **convert docx to png** i **convert docx to jpg** przy użyciu nowoczesnej biblioteki renderującej. Nauczysz się nie tylko *jak konwertować docx*, ale także *jak renderować docx* z włączonym antyaliasingiem i hintingiem, tak aby każda krzywa i znak wyglądały płynnie. Nie wymaga to wcześniejszego doświadczenia w programowaniu grafiki; wystarczy podstawowe środowisko C# i plik DOCX, który chcesz przekształcić w obraz. + +--- + +## Co będzie potrzebne + +- **.NET 6+** (lub .NET Framework 4.6+, jeśli wolisz klasyczny runtime) +- Plik **DOCX**, który chcesz wyrenderować (umieść go w folderze o nazwie `input` dla demonstracji) +- Pakiet NuGet **Aspose.Words for .NET** (lub dowolna biblioteka udostępniająca `Document`, `ImageRenderingOptions` i `ImageDevice`). Zainstaluj go poleceniem: + +```bash +dotnet add package Aspose.Words +``` + +To wszystko — nie są potrzebne dodatkowe narzędzia do przetwarzania obrazów. + +--- + +## Krok 1: Załaduj dokument DOCX (jak konwertować docx) + +Najpierw potrzebujemy obiektu `Document`, który reprezentuje plik źródłowy. To cyfrowa wersja Twojego pliku Word, którą biblioteka może odczytać i manipulować. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Dlaczego to ważne:** Załadowanie dokumentu jest podstawą *jak renderować docx*. Jeśli plik nie zostanie odczytany, żaden z kolejnych kroków nie zadziała, więc zaczynamy właśnie tutaj. + +--- + +## Krok 2: Skonfiguruj opcje renderowania obrazu (włącz antyaliasing) + +Teraz następuje magiczna część — włączenie antyaliasingu i hintingu. Antyaliasing wygładza ząbkowane krawędzie, które normalnie widzisz na liniach ukośnych, a hinting poprawia czytelność małego tekstu. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Pro tip:** Jeśli kiedykolwiek potrzebujesz przyspieszyć przetwarzanie bardzo dużych dokumentów, możesz wyłączyć `UseAntialiasing`, ale jakość wizualna zauważalnie spadnie. + +--- + +## Krok 3: Wybierz format wyjściowy – PNG lub JPG (convert docx to png / convert docx to jpg) + +Klasa `ImageDevice` decyduje, gdzie trafiają wyrenderowane strony. Zamieniając `ImageSaveOptions`, możesz uzyskać albo PNG (bezstratny), albo JPG (skompresowany). Poniżej tworzymy dwa oddzielne urządzenia, aby w jednym uruchomieniu wygenerować oba formaty. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Dlaczego oba?** PNG zachowuje każdy piksel, co jest idealne, gdy potrzebna jest dokładna wierność (np. do druku). JPG natomiast kompresuje obraz, co przyspiesza jego ładowanie na stronie internetowej. + +--- + +## Krok 4: Renderuj strony dokumentu do obrazów (jak renderować docx) + +Mając gotowe urządzenia, instruujemy `Document`, aby wyrenderował każdą stronę. Biblioteka automatycznie przeiteruje wszystkie strony i zapisze je według zdefiniowanego wzorca nazewnictwa. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Po uruchomieniu kodu znajdziesz serię plików takich jak `page_0.png`, `page_1.png`, … oraz `page_0.jpg`, `page_1.jpg` w folderze `output`. Każdy obraz będzie miał zastosowany antyaliasing, więc linie będą gładkie, a tekst krystalicznie czysty. + +--- + +## Krok 5: Zweryfikuj wynik (oczekiwany output) + +Otwórz dowolny z wygenerowanych obrazów. Powinieneś zobaczyć: + +- **Gładkie krzywe** w kształtach i wykresach (bez artefaktów schodkowych). +- **Wyraźny, czytelny tekst** nawet przy małych rozmiarach czcionki, dzięki hintingowi. +- **Spójne kolory** między PNG a JPG (choć JPG może wykazywać lekkie artefakty kompresji przy niższej jakości). + +Jeśli zauważysz rozmycie, sprawdź, czy `UseAntialiasing` jest ustawione na `true` oraz czy źródłowy DOCX nie zawiera niskiej rozdzielczości obrazów rastrowych. + +--- + +## Często zadawane pytania i przypadki brzegowe + +### Co zrobić, jeśli potrzebuję tylko jednej strony? + +Możesz wyrenderować konkretną stronę, używając przeciążenia `PageInfo`: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Czy mogę zmienić DPI (dots per inch) dla wyższej rozdzielczości wyjścia? + +Oczywiście. Dostosuj właściwość `Resolution` w `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Wyższe DPI oznacza większe pliki, ale efekt antyaliasingu staje się jeszcze bardziej widoczny. + +### Jak obsłużyć duże pliki DOCX, aby nie wyczerpać pamięci? + +Renderuj strony pojedynczo i zwalniaj urządzenie po każdej iteracji: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### Czy można konwertować do innych formatów, takich jak BMP lub TIFF? + +Tak — wystarczy zamienić `SaveFormat.Png` lub `SaveFormat.Jpeg` na `SaveFormat.Bmp` lub `SaveFormat.Tiff`. Te same ustawienia antyaliasingu zostaną zachowane. + +--- + +## Pełny działający przykład (gotowy do kopiowania) + +Poniżej znajduje się kompletny program, który możesz wkleić do nowego projektu konsolowego. Zawiera wszystkie dyrektywy `using`, obsługę błędów i komentarze dla przejrzystości. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Rezultat:** Po skompilowaniu (`dotnet run`) zobaczysz serię plików PNG i JPG w katalogu `output`, każdy z zastosowanym antyaliasingiem. + +--- + +## Podsumowanie + +Omówiliśmy **jak włączyć antyaliasing** przy **konwertowaniu DOCX do PNG lub JPG**, przeszliśmy przez dokładne kroki **convert docx to png**, **convert docx to jpg**, a także dotknęliśmy tematu **jak renderować docx** dla własnych potrzeb. + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/portuguese/net/advanced-features/_index.md b/html/portuguese/net/advanced-features/_index.md index c8c7e41c4..49f1004a5 100644 --- a/html/portuguese/net/advanced-features/_index.md +++ b/html/portuguese/net/advanced-features/_index.md @@ -32,6 +32,8 @@ Aprenda a trabalhar com documentos HTML em .NET usando Aspose.HTML para tarefas Aprenda como usar Aspose.HTML para .NET para manipular documentos HTML de forma eficiente. Tutorial passo a passo para desenvolvedores. ### [Provedor de fluxo de memória em .NET com Aspose.HTML](./memory-stream-provider/) Aprenda a criar documentos HTML impressionantes em .NET com Aspose.HTML. Siga nosso tutorial passo a passo e desbloqueie o poder da manipulação HTML. +### [Criar fluxo de memória C# – Guia de criação de fluxo personalizado](./create-memory-stream-c-custom-stream-creation-guide/) +Aprenda a criar e usar fluxos de memória personalizados em C# com Aspose.HTML, passo a passo e exemplos práticos. ### [Web Scraping em .NET com Aspose.HTML](./web-scraping/) Aprenda a manipular documentos HTML em .NET com Aspose.HTML. Navegue, filtre, consulte e selecione elementos de forma eficaz para desenvolvimento web aprimorado. ### [Use a propriedade de conteúdo estendido no .NET com Aspose.HTML](./use-extended-content-property/) @@ -52,4 +54,4 @@ Aspose.HTML para .NET abre a porta para um mundo de possibilidades quando se tra {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/portuguese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/portuguese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..a586e972a --- /dev/null +++ b/html/portuguese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,280 @@ +--- +category: general +date: 2025-12-27 +description: Crie um MemoryStream em C# rapidamente com um guia passo a passo. Aprenda + como criar streams, gerenciar recursos e implementar a criação de streams personalizados + no .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: pt +og_description: Crie um MemoryStream em C# em segundos. Este tutorial mostra como + criar streams, gerenciar recursos e construir streams personalizados com as APIs + modernas do .NET. +og_title: Criar stream de memória em C# – Guia completo de stream personalizado +tags: +- stream +- csharp +- .net +- resource-handling +title: Criar stream de memória C# – Guia de criação de streams personalizados +url: /pt/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Criar memory stream c# – Guia de criação de stream personalizado + +Já precisou **criar memory stream c#** mas não tinha certeza de qual API escolher? Você não está sozinho. Em muitos projetos legados você encontrará `IOutputStorage`, enquanto bases de código mais recentes preferem `ResourceHandler`. De qualquer forma, o objetivo é o mesmo: produzir um `Stream` que seu framework possa consumir. + +Neste tutorial você aprenderá **como criar stream** objetos, **como manipular recursos** com segurança e dominar **a criação de stream personalizada** tanto para versões pré‑24.2 quanto 24.2+ da biblioteca. Ao final, você terá um exemplo funcional que pode ser inserido em qualquer solução .NET — sem referências misteriosas, apenas C# puro. + +## O que você levará consigo + +- Uma comparação clara do padrão legado `IOutputStorage` versus a abordagem moderna `ResourceHandler`. +- Código completo, pronto para copiar‑e‑colar, que compila contra .NET 6+ (ou versões anteriores, se precisar). +- Dicas para casos extremos, como descarte de streams, manipulação de cargas grandes e teste do seu stream personalizado. + +> **Dica profissional:** Se você está mirando .NET 8, o `ResourceHandler` mais recente oferece suporte assíncrono embutido, o que pode reduzir milissegundos em cenários de alta taxa de transferência. + +--- + +## Criar memory stream c# – Abordagem legada (pré‑24.2) + +Quando você está preso a uma versão mais antiga da biblioteca, o contrato que deve atender é `IOutputStorage`. A interface solicita apenas um método que retorne um `Stream` para um nome de recurso fornecido. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Por que isso funciona + +- **Contrato da interface** – O framework chamará `CreateStream` sempre que precisar gravar saída. +- **Flexibilidade** – Como você devolve um `Stream`, pode trocar `MemoryStream` por `FileStream` ou até mesmo por um stream bufferizado customizado mais tarde, sem tocar no restante do código. +- **Segurança de recursos** – O chamador é responsável por descartar o stream retornado, por isso não chamamos `Dispose` dentro do método. + +### Armadilhas comuns + +| Problema | O que acontece | Correção | +|----------|----------------|----------| +| Retornar um stream fechado | Os consumidores receberão `ObjectDisposedException` ao escrever. | Garanta que o stream esteja **aberto** quando for entregue. | +| Esquecer de definir `Position = 0` após escrever | Os dados parecem vazios quando lidos posteriormente. | Chame `stream.Seek(0, SeekOrigin.Begin)` antes de retornar se você pré‑popular o stream. | +| Usar um `MemoryStream` enorme para arquivos grandes | Falhas por falta de memória. | Troque por um `FileStream` temporário ou um stream bufferizado customizado. | + +--- + +## Criar memory stream c# – Abordagem moderna (24.2+) + +A partir da versão 24.2 a biblioteca introduziu `ResourceHandler`. Em vez de uma interface, agora você herda de uma classe base e sobrescreve um único método. Isso fornece um ponto de entrada mais limpo e amigável ao async. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Por que preferir `ResourceHandler` + +- **Suporte async** – O método `HandleResourceAsync` permite executar I/O sem bloquear threads. +- **Tratamento de erros embutido** – A classe base captura exceções e as converte em códigos de erro específicos do framework. +- **À prova de futuro** – Lançamentos mais recentes adicionam ganchos (por exemplo, logging, telemetria) que funcionam apenas com o padrão de handler. + +### Tratamento de casos extremos + +1. **Descarte** – O framework descarta o stream após o uso, mas se você envolver outro objeto descartável (como um `FileStream`) deve implementar um bloco `using` dentro do método e retornar um wrapper que encaminhe `Dispose`. +2. **Cargas grandes** – Se você prevê cargas > 100 MB, substitua `MemoryStream` por um `FileStream` apontando para um arquivo temporário. Exemplo: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testes** – Teste unitário do seu handler injetando um mock `IServiceProvider` caso a classe base obtenha serviços via DI. Verifique se `HandleResource` devolve um stream que pode ser escrito e lido. + +--- + +## Como criar stream – Um cheat sheet rápido + +| Cenário | API recomendada | Código de exemplo | +|----------|----------------|-------------------| +| Dados simples em memória | `MemoryStream` | `new MemoryStream()` | +| Arquivos temporários grandes | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Fonte baseada em rede | `NetworkStream` | `new NetworkStream(socket)` | +| Bufferização customizada | Derivar de `Stream` | Veja [Microsoft docs] para implementação de stream customizado | + +> **Observação:** Sempre defina `stream.Position = 0` antes de retornar se você pré‑popular o stream; caso contrário, leitores posteriores pensarão que o stream está vazio. + +--- + +## Ilustração de imagem + +![Diagram showing create memory stream c# process](https://example.com/images/create-memory-stream-diagram.png) + +*Texto alternativo:* diagrama mostrando o processo de criar memory stream c# + +--- + +## Exemplo completo executável + +A seguir, um aplicativo console mínimo que demonstra ambas as abordagens, legada e moderna. Você pode copiar‑e‑colar em um novo projeto console .NET 6 e executá‑lo tal como está. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Saída esperada** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +O programa mostra três maneiras de **como criar stream**: o antigo `IOutputStorage`, o novo `HandleResource` síncrono e o `HandleResourceAsync` assíncrono. Todos retornam um `MemoryStream`, provando que a criação de stream personalizada funciona independentemente da versão alvo. + +--- + +## Perguntas frequentes (FAQ) + +**Q: Preciso chamar `Dispose` no stream que recebo?** +A: O framework (ou seu código chamador) é responsável pelo descarte. Se você envolver outro objeto descartável dentro do stream retornado, certifique‑se de que ele propague a chamada `Dispose`. + +**Q: Posso devolver um stream somente leitura?** +A: Sim, mas o contrato geralmente espera um stream gravável. Se precisar apenas ler, implemente `CanWrite => false` e documente a limitação. + +**Q: E se meus dados forem maiores que a RAM disponível?** +A: Troque para um `FileStream` respaldado por um arquivo temporário, ou implemente um stream bufferizado customizado que escreva em disco em blocos. + +**Q: Existe diferença de desempenho entre as duas abordagens?** +A: O `ResourceHandler` moderno adiciona um pequeno overhead devido à lógica da classe base, mas a versão assíncrona pode melhorar drasticamente a taxa de transferência em alta concorrência. + +--- + +## Conclusão + +Acabamos de cobrir **criar memory stream c#** de todos os ângulos que você pode encontrar no mundo real. Agora você sabe **como criar stream** usando tanto o padrão legado `IOutputStorage` quanto a nova classe `ResourceHandler`, além de ter visto dicas práticas para **como manipular recursos** de forma responsável e estender o padrão com **criação de stream personalizada** para arquivos grandes ou cenários async. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/portuguese/net/generate-jpg-and-png-images/_index.md b/html/portuguese/net/generate-jpg-and-png-images/_index.md index e8dc5007b..89aae7922 100644 --- a/html/portuguese/net/generate-jpg-and-png-images/_index.md +++ b/html/portuguese/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Integrar o Aspose.HTML para .NET em seus projetos .NET é descomplicado. A bibli Aprenda a criar páginas web dinâmicas usando Aspose.HTML para .NET. Este tutorial passo a passo abrange pré-requisitos, namespaces e renderização de HTML para imagens. ### [Gerar imagens PNG por ImageDevice em .NET com Aspose.HTML](./generate-png-images-by-imagedevice/) Aprenda a usar Aspose.HTML para .NET para manipular documentos HTML, converter HTML em imagens e muito mais. Tutorial passo a passo com FAQs. +### [Como habilitar antialiasing ao converter DOCX para PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Aprenda a ativar antialiasing ao converter documentos DOCX em imagens PNG ou JPG usando Aspose.HTML para .NET. ## Conclusão @@ -52,4 +54,4 @@ Então, por que esperar? Comece a explorar o mundo da conversão de HTML para im {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/portuguese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/portuguese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..7ffc4a53e --- /dev/null +++ b/html/portuguese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,277 @@ +--- +category: general +date: 2025-12-27 +description: Aprenda como habilitar o antialiasing ao converter DOCX para PNG ou JPG. + Este guia passo a passo também aborda converter docx para png e converter docx para + jpg. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: pt +og_description: Como habilitar antialiasing ao converter arquivos DOCX para PNG ou + JPG. Siga este guia completo para obter resultados suaves e de alta qualidade. +og_title: Como habilitar o antialiasing ao converter DOCX para PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: Como habilitar antialiasing ao converter DOCX para PNG/JPG +url: /pt/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Como habilitar antialiasing ao converter DOCX para PNG/JPG + +Já se perguntou **como habilitar antialiasing** para que as imagens convertidas de DOCX fiquem nítidas em vez de serrilhadas? Você não está sozinho. Muitos desenvolvedores esbarram em um obstáculo quando precisam transformar um documento Word em PNG ou JPG e acabam com bordas desfocadas em linhas e textos. A boa notícia? Com algumas linhas de C# você pode transformar essa saída áspera em gráficos pixel‑perfect—sem necessidade de editores de imagem de terceiros. + +Neste tutorial vamos percorrer todo o processo de **convert docx to png** e **convert docx to jpg** usando uma biblioteca de renderização moderna. Você aprenderá não apenas *como converter docx*, mas também *como renderizar docx* com antialiasing e hinting habilitados, para que cada curva e caractere pareça suave. Não é necessário ter experiência prévia em programação gráfica; basta uma configuração básica de C# e um arquivo DOCX que você queira transformar em imagem. + +--- + +## O que você vai precisar + +- **.NET 6+** (ou .NET Framework 4.6+ se preferir o runtime clássico) +- Um arquivo **DOCX** que você queira renderizar (coloque‑o em uma pasta chamada `input` para a demonstração) +- O pacote NuGet **Aspose.Words for .NET** (ou qualquer biblioteca que exponha `Document`, `ImageRenderingOptions` e `ImageDevice`). Instale‑o com: + +```bash +dotnet add package Aspose.Words +``` + +É só isso—nenhuma ferramenta extra de processamento de imagem é necessária. + +--- + +## Etapa 1: Carregar o documento DOCX (how to convert docx) + +Primeiro precisamos de um objeto `Document` que represente o arquivo fonte. Pense nele como a versão digital do seu arquivo Word que a biblioteca pode ler e manipular. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Por que isso importa:** Carregar o documento é a base para *how to render docx*. Se o arquivo não puder ser lido, nenhuma das etapas posteriores funcionará, então começamos aqui. + +--- + +## Etapa 2: Configurar as opções de renderização de imagem (enable antialiasing) + +Agora vem a parte mágica—ativar antialiasing e hinting. O antialiasing suaviza as bordas serrilhadas que você normalmente vê em linhas diagonais, enquanto o hinting melhora a clareza de textos pequenos. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Dica profissional:** Se precisar de um ganho de desempenho em documentos muito grandes, pode desativar `UseAntialiasing`, mas a qualidade visual cairá perceptivelmente. + +--- + +## Etapa 3: Escolher o formato de saída – PNG ou JPG (convert docx to png / convert docx to jpg) + +A classe `ImageDevice` decide onde as páginas renderizadas serão gravadas. Ao trocar o `ImageSaveOptions` você pode gerar PNG (sem perdas) ou JPG (com compressão). Abaixo criamos dois dispositivos separados para que você possa gerar ambos os formatos em uma única execução. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Por que ambos?** PNG preserva cada pixel, o que é perfeito quando você precisa de fidelidade exata (por exemplo, impressão). JPG, por outro lado, comprime a imagem, tornando‑a mais rápida de carregar em um site. + +--- + +## Etapa 4: Renderizar as páginas do documento em imagens (how to render docx) + +Com os dispositivos prontos, instruímos o `Document` a renderizar cada página. A biblioteca percorrerá automaticamente todas as páginas e as salvará usando o padrão de nomenclatura que definimos. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Depois de executar o código, você encontrará uma série de arquivos como `page_0.png`, `page_1.png`, … e `page_0.jpg`, `page_1.jpg` dentro da pasta `output`. Cada imagem terá antialiasing aplicado, então linhas ficarão suaves e o texto estará cristal‑claro. + +--- + +## Etapa 5: Verificar o resultado (expected output) + +Abra qualquer uma das imagens geradas. Você deverá ver: + +- **Curvas suaves** em formas e gráficos (sem artefatos em degraus). +- **Texto nítido e legível** mesmo em tamanhos de fonte pequenos, graças ao hinting. +- **Cores consistentes** entre PNG e JPG (embora JPG possa apresentar leves artefatos de compressão se a qualidade for reduzida). + +Se notar alguma desfocagem, verifique se `UseAntialiasing` está definido como `true` e se o DOCX de origem não contém imagens raster de baixa resolução. + +--- + +## Perguntas frequentes e casos especiais + +### E se eu precisar apenas de uma única página? + +Você pode renderizar uma página específica usando a sobrecarga `PageInfo`: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Posso mudar o DPI (pontos por polegada) para saída de alta resolução? + +Com certeza. Ajuste a propriedade `Resolution` em `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Um DPI maior gera arquivos maiores, mas o efeito de antialiasing torna‑se ainda mais perceptível. + +### Como lidar com arquivos DOCX grandes sem ficar sem memória? + +Renderize as páginas uma‑por‑uma e descarte o dispositivo após cada iteração: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### É possível converter para outros formatos como BMP ou TIFF? + +Sim—basta trocar `SaveFormat.Png` ou `SaveFormat.Jpeg` por `SaveFormat.Bmp` ou `SaveFormat.Tiff`. As mesmas configurações de antialiasing são mantidas. + +--- + +## Exemplo completo (pronto para copiar e colar) + +Abaixo está o programa completo que você pode inserir em um novo projeto de console. Ele inclui todas as declarações `using`, tratamento de erros e comentários para clareza. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Resultado:** Após compilar (`dotnet run`) você verá uma série de arquivos PNG e JPG na pasta `output`, cada um com antialiasing aplicado. + +--- + +## Conclusão + +Cobrimos **como habilitar antialiasing** ao **converter DOCX para PNG ou JPG**, percorremos os passos exatos para **convert docx to png**, **convert docx to jpg**, e ainda abordamos **how to render docx** para personalizações avançadas. + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/russian/net/advanced-features/_index.md b/html/russian/net/advanced-features/_index.md index 93c2f150a..c176f505a 100644 --- a/html/russian/net/advanced-features/_index.md +++ b/html/russian/net/advanced-features/_index.md @@ -42,7 +42,8 @@ Aspose.HTML для .NET — это мощный инструмент, позво Узнайте, как преобразовать HTML в PDF, XPS и изображения с помощью Aspose.HTML для .NET. Пошаговое руководство с примерами кода и часто задаваемыми вопросами. ### [Использование HTML-шаблонов в .NET с Aspose.HTML](./using-html-templates/) Узнайте, как использовать Aspose.HTML для .NET для динамической генерации HTML-документов из данных JSON. Используйте мощь манипуляции HTML в своих приложениях .NET. - +### [Создание потока памяти в C# – Руководство по пользовательскому созданию потока](./create-memory-stream-c-custom-stream-creation-guide/) +Узнайте, как создать пользовательский поток памяти в C# с помощью Aspose.HTML, пошаговое руководство. ## Заключение @@ -52,4 +53,4 @@ Aspose.HTML для .NET открывает дверь в мир возможно {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/russian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/russian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..786a5d118 --- /dev/null +++ b/html/russian/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,270 @@ +--- +category: general +date: 2025-12-27 +description: Быстро создайте MemoryStream в C# с пошаговым руководством. Узнайте, + как создавать поток, управлять ресурсами и реализовывать пользовательское создание + потоков в .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: ru +og_description: Создайте MemoryStream в C# за секунды. Этот учебник показывает, как + создать поток, управлять ресурсами и создавать пользовательские потоки с помощью + современных API .NET. +og_title: Создание MemoryStream в C# — Полное руководство по пользовательским потокам +tags: +- stream +- csharp +- .net +- resource-handling +title: Создание MemoryStream в C# – Руководство по созданию пользовательского потока +url: /ru/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Создание memory stream c# – Руководство по пользовательскому созданию потоков + +Когда‑нибудь вам нужно было **создать memory stream c#**, но вы не знали, какой API выбрать? Вы не одиноки. Во многих устаревших проектах вы найдете `IOutputStorage`, в то время как более новые кодовые базы предпочитают `ResourceHandler`. В любом случае цель одна: получить `Stream`, который может использовать ваш фреймворк. + +В этом руководстве вы узнаете **как создавать объекты stream**, **как безопасно работать с ресурсами** и освоите **пользовательское создание потоков** как для версий до 24.2, так и для 24.2+. К концу вы получите рабочий пример, который можно вставить в любое решение .NET — без загадочных зависимостей, только чистый C#. + +## Что вы получите + +- Чёткое сравнение устаревшего шаблона `IOutputStorage` и современного подхода `ResourceHandler`. +- Полный готовый к копированию код, компилируемый под .NET 6+ (или более ранние версии, если нужно). +- Советы по крайним случаям, таким как освобождение потоков, работа с большими нагрузками и тестирование вашего пользовательского потока. + +> **Pro tip:** Если вы нацелены на .NET 8, новый `ResourceHandler` предоставляет встроенную поддержку async, что может сэкономить миллисекунды в сценариях с высоким пропускным способностью. + +--- + +## Создание memory stream c# – Устаревший подход (pre‑24.2) + +Когда вы застряли на более старой версии библиотеки, контракт, который нужно выполнить, — `IOutputStorage`. Интерфейс требует лишь метод, возвращающий `Stream` для заданного имени ресурса. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Почему это работает + +- **Interface contract** – Фреймворк вызовет `CreateStream`, когда понадобится записать вывод. +- **Flexibility** – Поскольку вы возвращаете `Stream`, позже можно заменить `MemoryStream` на `FileStream` или даже на пользовательский буферизованный поток, не меняя остального кода. +- **Resource safety** – Вызывающая сторона отвечает за освобождение возвращённого потока, поэтому мы не вызываем `Dispose` внутри метода. + +### Распространённые подводные камни + +| Issue | What happens | Fix | +|-------|--------------|-----| +| Returning a closed stream | Consumers will get `ObjectDisposedException` on write. | Ensure the stream is **open** when you hand it off. | +| Forgetting to set `Position = 0` after writing | Data appears empty when read later. | Call `stream.Seek(0, SeekOrigin.Begin)` before returning if you pre‑populate it. | +| Using a huge `MemoryStream` for large files | Out‑of‑memory crashes. | Switch to a temporary `FileStream` or a custom buffered stream. | + +--- + +## Создание memory stream c# – Современный подход (24.2+) + +Начиная с версии 24.2 библиотека представила `ResourceHandler`. Вместо интерфейса теперь наследуете базовый класс и переопределяете один метод. Это даёт более чистую, async‑дружелюбную точку входа. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Почему стоит предпочесть `ResourceHandler` + +- **Async support** – Метод `HandleResourceAsync` позволяет выполнять I/O без блокировки потоков. +- **Built‑in error handling** – Базовый класс перехватывает исключения и преобразует их в коды ошибок, специфичные для фреймворка. +- **Future‑proof** – В новых релизах добавляются хуки (например, логирование, телеметрия), которые работают только с шаблоном обработчика. + +### Обработка крайних случаев + +1. **Disposal** – Фреймворк освобождает поток после завершения работы, но если вы оборачиваете другой disposable (например, `FileStream`), следует использовать `using` внутри метода и вернуть обёртку, которая переадресует `Dispose`. +2. **Large payloads** – Если ожидаются нагрузки > 100 MB, замените `MemoryStream` на `FileStream`, указывающий на временный файл. Пример: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – Юнит‑тестируйте обработчик, внедряя мок `IServiceProvider`, если базовый класс получает сервисы из DI. Убедитесь, что `HandleResource` возвращает поток, в который можно писать и из которого можно читать. + +## Как создать поток – Быстрая шпаргалка + +| Scenario | Recommended API | Sample Code | +|----------|----------------|-------------| +| Simple in‑memory data | `MemoryStream` | `new MemoryStream()` | +| Large temporary files | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Network‑based source | `NetworkStream` | `new NetworkStream(socket)` | +| Custom buffering | Derive from `Stream` | See [Документация Microsoft] for custom stream implementation | + +> **Note:** Always set `stream.Position = 0` before returning if you pre‑populate the stream; otherwise downstream readers will think the stream is empty. + +## Иллюстрация + +![Диаграмма, показывающая процесс создания memory stream c# process](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* диаграмма, показывающая процесс создания memory stream c# process + +## Полный исполняемый пример + +Ниже представлен минимальный консольный приложение, демонстрирующее как устаревший, так и современный подходы. Вы можете скопировать‑вставить его в новый проект консоли .NET 6 и запустить без изменений. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Ожидаемый вывод** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +Программа показывает три способа **как создавать поток**: старый `IOutputStorage`, новый синхронный `HandleResource` и асинхронный `HandleResourceAsync`. Все три возвращают `MemoryStream`, подтверждая, что пользовательское создание потоков работает независимо от целевой версии. + +## Часто задаваемые вопросы (FAQ) + +**Q: Нужно ли вызывать `Dispose` у потока, который я получаю?** +A: Фреймворк (или ваш вызывающий код) отвечает за освобождение. Если вы оборачиваете внутри возвращаемого потока другой disposable, убедитесь, что он передаёт вызов `Dispose`. + +**Q: Можно ли вернуть поток только для чтения?** +A: Да, но контракт обычно ожидает поток с возможностью записи. Если нужен только чтение, реализуйте `CanWrite => false` и задокументируйте ограничение. + +**Q: Что делать, если мои данные больше доступной ОЗУ?** +A: Перейдите на `FileStream`, основанный на временном файле, или реализуйте пользовательский буферизованный поток, который пишет на диск кусками. + +**Q: Есть ли различия в производительности между двумя подходами?** +A: Современный `ResourceHandler` добавляет небольшие накладные расходы из‑за дополнительной логики базового класса, но async‑версия может значительно повысить пропускную способность при высокой конкуренции. + +## Итоги + +Мы только что рассмотрели **create memory stream c#** со всех сторон, с которыми вы можете столкнуться в реальных проектах. Теперь вы знаете **как создавать поток** с использованием как устаревшего шаблона `IOutputStorage`, так и нового класса `ResourceHandler`, а также получили практические советы по **как работать с ресурсами** ответственно и расширять шаблон с помощью **пользовательского создания потоков** для больших файлов или async‑сценариев. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/russian/net/generate-jpg-and-png-images/_index.md b/html/russian/net/generate-jpg-and-png-images/_index.md index c461eccbe..0cdbe556a 100644 --- a/html/russian/net/generate-jpg-and-png-images/_index.md +++ b/html/russian/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Aspose.HTML для .NET предлагает простой метод прео Узнайте, как создавать динамические веб-страницы с помощью Aspose.HTML для .NET. Это пошаговое руководство охватывает предварительные условия, пространства имен и рендеринг HTML в изображения. ### [Генерация изображений PNG с помощью ImageDevice в .NET с Aspose.HTML](./generate-png-images-by-imagedevice/) Изучите Aspose.HTML для .NET для работы с HTML-документами, преобразования HTML в изображения и т. д. Пошаговое руководство с часто задаваемыми вопросами. +### [Как включить сглаживание при конвертации DOCX в PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Узнайте, как включить сглаживание при преобразовании DOCX в PNG или JPG с помощью Aspose.HTML для .NET. ## Заключение @@ -52,4 +54,4 @@ Aspose.HTML для .NET предлагает простой метод прео {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/russian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/russian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..41be4c648 --- /dev/null +++ b/html/russian/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,277 @@ +--- +category: general +date: 2025-12-27 +description: Узнайте, как включить сглаживание при конвертации DOCX в PNG или JPG. + Это пошаговое руководство также охватывает преобразование DOCX в PNG и преобразование + DOCX в JPG. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: ru +og_description: Как включить сглаживание при конвертации файлов DOCX в PNG или JPG. + Следуйте этому полному руководству для получения плавного, высококачественного результата. +og_title: Как включить сглаживание при конвертации DOCX в PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: Как включить сглаживание при конвертации DOCX в PNG/JPG +url: /ru/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Как включить сглаживание при конвертации DOCX в PNG/JPG + +Вы когда‑нибудь задумывались **как включить сглаживание**, чтобы ваши преобразованные изображения DOCX выглядели чётко, а не зубчато? Вы не одиноки. Многие разработчики сталкиваются с проблемой, когда нужно превратить документ Word в PNG или JPG и получают размытые края линий и текста. Хорошая новость? С несколькими строками C# вы можете превратить такой грубый вывод в пиксельно‑идеальную графику — без сторонних графических редакторов. + +В этом руководстве мы пройдем весь процесс **convert docx to png** и **convert docx to jpg** с использованием современной библиотеки рендеринга. Вы узнаете не только *how to convert docx*, но и *how to render docx* с включённым сглаживанием и хинтингом, чтобы каждая кривая и символ выглядели плавно. Предыдущий опыт в графическом программировании не требуется; достаточно базовой настройки C# и файла DOCX, который вы хотите превратить в изображение. + +--- + +## Что понадобится + +- **.NET 6+** (или .NET Framework 4.6+, если вы предпочитаете классический рантайм) +- Файл **DOCX**, который вы хотите отрендерить (разместите его в папке `input` для демонстрации) +- Пакет **Aspose.Words for .NET** из NuGet (или любая библиотека, предоставляющая `Document`, `ImageRenderingOptions` и `ImageDevice`). Установите его с помощью: + +```bash +dotnet add package Aspose.Words +``` + +Вот и всё — дополнительные инструменты для обработки изображений не требуются. + +--- + +## Шаг 1: Загрузка документа DOCX (how to convert docx) + +Сначала нам нужен объект `Document`, представляющий исходный файл. Считайте его цифровой версией вашего Word‑файла, которую библиотека может читать и изменять. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Почему это важно:** Загрузка документа — фундамент для *how to render docx*. Если файл не может быть прочитан, ни один из последующих шагов не сработает, поэтому мы начинаем именно с этого. + +--- + +## Шаг 2: Настройка параметров рендеринга изображения (enable antialiasing) + +Теперь начинается магическая часть — включение сглаживания и хинтинга. Сглаживание устраняет зубчатые края, которые обычно видны на диагональных линиях, а хинтинг улучшает читаемость мелкого текста. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Совет:** Если вам когда‑нибудь понадобится ускорить обработку огромных документов, вы можете отключить `UseAntialiasing`, но визуальное качество заметно ухудшится. + +--- + +## Шаг 3: Выбор формата вывода — PNG или JPG (convert docx to png / convert docx to jpg) + +Класс `ImageDevice` определяет, куда сохраняются отрендеренные страницы. Меняя `ImageSaveOptions`, вы можете вывести либо PNG (без потерь), либо JPG (сжатый). Ниже мы создаём два отдельных устройства, чтобы можно было сгенерировать оба формата за один запуск. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Зачем оба?** PNG сохраняет каждый пиксель, что идеально, когда требуется точная копия (например, печать). JPG, наоборот, сжимает изображение, делая его быстрее загружаемым на веб‑сайте. + +--- + +## Шаг 4: Рендеринг страниц документа в изображения (how to render docx) + +Когда устройства готовы, мы просим `Document` отрендерить каждую страницу. Библиотека автоматически пройдётся по всем страницам и сохранит их, используя заданный нами шаблон именования. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +После выполнения кода вы найдёте набор файлов вроде `page_0.png`, `page_1.png`, … и `page_0.jpg`, `page_1.jpg` в папке `output`. На каждом изображении будет применено сглаживание, поэтому линии плавные, а текст кристально‑чёткий. + +--- + +## Шаг 5: Проверка результата (expected output) + +Откройте любое из сгенерированных изображений. Вы должны увидеть: + +- **Плавные кривые** на фигурах и диаграммах (без артефактов «ступенчатости»). +- **Чёткий, читаемый текст** даже при небольших размерах шрифта, благодаря хинтингу. +- **Согласованные цвета** между PNG и JPG (хотя JPG может показывать небольшие артефакты сжатия при снижении качества). + +Если вы заметите размытие, дважды проверьте, что `UseAntialiasing` установлен в `true`, и что ваш исходный DOCX не содержит растровых изображений низкого разрешения. + +--- + +## Часто задаваемые вопросы и особые случаи + +### Что если нужен только один лист? + +Вы можете отрендерить конкретную страницу, используя перегрузку `PageInfo`: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Можно ли изменить DPI (точек на дюйм) для вывода более высокого разрешения? + +Конечно. Отрегулируйте свойство `Resolution` в `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Большее DPI означает более крупные файлы, но эффект сглаживания становится ещё более заметным. + +### Как обрабатывать большие файлы DOCX без исчерпания памяти? + +Рендерьте страницы по одной и освобождайте устройство после каждой итерации: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### Можно ли конвертировать в другие форматы, такие как BMP или TIFF? + +Да — просто замените `SaveFormat.Png` или `SaveFormat.Jpeg` на `SaveFormat.Bmp` или `SaveFormat.Tiff`. Те же настройки сглаживания сохраняются. + +--- + +## Полный рабочий пример (готовый к копированию и вставке) + +Ниже приведена полная программа, которую можно вставить в новый консольный проект. Она содержит все директивы `using`, обработку ошибок и комментарии для ясности. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Результат:** После компиляции (`dotnet run`) вы увидите набор файлов PNG и JPG в каталоге `output`, каждый с применённым сглаживанием. + +--- + +## Заключение + +Мы рассмотрели **как включить сглаживание** при **конвертации DOCX в PNG или JPG**, прошли через точные шаги **convert docx to png**, **convert docx to jpg**, и даже коснулись **how to render docx** для пользовательских + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/spanish/net/advanced-features/_index.md b/html/spanish/net/advanced-features/_index.md index 0a04adddc..611c39518 100644 --- a/html/spanish/net/advanced-features/_index.md +++ b/html/spanish/net/advanced-features/_index.md @@ -32,6 +32,8 @@ Aprenda a trabajar con documentos HTML en .NET utilizando Aspose.HTML para tarea Aprenda a utilizar Aspose.HTML para .NET para manipular documentos HTML de manera eficiente. Tutorial paso a paso para desarrolladores. ### [Proveedor de flujo de memoria en .NET con Aspose.HTML](./memory-stream-provider/) Aprenda a crear documentos HTML impresionantes en .NET con Aspose.HTML. Siga nuestro tutorial paso a paso y descubra el poder de la manipulación de HTML. +### [Crear flujo de memoria en C# – Guía de creación de flujo personalizado](./create-memory-stream-c-custom-stream-creation-guide/) +Aprenda a crear y gestionar flujos de memoria personalizados en C# para usar con Aspose.HTML, con ejemplos paso a paso. ### [Web Scraping en .NET con Aspose.HTML](./web-scraping/) Aprenda a manipular documentos HTML en .NET con Aspose.HTML. Navegue, filtre, consulte y seleccione elementos de manera eficaz para mejorar el desarrollo web. ### [Utilizar la propiedad de contenido extendido en .NET con Aspose.HTML](./use-extended-content-property/) @@ -52,4 +54,4 @@ Aspose.HTML para .NET abre la puerta a un mundo de posibilidades a la hora de tr {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/spanish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/spanish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..9122d505b --- /dev/null +++ b/html/spanish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,266 @@ +--- +category: general +date: 2025-12-27 +description: Crea un MemoryStream en C# rápidamente con una guía paso a paso. Aprende + cómo crear el stream, manejar los recursos e implementar la creación de streams + personalizados en .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: es +og_description: Crea un MemoryStream en C# en segundos. Este tutorial muestra cómo + crear un stream, manejar recursos y crear streams personalizados con las API modernas + de .NET. +og_title: Crear MemoryStream en C# – Guía completa de Streams personalizados +tags: +- stream +- csharp +- .net +- resource-handling +title: Crear flujo de memoria c# – Guía de creación de streams personalizados +url: /es/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Crear stream de memoria c# – Guía de creación de streams personalizados + +¿Alguna vez necesitaste **crear stream de memoria c#** pero no estabas seguro de qué API elegir? No eres el único. En muchos proyectos heredados encontrarás `IOutputStorage`, mientras que los códigos más recientes prefieren `ResourceHandler`. De cualquier forma, el objetivo es el mismo: producir un `Stream` que tu framework pueda consumir. + +En este tutorial aprenderás **cómo crear stream** objetos, **cómo manejar recursos** de forma segura, y dominar **la creación de streams personalizados** para versiones pre‑24.2 y 24.2+ de la biblioteca. Al final tendrás un ejemplo funcional que puedes insertar en cualquier solución .NET—sin referencias misteriosas, solo C# puro. + +## Lo que aprenderás + +- Una comparación clara del patrón heredado `IOutputStorage` frente al enfoque moderno `ResourceHandler`. +- Código completo, listo para copiar‑pegar, que compila contra .NET 6+ (o versiones anteriores, si lo necesitas). +- Consejos para casos límite como la disposición de streams, el manejo de cargas útiles grandes y la prueba de tu stream personalizado. + +> **Consejo profesional:** Si estás apuntando a .NET 8, el `ResourceHandler` más reciente te brinda soporte async incorporado, lo que puede ahorrar milisegundos en escenarios de alto rendimiento. + +## Crear stream de memoria c# – Enfoque heredado (pre‑24.2) + +Cuando estás atascado en una versión anterior de la biblioteca, el contrato que debes cumplir es `IOutputStorage`. La interfaz solo solicita un método que devuelva un `Stream` para un nombre de recurso dado. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Por qué funciona esto + +- **Contrato de interfaz** – El framework llamará a `CreateStream` siempre que necesite escribir salida. +- **Flexibilidad** – Como devuelves un `Stream`, puedes cambiar `MemoryStream` por `FileStream` o incluso un stream con búfer personalizado más adelante sin tocar el resto del código. +- **Seguridad de recursos** – El llamador es responsable de disponer del stream devuelto, por eso no llamamos a `Dispose` dentro del método. + +### Errores comunes + +| Problema | Qué ocurre | Solución | +|----------|------------|----------| +| Devolver un stream cerrado | Los consumidores obtendrán `ObjectDisposedException` al escribir. | Asegúrate de que el stream esté **abierto** cuando lo entregues. | +| Olvidar establecer `Position = 0` después de escribir | Los datos aparecen vacíos al leerlos después. | Llama a `stream.Seek(0, SeekOrigin.Begin)` antes de devolverlo si lo pre‑poblaste. | +| Usar un `MemoryStream` enorme para archivos grandes | Fallos por falta de memoria. | Cambia a un `FileStream` temporal o a un stream con búfer personalizado. | + +## Crear stream de memoria c# – Enfoque moderno (24.2+) + +A partir de la versión 24.2 la biblioteca introdujo `ResourceHandler`. En lugar de una interfaz, ahora heredas de una clase base y sobrescribes un único método. Esto te brinda un punto de entrada más limpio y compatible con async. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Por qué preferir `ResourceHandler` + +- **Soporte async** – El método `HandleResourceAsync` te permite realizar I/O sin bloquear hilos. +- **Manejo de errores incorporado** – La clase base captura excepciones y las convierte en códigos de error específicos del framework. +- **Preparado para el futuro** – Las versiones más recientes añaden hooks (p. ej., logging, telemetry) que solo funcionan con el patrón de handler. + +### Manejo de casos límite + +1. **Disposición** – El framework dispone del stream una vez que ha terminado, pero si envuelves otro disposable (como un `FileStream`) deberías implementar un bloque `using` dentro del método y devolver un wrapper que reenvíe `Dispose`. +2. **Cargas útiles grandes** – Si anticipas cargas útiles > 100 MB, reemplaza `MemoryStream` con un `FileStream` que apunte a un archivo temporal. Ejemplo: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Pruebas** – Realiza pruebas unitarias de tu handler inyectando un mock de `IServiceProvider` si la clase base obtiene servicios del DI. Verifica que `HandleResource` devuelva un stream que pueda escribirse y leerse. + +## Cómo crear stream – Hoja de trucos rápida + +| Escenario | API recomendada | Código de ejemplo | +|-----------|----------------|-------------------| +| Simple in‑memory data | `MemoryStream` | `new MemoryStream()` | +| Large temporary files | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Network‑based source | `NetworkStream` | `new NetworkStream(socket)` | +| Custom buffering | Derivar de `Stream` | Ver [Documentación de Microsoft] para la implementación de streams personalizados | + +> **Nota:** Siempre establece `stream.Position = 0` antes de devolverlo si pre‑poblaste el stream; de lo contrario, los lectores posteriores pensarán que el stream está vacío. + +## Ilustración de imagen + +![Diagrama que muestra el proceso de crear stream de memoria c#](https://example.com/images/create-memory-stream-diagram.png) + +*Texto alternativo:* diagrama que muestra el proceso de crear stream de memoria c# + +## Ejemplo completo ejecutable + +A continuación hay una aplicación de consola mínima que demuestra ambos enfoques, heredado y moderno. Puedes copiar‑pegarla en un nuevo proyecto de consola .NET 6 y ejecutarla tal cual. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Salida esperada** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +El programa muestra tres formas de **cómo crear stream**: el antiguo `IOutputStorage`, el nuevo `HandleResource` síncrono y el `HandleResourceAsync` asíncrono. Los tres devuelven un `MemoryStream`, demostrando que la creación de streams personalizados funciona sin importar la versión que apuntas. + +## Preguntas frecuentes (FAQ) + +**P: ¿Necesito llamar a `Dispose` sobre el stream que recibo?** +R: El framework (o tu código llamador) es responsable de la disposición. Si envuelves otro disposable dentro de tu stream devuelto, asegúrate de que propague la llamada a `Dispose`. + +**P: ¿Puedo devolver un stream de solo lectura?** +R: Sí, pero el contrato normalmente espera un stream escribible. Si solo necesitas leer, implementa `CanWrite => false` y documenta la limitación. + +**P: ¿Qué pasa si mis datos son más grandes que la RAM disponible?** +R: Cambia a un `FileStream` respaldado por un archivo temporal, o implementa un stream con búfer personalizado que escriba en disco en fragmentos. + +**P: ¿Existe alguna diferencia de rendimiento entre los dos enfoques?** +R: El `ResourceHandler` moderno añade una pequeña sobrecarga por la lógica adicional de la clase base, pero la versión async puede mejorar drásticamente el rendimiento bajo alta concurrencia. + +## Conclusión + +Acabamos de cubrir **create memory stream c#** desde todos los ángulos que podrías encontrar en la práctica. Ahora sabes **cómo crear stream** usando tanto el patrón heredado `IOutputStorage` como la clase más nueva `ResourceHandler`, además de haber visto consejos prácticos para **cómo manejar recursos** de forma responsable y ampliar el patrón con **creación de streams personalizados** para archivos grandes o escenarios async. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/spanish/net/generate-jpg-and-png-images/_index.md b/html/spanish/net/generate-jpg-and-png-images/_index.md index 3e9bc88d0..306858d69 100644 --- a/html/spanish/net/generate-jpg-and-png-images/_index.md +++ b/html/spanish/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Integrar Aspose.HTML para .NET en sus proyectos .NET es muy sencillo. La bibliot Aprenda a crear páginas web dinámicas con Aspose.HTML para .NET. Este tutorial paso a paso cubre los requisitos previos, los espacios de nombres y la representación de HTML en imágenes. ### [Generar imágenes PNG mediante ImageDevice en .NET con Aspose.HTML](./generate-png-images-by-imagedevice/) Aprenda a utilizar Aspose.HTML para .NET para manipular documentos HTML, convertir HTML en imágenes y más. Tutorial paso a paso con preguntas frecuentes. +### [Cómo habilitar el antialiasing al convertir DOCX a PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Aprenda a activar el antialiasing al convertir documentos DOCX a imágenes PNG o JPG usando Aspose.HTML para .NET. ## Conclusión @@ -52,4 +54,4 @@ Entonces, ¿por qué esperar? Comience hoy mismo a explorar el mundo de la conve {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/spanish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/spanish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..55d69d465 --- /dev/null +++ b/html/spanish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,277 @@ +--- +category: general +date: 2025-12-27 +description: Aprende cómo habilitar el antialiasing al convertir DOCX a PNG o JPG. + Esta guía paso a paso también cubre la conversión de DOCX a PNG y la conversión + de DOCX a JPG. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: es +og_description: Cómo habilitar el antialiasing al convertir archivos DOCX a PNG o + JPG. Sigue esta guía completa para obtener una salida fluida y de alta calidad. +og_title: Cómo habilitar el antialiasing al convertir DOCX a PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: Cómo habilitar el antialiasing al convertir DOCX a PNG/JPG +url: /es/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cómo habilitar el antialiasing al convertir DOCX a PNG/JPG + +¿Alguna vez te has preguntado **cómo habilitar el antialiasing** para que tus imágenes convertidas de DOCX se vean nítidas en lugar de dentadas? No estás solo. Muchos desarrolladores se topan con un muro cuando necesitan transformar un documento de Word en PNG o JPG y terminan con bordes difusos en líneas y texto. ¿La buena noticia? Con unas pocas líneas de C# puedes convertir esa salida áspera en gráficos pixel‑perfectos—sin necesidad de editores de imagen de terceros. + +En este tutorial recorreremos todo el proceso de **convert docx to png** y **convert docx to jpg** usando una biblioteca de renderizado moderna. Aprenderás no solo *cómo convertir docx*, sino también *cómo renderizar docx* con antialiasing y hinting habilitados, de modo que cada curva y carácter se vea suave. No se necesita experiencia previa en programación gráfica; solo una configuración básica de C# y un archivo DOCX que quieras transformar en una imagen. + +--- + +## Qué necesitarás + +- **.NET 6+** (o .NET Framework 4.6+ si prefieres el runtime clásico) +- Un archivo **DOCX** que quieras renderizar (colócalo en una carpeta llamada `input` para la demo) +- El paquete NuGet **Aspose.Words for .NET** (o cualquier biblioteca que exponga `Document`, `ImageRenderingOptions` y `ImageDevice`). Instálalo con: + +```bash +dotnet add package Aspose.Words +``` + +Eso es todo—no se requieren herramientas extra de procesamiento de imágenes. + +--- + +## Paso 1: Cargar el documento DOCX (how to convert docx) + +Primero necesitamos un objeto `Document` que represente el archivo fuente. Piensa en él como la versión digital de tu archivo Word que la biblioteca puede leer y manipular. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Por qué importa:** Cargar el documento es la base para *how to render docx*. Si el archivo no se puede leer, ninguno de los pasos posteriores funcionará, así que empezamos aquí. + +--- + +## Paso 2: Configurar las opciones de renderizado de imagen (enable antialiasing) + +Ahora llega la parte mágica—activar antialiasing y hinting. El antialiasing suaviza los bordes dentados que normalmente verías en líneas diagonales, mientras que el hinting mejora la claridad del texto pequeño. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Consejo profesional:** Si alguna vez necesitas un impulso de rendimiento en documentos masivos, puedes desactivar `UseAntialiasing`, pero la calidad visual disminuirá notablemente. + +--- + +## Paso 3: Elegir el formato de salida – PNG o JPG (convert docx to png / convert docx to jpg) + +La clase `ImageDevice` decide dónde van las páginas renderizadas. Al cambiar `ImageSaveOptions` puedes generar PNG (sin pérdida) o JPG (comprimido). A continuación creamos dos dispositivos separados para que puedas generar ambos formatos en una sola ejecución. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **¿Por qué ambos?** PNG conserva cada píxel, lo que es perfecto cuando necesitas fidelidad exacta (p. ej., impresión). JPG, por otro lado, comprime la imagen, haciéndola más rápida de cargar en un sitio web. + +--- + +## Paso 4: Renderizar las páginas del documento a imágenes (how to render docx) + +Con los dispositivos listos, indicamos al `Document` que renderice cada página. La biblioteca recorrerá automáticamente todas las páginas y las guardará usando el patrón de nombres que definimos. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Después de ejecutar el código, encontrarás una serie de archivos como `page_0.png`, `page_1.png`, … y `page_0.jpg`, `page_1.jpg` dentro de la carpeta `output`. Cada imagen tendrá antialiasing aplicado, por lo que las líneas serán suaves y el texto estará nítido como el cristal. + +--- + +## Paso 5: Verificar el resultado (expected output) + +Abre cualquiera de las imágenes generadas. Deberías ver: + +- **Curvas suaves** en formas y gráficos (sin artefactos escalonados). +- **Texto nítido y legible** incluso en tamaños de fuente pequeños, gracias al hinting. +- **Colores consistentes** entre PNG y JPG (aunque JPG puede mostrar ligeros artefactos de compresión si reduces la calidad). + +Si notas alguna borrosidad, verifica que `UseAntialiasing` esté configurado en `true` y que tu DOCX fuente no contenga imágenes rasterizadas de baja resolución. + +--- + +## Preguntas frecuentes y casos especiales + +### ¿Qué pasa si solo necesito una página? + +Puedes renderizar una página específica usando la sobrecarga `PageInfo`: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### ¿Puedo cambiar el DPI (puntos por pulgada) para una salida de mayor resolución? + +Claro. Ajusta la propiedad `Resolution` en `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Un DPI más alto genera archivos más grandes, pero el efecto del antialiasing se vuelve aún más perceptible. + +### ¿Cómo manejo archivos DOCX grandes sin quedarme sin memoria? + +Renderiza las páginas una a una y libera el dispositivo después de cada iteración: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### ¿Es posible convertir a otros formatos como BMP o TIFF? + +Sí—simplemente reemplaza `SaveFormat.Png` o `SaveFormat.Jpeg` por `SaveFormat.Bmp` o `SaveFormat.Tiff`. Las mismas configuraciones de antialiasing se mantienen. + +--- + +## Ejemplo completo (listo para copiar y pegar) + +A continuación tienes el programa completo que puedes colocar en un nuevo proyecto de consola. Incluye todas las sentencias `using`, manejo de errores y comentarios para mayor claridad. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Resultado:** Después de compilar (`dotnet run`) verás una serie de archivos PNG y JPG en el directorio `output`, cada uno con antialiasing aplicado. + +--- + +## Conclusión + +Hemos cubierto **cómo habilitar el antialiasing** cuando **conviertes DOCX a PNG o JPG**, recorrimos los pasos exactos para **convert docx to png**, **convert docx to jpg**, y también tocamos **cómo renderizar docx** para personalizaciones. + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/swedish/net/advanced-features/_index.md b/html/swedish/net/advanced-features/_index.md index 492cbe6fa..aba0d97a0 100644 --- a/html/swedish/net/advanced-features/_index.md +++ b/html/swedish/net/advanced-features/_index.md @@ -32,6 +32,8 @@ Lär dig hur du arbetar med HTML-dokument i .NET med Aspose.HTML för uppgifter Lär dig hur du använder Aspose.HTML för .NET för att manipulera HTML-dokument effektivt. Steg-för-steg handledning för utvecklare. ### [Minnesströmsleverantör i .NET med Aspose.HTML](./memory-stream-provider/) Lär dig hur du skapar fantastiska HTML-dokument i .NET med Aspose.HTML. Följ vår steg-för-steg handledning och lås upp kraften i HTML-manipulation. +### [Skapa minnesström i C# – Guide för anpassad strömskapning](./create-memory-stream-c-custom-stream-creation-guide/) +Lär dig hur du skapar en minnesström i C# med Aspose.HTML och anpassar strömhantering för effektiv HTML-manipulation. ### [Webbskrapning i .NET med Aspose.HTML](./web-scraping/) Lär dig att manipulera HTML-dokument i .NET med Aspose.HTML. Navigera, filtrera, fråga och välj element effektivt för förbättrad webbutveckling. ### [Använd Extended Content Property i .NET med Aspose.HTML](./use-extended-content-property/) @@ -52,4 +54,4 @@ Aspose.HTML för .NET öppnar dörren till en värld av möjligheter när det ko {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/swedish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/swedish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..f98200974 --- /dev/null +++ b/html/swedish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,280 @@ +--- +category: general +date: 2025-12-27 +description: Skapa minnesström i C# snabbt med en steg‑för‑steg‑guide. Lär dig hur + du skapar en ström, hanterar resurser och implementerar anpassad strömskapning i + .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: sv +og_description: Skapa minnesström i C# på sekunder. Den här handledningen visar hur + du skapar en ström, hanterar resurser och bygger anpassad strömskapning med moderna + .NET‑API:er. +og_title: Skapa minnesström c# – Komplett guide för anpassade strömmar +tags: +- stream +- csharp +- .net +- resource-handling +title: Skapa minnesström c# – Guide för att skapa anpassade strömmar +url: /sv/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Skapa minnesström c# – Guide för anpassad strömskapning + +Har du någonsin behövt **create memory stream c#** men varit osäker på vilket API du ska välja? Du är inte ensam. I många äldre projekt hittar du `IOutputStorage`, medan nyare kodbaser föredrar `ResourceHandler`. Oavsett är målet detsamma: producera en `Stream` som ditt ramverk kan konsumera. + +I den här handledningen kommer du att lära dig **how to create stream**‑objekt, **how to handle resources** på ett säkert sätt, och bemästra **custom stream creation** för både pre‑24.2 och 24.2+ versioner av biblioteket. I slutet har du ett fungerande exempel som du kan lägga in i vilken .NET‑lösning som helst—inga mystiska referenser, bara ren C#. + +## Vad du får med dig + +- En tydlig jämförelse av det äldre `IOutputStorage`‑mönstret vs. den moderna `ResourceHandler`‑metoden. +- Komplett, kopiera‑och‑klistra‑klar kod som kompilerar mot .NET 6+ (eller tidigare, om du behöver det). +- Tips för kantfall som att disponera strömmar, hantera stora payloads och testa din anpassade ström. + +> **Pro tip:** Om du riktar dig mot .NET 8 ger den nyare `ResourceHandler` inbyggt async‑stöd, vilket kan spara millisekunder i höggenomströmnings‑scenarier. + +--- + +## Skapa minnesström c# – Äldre tillvägagångssätt (pre‑24.2) + +När du sitter fast på en äldre version av biblioteket är kontraktet du måste uppfylla `IOutputStorage`. Gränssnittet begär bara en metod som returnerar en `Stream` för ett givet resursnamn. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Varför detta fungerar + +- **Interface contract** – Ramverket kommer att anropa `CreateStream` när det behöver skriva utdata. +- **Flexibility** – Eftersom du returnerar en `Stream` kan du byta `MemoryStream` mot `FileStream` eller till och med en anpassad buffrad ström senare utan att röra resten av koden. +- **Resource safety** – Anroparen ansvarar för att disponera den returnerade strömmen, vilket är varför vi inte anropar `Dispose` i metoden. + +### Vanliga fallgropar + +| Problem | Vad händer | Lösning | +|---------|------------|---------| +| Returnera en stängd ström | Konsumenterna får `ObjectDisposedException` vid skrivning. | Se till att strömmen är **öppen** när du överlämnar den. | +| Glömmer att sätta `Position = 0` efter skrivning | Data visas som tom när den läses senare. | Anropa `stream.Seek(0, SeekOrigin.Begin)` innan du returnerar om du förhandsfyller den. | +| Använda en enorm `MemoryStream` för stora filer | Kraschar på grund av minnesbrist. | Byt till en temporär `FileStream` eller en anpassad buffrad ström. | + +--- + +## Skapa minnesström c# – Modernt tillvägagångssätt (24.2+) + +Från och med version 24.2 introducerade biblioteket `ResourceHandler`. Istället för ett gränssnitt ärver du nu från en basklass och åsidosätter en enda metod. Detta ger dig en renare, async‑vänlig ingångspunkt. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Varför föredra `ResourceHandler` + +- **Async support** – Metoden `HandleResourceAsync` låter dig utföra I/O utan att blockera trådar. +- **Built‑in error handling** – Basklassen fångar undantag och konverterar dem till ramverksspecifika felkoder. +- **Future‑proof** – Nyare versioner lägger till krokar (t.ex. loggning, telemetri) som bara fungerar med handler‑mönstret. + +### Hantering av kantfall + +1. **Disposal** – Ramverket disponerar strömmen när den är klar, men om du omsluter en annan disposable (som en `FileStream`) bör du implementera ett `using`‑block inuti metoden och returnera en wrapper som vidarebefordrar `Dispose`. +2. **Large payloads** – Om du förväntar dig payloads > 100 MB, ersätt `MemoryStream` med en `FileStream` som pekar på en temporär fil. Exempel: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – Enhetstesta din handler genom att injicera en mock `IServiceProvider` om basklassen hämtar tjänster från DI. Verifiera att `HandleResource` returnerar en ström som kan skrivas till och läsas från. + +--- + +## Så här skapar du en ström – En snabb fusklapp + +| Scenario | Rekommenderat API | Exempelkod | +|----------|-------------------|------------| +| Enkel in‑minnesdata | `MemoryStream` | `new MemoryStream()` | +| Stora temporära filer | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Nätverksbaserad källa | `NetworkStream` | `new NetworkStream(socket)` | +| Anpassad buffring | Derive from `Stream` | See [Microsoft docs] for custom stream implementation | + +> **Note:** Sätt alltid `stream.Position = 0` innan du returnerar om du förhandsfyller strömmen; annars tror nedströms läsare att strömmen är tom. + +--- + +## Bildillustration + +![Diagram som visar create memory stream c#‑processen](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* diagram som visar create memory stream c#‑processen + +--- + +## Fullt körbart exempel + +Nedan är en minimal konsolapp som demonstrerar både de äldre och moderna tillvägagångssätten. Du kan kopiera‑och‑klistra in den i ett nytt .NET 6‑konsolprojekt och köra den som den är. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Förväntad output** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +Programmet visar tre sätt att **how to create stream**: den gamla `IOutputStorage`, den nya synkrona `HandleResource` och den asynkrona `HandleResourceAsync`. Alla tre returnerar en `MemoryStream`, vilket bevisar att anpassad strömskapning fungerar oavsett vilken version du riktar dig mot. + +--- + +## Vanliga frågor (FAQ) + +**Q: Måste jag anropa `Dispose` på den ström jag får tillbaka?** +A: Ramverket (eller din anropande kod) ansvarar för disponering. Om du omsluter en annan disposable i den returnerade strömmen, se till att den vidarebefordrar `Dispose`‑anropet. + +**Q: Kan jag returnera en skrivskyddad ström?** +A: Ja, men kontraktet förväntar sig vanligtvis en skrivbar ström. Om du bara behöver läsa, implementera `CanWrite => false` och dokumentera begränsningen. + +**Q: Vad händer om min data är större än tillgängligt RAM?** +A: Byt till en `FileStream` som stöds av en temporär fil, eller implementera en anpassad buffrad ström som skriver till disk i bitar. + +**Q: Finns det någon prestandaskillnad mellan de två tillvägagångssätten?** +A: Den moderna `ResourceHandler` lägger till en liten overhead för den extra basklasslogiken, men den asynkrona versionen kan dramatiskt förbättra genomströmning under hög samtidighet. + +--- + +## Sammanfattning + +Vi har precis gått igenom **create memory stream c#** ur alla vinklar du kan stöta på i praktiken. Du vet nu **how to create stream** med både det äldre `IOutputStorage`‑mönstret och den nyare `ResourceHandler`‑klassen, samt har sett praktiska tips för **how to handle resources** på ett ansvarsfullt sätt och hur du kan utöka mönstret med **custom stream creation** för stora filer eller async‑scenarier. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/swedish/net/generate-jpg-and-png-images/_index.md b/html/swedish/net/generate-jpg-and-png-images/_index.md index 8ebd30be1..b4c1e4c4a 100644 --- a/html/swedish/net/generate-jpg-and-png-images/_index.md +++ b/html/swedish/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Att integrera Aspose.HTML för .NET i dina .NET-projekt är problemfritt. Biblio Lär dig hur du skapar dynamiska webbsidor med Aspose.HTML för .NET. Denna steg-för-steg handledning täcker förutsättningar, namnutrymmen och återgivning av HTML till bilder. ### [Generera PNG-bilder av ImageDevice i .NET med Aspose.HTML](./generate-png-images-by-imagedevice/) Lär dig att använda Aspose.HTML för .NET för att manipulera HTML-dokument, konvertera HTML till bilder och mer. Steg-för-steg handledning med vanliga frågor. +### [Hur man aktiverar kantutjämning vid konvertering av DOCX till PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Lär dig hur du aktiverar kantutjämning för att förbättra bildkvaliteten när du konverterar DOCX-dokument till PNG eller JPG med Aspose.HTML. ## Slutsats @@ -52,4 +54,4 @@ Så varför vänta? Börja utforska världen av HTML till bildkonvertering med A {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/swedish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/swedish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..1f62a2b22 --- /dev/null +++ b/html/swedish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,277 @@ +--- +category: general +date: 2025-12-27 +description: Lär dig hur du aktiverar kantutjämning när du konverterar DOCX till PNG + eller JPG. Denna steg‑för‑steg‑guide täcker också konvertera docx till png och konvertera + docx till jpg. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: sv +og_description: Hur du aktiverar kantutjämning när du konverterar DOCX-filer till + PNG eller JPG. Följ den här kompletta guiden för en smidig, högkvalitativ utskrift. +og_title: Hur man aktiverar kantutjämning vid konvertering av DOCX till PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: Hur man aktiverar kantutjämning vid konvertering av DOCX till PNG/JPG +url: /sv/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hur du aktiverar kantutjämning när du konverterar DOCX till PNG/JPG + +Har du någonsin undrat **hur du aktiverar kantutjämning** så att dina konverterade DOCX‑bilder ser skarpa ut istället för hackiga? Du är inte ensam. Många utvecklare stöter på problem när de måste omvandla ett Word‑dokument till en PNG eller JPG och får suddiga kanter på linjer och text. Den goda nyheten? Med några rader C# kan du förvandla den grova utskriften till pixel‑perfekta grafik—utan att behöva tredjeparts‑bildredigerare. + +I den här handledningen går vi igenom hela processen för **convert docx to png** och **convert docx to jpg** med ett modernt renderingsbibliotek. Du lär dig inte bara *how to convert docx* utan också *how to render docx* med kantutjämning och hinting aktiverat, så att varje kurva och tecken ser släta ut. Ingen förkunskap om grafikprogrammering krävs; bara en grundläggande C#‑miljö och en DOCX‑fil du vill göra om till en bild. + +--- + +## Vad du behöver + +- **.NET 6+** (eller .NET Framework 4.6+ om du föredrar den klassiska runtime‑miljön) +- En **DOCX**‑fil du vill rendera (placera den i en mapp som heter `input` för demonstrationen) +- **Aspose.Words for .NET**‑paketet från NuGet (eller vilket bibliotek som helst som exponerar `Document`, `ImageRenderingOptions` och `ImageDevice`). Installera det med: + +```bash +dotnet add package Aspose.Words +``` + +Det är allt—inga extra bild‑behandlingsverktyg behövs. + +--- + +## Steg 1: Läs in DOCX‑dokumentet (how to convert docx) + +Först behöver vi ett `Document`‑objekt som representerar källfilen. Tänk på det som den digitala versionen av ditt Word‑dokument som biblioteket kan läsa och manipulera. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Varför detta är viktigt:** Att läsa in dokumentet är grunden för *how to render docx*. Om filen inte kan läsas kommer inga av de efterföljande stegen att fungera, så vi börjar här. + +--- + +## Steg 2: Konfigurera bildrenderingsalternativ (enable antialiasing) + +Nu kommer den magiska delen—att slå på kantutjämning och hinting. Kantutjämning mjukar upp de hackiga kanterna du normalt ser på diagonala linjer, medan hinting förbättrar tydligheten i liten text. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Proffstips:** Om du någonsin behöver en prestandaökning på enorma dokument kan du stänga av `UseAntialiasing`, men den visuella kvaliteten kommer märkbart att försämras. + +--- + +## Steg 3: Välj utdataformat – PNG eller JPG (convert docx to png / convert docx to jpg) + +Klassen `ImageDevice` bestämmer var de renderade sidorna hamnar. Genom att byta `ImageSaveOptions` kan du skriva ut antingen PNG (förlustfri) eller JPG (komprimerad). Nedan skapar vi två separata enheter så att du kan generera båda formaten i ett och samma körning. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Varför båda?** PNG bevarar varje pixel, vilket är perfekt när du behöver exakt återgivning (t.ex. för utskrift). JPG, å andra sidan, komprimerar bilden och gör den snabbare att ladda på en webbplats. + +--- + +## Steg 4: Rendera dokumentets sidor till bilder (how to render docx) + +När enheterna är klara säger vi åt `Document` att rendera varje sida. Biblioteket loopar automatiskt igenom alla sidor och sparar dem enligt det namnformat vi definierat. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Efter att koden har körts hittar du en rad filer som `page_0.png`, `page_1.png`, … och `page_0.jpg`, `page_1.jpg` i mappen `output`. Varje bild har kantutjämning applicerad, så linjerna är släta och texten kristallklar. + +--- + +## Steg 5: Verifiera resultatet (expected output) + +Öppna någon av de genererade bilderna. Du bör se: + +- **Släta kurvor** på former och diagram (inga trappsteg‑artefakter). +- **Skarp, läsbar text** även i små teckenstorlekar, tack vare hinting. +- **Konsekventa färger** mellan PNG och JPG (även om JPG kan visa små komprimeringsartefakter om du sänker kvaliteten). + +Om du märker någon oskärpa, dubbelkolla att `UseAntialiasing` är satt till `true` och att ditt källdokument DOCX inte innehåller lågupplösta rasterbilder. + +--- + +## Vanliga frågor & specialfall + +### Vad gör jag om jag bara behöver en enda sida? + +Du kan rendera en specifik sida genom att använda `PageInfo`‑överladdningen: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Kan jag ändra DPI (dots per inch) för högre upplösning? + +Absolut. Justera egenskapen `Resolution` på `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Högre DPI innebär större filer, men kantutjämningseffekten blir ännu mer märkbar. + +### Hur hanterar jag stora DOCX‑filer utan att få minnesproblem? + +Rendera sidor en‑och‑en och frigör enheten efter varje iteration: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### Är det möjligt att konvertera till andra format som BMP eller TIFF? + +Ja—byt bara `SaveFormat.Png` eller `SaveFormat.Jpeg` mot `SaveFormat.Bmp` eller `SaveFormat.Tiff`. Samma kantutjämningsinställningar gäller. + +--- + +## Fullt fungerande exempel (Kopiera‑klistra‑klart) + +Nedan är hela programmet som du kan klistra in i ett nytt konsolprojekt. Det innehåller alla `using`‑satser, felhantering och kommentarer för tydlighet. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Resultat:** Efter att du har kompilerat (`dotnet run`) ser du en rad PNG‑ och JPG‑filer i katalogen `output`, var och en med kantutjämning applicerad. + +--- + +## Slutsats + +Vi har gått igenom **hur du aktiverar kantutjämning** när du **konverterar DOCX till PNG eller JPG**, steg för steg hur du **convert docx to png**, **convert docx to jpg**, och även berört **how to render docx** för anpassade behov + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/thai/net/advanced-features/_index.md b/html/thai/net/advanced-features/_index.md index 42fc2cebd..2ae54f434 100644 --- a/html/thai/net/advanced-features/_index.md +++ b/html/thai/net/advanced-features/_index.md @@ -32,6 +32,8 @@ Aspose.HTML สำหรับ .NET เป็นเครื่องมือ เรียนรู้วิธีใช้ Aspose.HTML สำหรับ .NET เพื่อจัดการเอกสาร HTML อย่างมีประสิทธิภาพ บทช่วยสอนแบบทีละขั้นตอนสำหรับนักพัฒนา ### [ผู้ให้บริการสตรีมหน่วยความจำใน .NET พร้อม Aspose.HTML](./memory-stream-provider/) เรียนรู้วิธีการสร้างเอกสาร HTML ที่สวยงามใน .NET ด้วย Aspose.HTML ปฏิบัติตามบทช่วยสอนทีละขั้นตอนของเราและปลดล็อกพลังของการจัดการ HTML +### [สร้าง Memory Stream ด้วย C# – คู่มือการสร้างสตรีมแบบกำหนดเอง](./create-memory-stream-c-custom-stream-creation-guide/) +เรียนรู้วิธีสร้าง Memory Stream ใน C# สำหรับการใช้งานกับ Aspose.HTML และการจัดการสตรีมแบบกำหนดเอง ### [การขูดเว็บใน .NET ด้วย Aspose.HTML](./web-scraping/) เรียนรู้การจัดการเอกสาร HTML ใน .NET ด้วย Aspose.HTML นำทาง กรอง ค้นหา และเลือกองค์ประกอบอย่างมีประสิทธิภาพเพื่อการพัฒนาเว็บที่มีประสิทธิภาพยิ่งขึ้น ### [ใช้คุณสมบัติเนื้อหาขยายใน .NET ด้วย Aspose.HTML](./use-extended-content-property/) @@ -52,4 +54,4 @@ Aspose.HTML สำหรับ .NET เปิดประตูสู่โล {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/thai/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/thai/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..5d136aef8 --- /dev/null +++ b/html/thai/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,267 @@ +--- +category: general +date: 2025-12-27 +description: สร้าง Memory Stream ใน C# อย่างรวดเร็วด้วยคู่มือขั้นตอนต่อขั้นตอน เรียนรู้วิธีสร้างสตรีม + การจัดการทรัพยากร และการสร้างสตรีมแบบกำหนดเองใน .NET +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: th +og_description: สร้าง MemoryStream ด้วย C# ในไม่กี่วินาที บทเรียนนี้แสดงวิธีสร้างสตรีม, + จัดการทรัพยากร, และสร้างสตรีมแบบกำหนดเองด้วย API .NET สมัยใหม่ +og_title: สร้าง Memory Stream ใน C# – คู่มือการสร้าง Stream แบบกำหนดเองอย่างครบถ้วน +tags: +- stream +- csharp +- .net +- resource-handling +title: สร้าง Memory Stream C# – คู่มือการสร้างสตรีมแบบกำหนดเอง +url: /th/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# สร้าง memory stream c# – คู่มือการสร้างสตรีมแบบกำหนดเอง + +เคยต้องการ **create memory stream c#** แต่ไม่แน่ใจว่าจะเลือก API ไหนไหม? คุณไม่ได้เป็นคนเดียว ในหลายโครงการเก่า ๆ คุณจะพบ `IOutputStorage` ในขณะที่โค้ดใหม่ ๆ นิยมใช้ `ResourceHandler` ไม่ว่าอย่างไรก็ตาม เป้าหมายคือเดียวกัน: สร้าง `Stream` ที่เฟรมเวิร์กของคุณสามารถใช้ได้ + +ในบทแนะนำนี้ คุณจะได้เรียนรู้ **how to create stream** objects, **how to handle resources** อย่างปลอดภัย, และเชี่ยวชาญ **custom stream creation** สำหรับทั้งเวอร์ชันก่อน‑24.2 และ 24.2+ ของไลบรารี เมื่อจบคุณจะมีตัวอย่างที่ทำงานได้ซึ่งสามารถนำไปใส่ในโซลูชัน .NET ใดก็ได้—ไม่มีการอ้างอิงที่ซับซ้อน เพียงแค่ C# แท้ ๆ + +## สิ่งที่คุณจะได้เรียนรู้ + +- การเปรียบเทียบที่ชัดเจนระหว่างรูปแบบ `IOutputStorage` แบบเก่า กับแนวทาง `ResourceHandler` แบบใหม่ +- โค้ดที่สมบูรณ์พร้อมคัดลอก‑วางที่คอมไพล์ได้กับ .NET 6+ (หรือเวอร์ชันก่อนหน้า หากคุณต้องการ) +- เคล็ดลับสำหรับกรณีขอบเช่นการทำลายสตรีม, การจัดการข้อมูลขนาดใหญ่, และการทดสอบสตรีมแบบกำหนดเองของคุณ + +> **เคล็ดลับพิเศษ:** หากคุณกำหนดเป้าหมายเป็น .NET 8, `ResourceHandler` รุ่นใหม่จะให้การสนับสนุน async ในตัว ซึ่งสามารถลดมิลลิวินาทีในสถานการณ์ที่ต้องการ throughput สูงได้ + +--- + +## สร้าง memory stream c# – วิธีแบบเก่า (pre‑24.2) + +เมื่อคุณติดอยู่กับเวอร์ชันเก่าของไลบรารี สัญญาที่คุณต้องปฏิบัติตามคือ `IOutputStorage` อินเทอร์เฟซนี้ต้องการเพียงเมธอดที่คืนค่า `Stream` สำหรับชื่อทรัพยากรที่ระบุ + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### ทำไมวิธีนี้ถึงได้ผล + +- **สัญญาอินเทอร์เฟซ** – เฟรมเวิร์กจะเรียก `CreateStream` ทุกครั้งที่ต้องการเขียนผลลัพธ์ +- **ความยืดหยุ่น** – เนื่องจากคุณคืนค่า `Stream` คุณสามารถสลับ `MemoryStream` เป็น `FileStream` หรือแม้กระทั่งสตรีมบัฟเฟอร์แบบกำหนดเองในภายหลังโดยไม่ต้องแก้ไขโค้ดส่วนอื่น +- **ความปลอดภัยของทรัพยากร** – ผู้เรียกเป็นผู้รับผิดชอบในการทำลายสตรีมที่คืนค่า ซึ่งเป็นเหตุผลที่เราไม่เรียก `Dispose` ภายในเมธอด + +### ข้อผิดพลาดทั่วไป + +| ปัญหา | สิ่งที่เกิดขึ้น | วิธีแก้ | +|-------|----------------|--------| +| การคืนสตรีมที่ปิดแล้ว | ผู้ใช้จะได้รับ `ObjectDisposedException` เมื่อเขียน | ตรวจสอบให้แน่ใจว่าสตรีม **เปิด** อยู่เมื่อส่งต่อ | +| ลืมตั้งค่า `Position = 0` หลังการเขียน | ข้อมูลดูเหมือนว่างเปล่าเมื่ออ่านต่อไป | เรียก `stream.Seek(0, SeekOrigin.Begin)` ก่อนคืนค่า หากคุณได้เติมข้อมูลล่วงหน้า | +| ใช้ `MemoryStream` ขนาดใหญ่สำหรับไฟล์ใหญ่ | เกิดการล่มจากหน่วยความจำไม่พอ | เปลี่ยนเป็น `FileStream` ชั่วคราวหรือสตรีมบัฟเฟอร์แบบกำหนดเอง | + +--- + +## สร้าง memory stream c# – วิธีสมัยใหม่ (24.2+) + +ตั้งแต่เวอร์ชัน 24.2 ไลบรารีได้แนะนำ `ResourceHandler` แทนการใช้อินเทอร์เฟซ คุณจะสืบทอดจากคลาสฐานและเขียนทับเมธอดเดียว ซึ่งทำให้จุดเริ่มต้นสะอาดขึ้นและรองรับ async + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### ทำไมควรเลือก `ResourceHandler` + +- **รองรับ Async** – เมธอด `HandleResourceAsync` ให้คุณทำ I/O โดยไม่บล็อกเธรด +- **จัดการข้อผิดพลาดในตัว** – คลาสฐานจะจับข้อยกเว้นและแปลงเป็นรหัสข้อผิดพลาดเฉพาะเฟรมเวิร์ก +- **พร้อมอนาคต** – เวอร์ชันใหม่เพิ่ม hook (เช่น logging, telemetry) ที่ทำงานได้เฉพาะกับรูปแบบ handler + +### การจัดการกรณีขอบ + +1. **การทำลาย** – เฟรมเวิร์กจะทำลายสตรีมหลังจากใช้งานเสร็จ แต่หากคุณห่อหุ้มวัตถุที่ทำลายได้อื่น (เช่น `FileStream`) ควรใช้บล็อก `using` ภายในเมธอดและคืน wrapper ที่ส่งต่อ `Dispose` +2. **ข้อมูลขนาดใหญ่** – หากคาดว่าจะมี payload มากกว่า 100 MB ให้เปลี่ยนจาก `MemoryStream` เป็น `FileStream` ที่ชี้ไปยังไฟล์ชั่วคราว ตัวอย่าง: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` +3. **การทดสอบ** – ทดสอบหน่วยของ handler โดยฉีด `IServiceProvider` จำลอง หากคลาสฐานดึงบริการจาก DI ตรวจสอบว่า `HandleResource` คืนสตรีมที่สามารถเขียนและอ่านได้ + +## วิธีสร้างสตรีม – ชีตสรุปเร็ว + +| สถานการณ์ | API ที่แนะนำ | ตัวอย่างโค้ด | +|-----------|--------------|--------------| +| ข้อมูลในหน่วยความจำแบบง่าย | `MemoryStream` | `new MemoryStream()` | +| ไฟล์ชั่วคราวขนาดใหญ่ | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| แหล่งข้อมูลแบบเครือข่าย | `NetworkStream` | `new NetworkStream(socket)` | +| การบัฟเฟอร์แบบกำหนดเอง | สืบทอดจาก `Stream` | ดู [Microsoft docs] สำหรับการทำ custom stream implementation | + +> **หมายเหตุ:** ควรตั้งค่า `stream.Position = 0` ก่อนคืนค่า หากคุณเติมข้อมูลล่วงหน้า มิฉะนั้นผู้อ่านต่อไปจะคิดว่าสตรีมว่างเปล่า + +## ภาพประกอบ + +![แผนภาพแสดงกระบวนการสร้าง memory stream c#](https://example.com/images/create-memory-stream-diagram.png) + +*ข้อความแทนภาพ:* แผนภาพแสดงกระบวนการสร้าง memory stream c# + +## ตัวอย่างที่สามารถรันได้เต็มรูปแบบ + +ด้านล่างเป็นแอปคอนโซลขนาดเล็กที่แสดงวิธีทั้งแบบเก่าและแบบใหม่ คุณสามารถคัดลอก‑วางลงในโปรเจกต์คอนโซล .NET 6 ใหม่และรันได้ทันที + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**ผลลัพธ์ที่คาดหวัง** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +โปรแกรมนี้แสดงสามวิธีในการ **how to create stream**: `IOutputStorage` แบบเก่า, `HandleResource` แบบซิงโครนัสใหม่, และ `HandleResourceAsync` แบบอะซิงโครนัส ทั้งสามคืนค่า `MemoryStream` แสดงให้เห็นว่าการสร้างสตรีมแบบกำหนดเองทำงานได้ไม่ว่าคุณจะใช้เวอร์ชันใด + +## คำถามที่พบบ่อย (FAQ) + +**ถาม: ฉันต้องเรียก `Dispose` บนสตรีมที่ได้รับกลับมาหรือไม่?** +**ตอบ:** เฟรมเวิร์ก (หรือโค้ดที่เรียก) เป็นผู้รับผิดชอบการทำลาย หากคุณห่อหุ้มวัตถุที่ทำลายได้อื่นภายในสตรีมที่คืนค่า ควรให้มันส่งต่อการเรียก `Dispose` ด้วย + +**ถาม: ฉันสามารถคืนสตรีมแบบอ่าน‑อย่างเดียวได้หรือไม่?** +**ตอบ:** ได้ แต่สัญญามักคาดหวังสตรีมที่เขียนได้ หากคุณต้องการอ่านเท่านั้น ให้เขียน `CanWrite => false` และระบุข้อจำกัดในเอกสาร + +**ถาม: ถ้าข้อมูลของฉันใหญ่กว่าหน่วยความจำที่มี?** +**ตอบ:** เปลี่ยนเป็น `FileStream` ที่อิงไฟล์ชั่วคราว หรือสร้างสตรีมบัฟเฟอร์แบบกำหนดเองที่เขียนลงดิสก์เป็นชิ้นส่วน + +**ถาม: มีความแตกต่างด้านประสิทธิภาพระหว่างสองวิธีหรือไม่?** +**ตอบ:** `ResourceHandler` รุ่นใหม่เพิ่มภาระเล็กน้อยจากตรรกะของคลาสฐานเพิ่มเติม แต่เวอร์ชัน async สามารถเพิ่ม throughput อย่างมากในสภาวะความพร้อมใช้งานสูง + +## สรุป + +เราได้ครอบคลุม **create memory stream c#** จากทุกมุมที่คุณอาจเจอในโลกจริง คุณตอนนี้รู้ **how to create stream** ด้วยทั้งรูปแบบ `IOutputStorage` แบบเก่าและคลาส `ResourceHandler` รุ่นใหม่ พร้อมกับเคล็ดลับการ **how to handle resources** อย่างรับผิดชอบและการขยายรูปแบบด้วย **custom stream creation** สำหรับไฟล์ขนาดใหญ่หรือสถานการณ์ async + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/thai/net/generate-jpg-and-png-images/_index.md b/html/thai/net/generate-jpg-and-png-images/_index.md index 8cebaf39a..a418c3ad7 100644 --- a/html/thai/net/generate-jpg-and-png-images/_index.md +++ b/html/thai/net/generate-jpg-and-png-images/_index.md @@ -18,7 +18,7 @@ Aspose.HTML สำหรับ .NET เป็นไลบรารีที่ ## เหตุใดจึงต้องใช้ Aspose.HTML สำหรับ .NET? -ก่อนอื่น มาพูดคุยกันก่อนว่าทำไมคุณควรเลือก Aspose.HTML สำหรับ .NET เพื่อสร้างรูปภาพ ไลบรารีนี้ช่วยให้แปลง HTML เป็นรูปแบบรูปภาพต่างๆ ได้อย่างราบรื่นและมีประสิทธิภาพ รวมถึง JPG และ PNG ไม่ว่าคุณต้องการสร้างตัวอย่างเว็บไซต์ที่น่าดึงดูด สร้างภาพขนาดย่อ หรือสร้างรายงานที่ดึงดูดสายตา Aspose.HTML สำหรับ .NET จะช่วยคุณได้ +ก่อนแรก มาพูดคุยกันก่อนว่าทำไมคุณควรเลือก Aspose.HTML สำหรับ .NET เพื่อสร้างรูปภาพ ไลบรารีนี้ช่วยให้แปลง HTML เป็นรูปแบบรูปภาพต่างๆ ได้อย่างราบรื่นและมีประสิทธิภาพ รวมถึง JPG และ PNG ไม่ว่าคุณต้องการสร้างตัวอย่างเว็บไซต์ที่น่าดึงดูด สร้างภาพขนาดย่อ หรือสร้างรายงานที่ดึงดูดสายตา Aspose.HTML สำหรับ .NET จะช่วยคุณได้ ## การเริ่มต้น @@ -41,6 +41,8 @@ Aspose.HTML สำหรับ .NET นำเสนอวิธีการง เรียนรู้วิธีสร้างหน้าเว็บแบบไดนามิกโดยใช้ Aspose.HTML สำหรับ .NET บทช่วยสอนแบบทีละขั้นตอนนี้ครอบคลุมถึงข้อกำหนดเบื้องต้น เนมสเปซ และการเรนเดอร์ HTML ลงในรูปภาพ ### [สร้างภาพ PNG โดย ImageDevice ใน .NET ด้วย Aspose.HTML](./generate-png-images-by-imagedevice/) เรียนรู้การใช้ Aspose.HTML สำหรับ .NET เพื่อจัดการเอกสาร HTML แปลง HTML เป็นรูปภาพ และอื่นๆ อีกมากมาย บทช่วยสอนแบบทีละขั้นตอนพร้อมคำถามที่พบบ่อย +### [วิธีเปิดใช้งาน Antialiasing เมื่อแปลง DOCX เป็น PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +เรียนรู้วิธีเปิดใช้งาน Antialiasing เพื่อให้ภาพ PNG/JPG ที่แปลงจาก DOCX มีความคมชัดและลื่นไหล ## บทสรุป @@ -52,4 +54,4 @@ Aspose.HTML สำหรับ .NET นำเสนอวิธีการง {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/thai/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/thai/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..0af74cc63 --- /dev/null +++ b/html/thai/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,276 @@ +--- +category: general +date: 2025-12-27 +description: เรียนรู้วิธีเปิดใช้งานการทำแอนติอัลไลซิ่งขณะแปลง DOCX เป็น PNG หรือ JPG + คู่มือขั้นตอนต่อขั้นตอนนี้ยังครอบคลุมการแปลง docx เป็น png และการแปลง docx เป็น + jpg ด้วย +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: th +og_description: วิธีเปิดใช้งานการทำแอนตี้เอียลิซิงขณะแปลงไฟล์ DOCX เป็น PNG หรือ JPG — ปฏิบัติตามคู่มือฉบับเต็มนี้เพื่อผลลัพธ์ที่ราบรื่นและคุณภาพสูง. +og_title: วิธีเปิดใช้งาน Antialiasing เมื่อแปลง DOCX เป็น PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: วิธีเปิดใช้งานการทำแอนตี้เอเลียซิงเมื่อแปลง DOCX เป็น PNG/JPG +url: /th/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# วิธีเปิดใช้งาน Antialiasing เมื่อแปลง DOCX เป็น PNG/JPG + +เคยสงสัย **how to enable antialiasing** เพื่อให้ภาพ DOCX ที่แปลงออกมาดูคมชัดแทนที่จะเป็นขอบหยักหรือไม่? คุณไม่ได้เป็นคนเดียว นักพัฒนาหลายคนเจออุปสรรคเมื่อจำเป็นต้องแปลงเอกสาร Word เป็น PNG หรือ JPG แล้วได้ขอบที่เบลอของเส้นและข้อความ ข่าวดีคือ? ด้วยไม่กี่บรรทัดของ C# คุณสามารถเปลี่ยนผลลัพธ์ที่หยาบเหล่านั้นให้เป็นกราฟิกที่พิกเซล‑เพอร์เฟค—ไม่ต้องใช้โปรแกรมแก้ไขภาพของบุคคลที่สาม + +ในบทเรียนนี้เราจะพาคุณผ่านกระบวนการทั้งหมดของ **convert docx to png** และ **convert docx to jpg** ด้วยไลบรารีการเรนเดอร์สมัยใหม่ คุณจะได้เรียนรู้ไม่เพียงแต่ *how to convert docx* แต่ยัง *how to render docx* พร้อมเปิดใช้งาน antialiasing และ hinting เพื่อให้ทุกเส้นโค้งและอักขระดูเรียบเนียน ไม่จำเป็นต้องมีประสบการณ์ด้านการเขียนโปรแกรมกราฟิกมาก่อน; เพียงแค่ตั้งค่า C# เบื้องต้นและไฟล์ DOCX ที่คุณต้องการแปลงเป็นภาพ + +--- + +## สิ่งที่คุณต้องเตรียม + +- **.NET 6+** (หรือ .NET Framework 4.6+ หากคุณชอบรันไทม์แบบคลาสสิก) +- ไฟล์ **DOCX** ที่คุณต้องการเรนเดอร์ (วางไว้ในโฟลเดอร์ชื่อ `input` สำหรับการสาธิต) +- แพคเกจ **Aspose.Words for .NET** NuGet (หรือไลบรารีใด ๆ ที่เปิดให้ใช้ `Document`, `ImageRenderingOptions`, และ `ImageDevice`). ติดตั้งด้วยคำสั่ง: + +```bash +dotnet add package Aspose.Words +``` + +แค่นั้น—ไม่ต้องใช้เครื่องมือประมวลผลภาพเพิ่มเติม + +--- + +## ขั้นตอนที่ 1: โหลดเอกสาร DOCX (how to convert docx) + +ก่อนอื่นเราต้องมีอ็อบเจกต์ `Document` ที่แทนไฟล์ต้นฉบับ คิดว่าเป็นเวอร์ชันดิจิทัลของไฟล์ Word ที่ไลบรารีสามารถอ่านและจัดการได้ + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **ทำไมเรื่องนี้ถึงสำคัญ:** การโหลดเอกสารเป็นพื้นฐานสำหรับ *how to render docx*. หากไฟล์ไม่สามารถอ่านได้ ขั้นตอนต่อ ๆ ไปจะทำงานไม่ได้ ดังนั้นเราจึงเริ่มจากตรงนี้ + +--- + +## ขั้นตอนที่ 2: ตั้งค่าตัวเลือกการเรนเดอร์ภาพ (enable antialiasing) + +ต่อมาคือส่วนที่ทำให้เกิด “เวทมนตร์” — การเปิดใช้งาน antialiasing และ hinting Antialiasing จะทำให้ขอบหยักของเส้นทแยงมุมเรียบเนียนขึ้น ส่วน hinting จะช่วยให้ข้อความขนาดเล็กชัดเจนยิ่งขึ้น + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **เคล็ดลับ:** หากคุณต้องการเพิ่มประสิทธิภาพการทำงานกับเอกสารขนาดใหญ่ คุณสามารถปิด `UseAntialiasing` ได้ แต่คุณภาพภาพจะลดลงอย่างเห็นได้ชัด + +--- + +## ขั้นตอนที่ 3: เลือกรูปแบบผลลัพธ์ – PNG หรือ JPG (convert docx to png / convert docx to jpg) + +คลาส `ImageDevice` จะกำหนดว่าหน้าที่เรนเดอร์จะถูกบันทึกไปที่ไหน โดยการสลับ `ImageSaveOptions` คุณสามารถส่งออกเป็น PNG (ไม่มีการสูญเสีย) หรือ JPG (บีบอัด) ด้านล่างเราจะสร้างอุปกรณ์สองตัวแยกกันเพื่อให้คุณสามารถสร้างทั้งสองรูปแบบได้ในรันเดียว + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **ทำไมต้องทั้งสอง?** PNG เก็บพิกเซลทุกจุดไว้ครบถ้วน เหมาะเมื่อคุณต้องการความแม่นยำสูง (เช่น การพิมพ์) ส่วน JPG จะบีบอัดภาพ ทำให้โหลดเร็วขึ้นบนเว็บไซต์ + +--- + +## ขั้นตอนที่ 4: เรนเดอร์หน้าของเอกสารเป็นภาพ (how to render docx) + +เมื่ออุปกรณ์พร้อมแล้ว เราจะบอก `Document` ให้เรนเดอร์แต่ละหน้า ไลบรารีจะวนลูปผ่านทุกหน้าโดยอัตโนมัติและบันทึกตามรูปแบบชื่อไฟล์ที่เรากำหนด + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +หลังจากรันโค้ดแล้ว คุณจะพบไฟล์ชุดเช่น `page_0.png`, `page_1.png`, … และ `page_0.jpg`, `page_1.jpg` อยู่ในโฟลเดอร์ `output` ทุกภาพจะถูกประยุกต์ใช้ antialiasing ทำให้เส้นเรียบและข้อความคมชัดเหมือนคริสตัล + +--- + +## ขั้นตอนที่ 5: ตรวจสอบผลลัพธ์ (expected output) + +เปิดภาพใดภาพหนึ่งที่สร้างขึ้น คุณควรเห็น: + +- **เส้นโค้งเรียบ** บนรูปทรงและแผนภูมิ (ไม่มีอ artefact แบบบันได) +- **ข้อความคมชัด** แม้ขนาดฟอนต์เล็ก เนื่องจาก hinting +- **สีคงที่** ระหว่าง PNG และ JPG (แม้ JPG อาจมี artefact เล็กน้อยหากคุณลดคุณภาพ) + +หากพบความเบลอ ให้ตรวจสอบว่า `UseAntialiasing` ตั้งเป็น `true` และไฟล์ DOCX ต้นฉบับไม่มีภาพเรสเตอร์ความละเอียดต่ำ + +--- + +## คำถามที่พบบ่อย & กรณีขอบ + +### ถ้าต้องการแปลงเพียงหน้าเดียวล่ะ? + +คุณสามารถเรนเดอร์หน้าเฉพาะได้โดยใช้ overload ของ `PageInfo`: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### สามารถเปลี่ยน DPI (dots per inch) เพื่อให้ได้ผลลัพธ์ความละเอียดสูงขึ้นได้ไหม? + +ได้เลย ปรับค่า `Resolution` บน `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +DPI ที่สูงขึ้นหมายถึงไฟล์ใหญ่ขึ้น แต่เอฟเฟกต์ antialiasing จะเห็นได้ชัดเจนยิ่งขึ้น + +### จะจัดการกับไฟล์ DOCX ขนาดใหญ่โดยไม่ให้หน่วยความจำหมดได้อย่างไร? + +เรนเดอร์หน้าเป็นหน้าและทำลายอุปกรณ์หลังจากแต่ละรอบ: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### สามารถแปลงเป็นรูปแบบอื่นเช่น BMP หรือ TIFF ได้ไหม? + +ได้—เพียงสลับ `SaveFormat.Png` หรือ `SaveFormat.Jpeg` เป็น `SaveFormat.Bmp` หรือ `SaveFormat.Tiff` การตั้งค่า antialiasing จะยังคงทำงานอยู่ + +--- + +## ตัวอย่างทำงานเต็มรูปแบบ (Copy‑Paste Ready) + +ด้านล่างเป็นโปรแกรมเต็มที่คุณสามารถคัดลอกไปวางในโปรเจกต์คอนโซลใหม่ได้ รวมถึงคำสั่ง using, การจัดการข้อผิดพลาด, และคอมเมนต์เพื่อความชัดเจน + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **ผลลัพธ์:** หลังจากคอมไพล์ (`dotnet run`) คุณจะเห็นไฟล์ PNG และ JPG ชุดหนึ่งในไดเรกทอรี `output` ทุกไฟล์จะมีการประยุกต์ใช้ antialiasing + +--- + +## สรุป + +เราได้ครอบคลุม **how to enable antialiasing** เมื่อคุณ **convert DOCX to PNG หรือ JPG**, ผ่านขั้นตอนที่แม่นยำเพื่อ **convert docx to png**, **convert docx to jpg**, และแม้กระทั่งได้สัมผัส **how to render docx** สำหรับการปรับแต่งเพิ่มเติม + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/turkish/net/advanced-features/_index.md b/html/turkish/net/advanced-features/_index.md index 339c6a5d9..267147ca2 100644 --- a/html/turkish/net/advanced-features/_index.md +++ b/html/turkish/net/advanced-features/_index.md @@ -32,6 +32,7 @@ Komut dosyası yönetimi, özel stiller, JavaScript yürütme denetimi ve daha f HTML belgelerini etkili bir şekilde düzenlemek için Aspose.HTML for .NET'i nasıl kullanacağınızı öğrenin. Geliştiriciler için adım adım eğitim. ### [Aspose.HTML ile .NET'te Bellek Akışı Sağlayıcısı](./memory-stream-provider/) Aspose.HTML ile .NET'te çarpıcı HTML belgeleri oluşturmayı öğrenin. Adım adım öğreticimizi izleyin ve HTML manipülasyonunun gücünü açığa çıkarın. +### [Bellek akışı oluşturma c# – Özel akış oluşturma rehberi](./create-memory-stream-c-custom-stream-creation-guide/) ### [Aspose.HTML ile .NET'te Web Kazıma](./web-scraping/) Aspose.HTML ile .NET'te HTML belgelerini düzenlemeyi öğrenin. Gelişmiş web geliştirme için öğeleri etkili bir şekilde gezinin, filtreleyin, sorgulayın ve seçin. ### [.NET'te Aspose.HTML ile Genişletilmiş İçerik Özelliğini Kullanma](./use-extended-content-property/) @@ -46,10 +47,10 @@ JSON verilerinden HTML belgelerini dinamik olarak oluşturmak için Aspose.HTML ## Çözüm -.NET için Aspose.HTML, .NET uygulamalarınızda HTML belgeleriyle çalışırken olasılıklar dünyasının kapılarını açar. Bu gelişmiş özellik eğitimleri, Aspose.HTML'nin tüm potansiyelinden yararlanmak için gereken bilgi ve becerileri size sağlayacaktır. Geliştirme projelerinizi yükseltin, zamandan tasarruf edin ve .NET için Aspose.HTML ile olağanüstü çözümler yaratın. Eğitimlerimize bugün başlayın ve web geliştirmenizi bir üst seviyeye taşıyın. +.NET için Aspose.HTML, .NET uygulamalarınızda HTML belgeleriyle çalışırken olasılıkların dünyasının kapılarını açar. Bu gelişmiş özellik eğitimleri, Aspose.HTML'nin tüm potansiyelinden yararlanmak için gereken bilgi ve becerileri size sağlayacaktır. Geliştirme projelerinizi yükseltin, zamandan tasarruf edin ve .NET için Aspose.HTML ile olağanüstü çözümler yaratın. Eğitimlerimize bugün başlayın ve web geliştirmenizi bir üst seviyeye taşıyın. {{< /blocks/products/pf/tutorial-page-section >}} {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/turkish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/turkish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..e68a4cfe5 --- /dev/null +++ b/html/turkish/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,280 @@ +--- +category: general +date: 2025-12-27 +description: C#'ta bellek akışını hızlı bir şekilde oluşturun, adım adım bir kılavuzla. + Akışı nasıl oluşturacağınızı, kaynakları nasıl yöneteceğinizi ve .NET'te özel akış + oluşturmayı nasıl uygulayacağınızı öğrenin. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: tr +og_description: Saniyeler içinde C# bellek akışı oluşturun. Bu öğretici, akışı nasıl + oluşturacağınızı, kaynakları nasıl yöneteceğinizi ve modern .NET API'leriyle özel + akış oluşturmayı nasıl yapacağınızı gösterir. +og_title: Bellek akışı oluşturma C# – Tam Özelleştirilmiş Akış Kılavuzu +tags: +- stream +- csharp +- .net +- resource-handling +title: C#'ta bellek akışı oluşturma – Özel akış oluşturma rehberi +url: /tr/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Memory stream c# oluşturma – Özel akış oluşturma rehberi + +Hiç **create memory stream c#** oluşturmanız gerektiğinde hangi API'yi seçeceğinizden emin olmadınız mı? Tek başınıza değilsiniz. Birçok eski projede `IOutputStorage` bulabilirsiniz, yeni kod tabanları ise `ResourceHandler` tercih ediyor. Her iki durumda da amaç aynı: çerçevenizin tüketebileceği bir `Stream` üretmek. + +Bu öğreticide **how to create stream** nesnelerini, **how to handle resources** güvenli bir şekilde nasıl yöneteceğinizi öğrenecek ve kütüphanenin hem pre‑24.2 hem de 24.2+ sürümleri için **custom stream creation** konusunda uzmanlaşacaksınız. Sonunda, herhangi bir .NET çözümüne ekleyebileceğiniz çalışan bir örnek elde edeceksiniz—gizli referanslar yok, sadece saf C#. + +## Neler Öğreneceksiniz + +- Eski `IOutputStorage` deseninin modern `ResourceHandler` yaklaşımıyla net karşılaştırması. +- Tam, kopyala‑yapıştır hazır kod, .NET 6+ (veya ihtiyacınız varsa daha eski) üzerinde derlenebilir. +- Akışların dispose edilmesi, büyük yüklerin işlenmesi ve özel akışınızın test edilmesi gibi uç durumlar için ipuçları. + +> **Pro tip:** .NET 8 hedefliyorsanız, yeni `ResourceHandler` yerleşik async desteği sağlar, bu da yüksek verimli senaryolarda milisaniyeler kazandırabilir. + +--- + +## Memory stream c# Oluşturma – Eski yaklaşım (pre‑24.2) + +Kütüphanenin eski bir sürümünde takılı kaldığınızda, yerine getirmeniz gereken sözleşme `IOutputStorage`'dır. Arayüz yalnızca verilen bir kaynak adı için bir `Stream` döndüren bir metod ister. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Neden bu çalışır + +- **Interface contract** – Çerçeve, çıktı yazması gerektiğinde `CreateStream` metodunu çağırır. +- **Flexibility** – Bir `Stream` döndürdüğünüz için, daha sonra `MemoryStream`'i `FileStream` ile veya hatta özel bir tamponlu akışla değiştirebilir, kodun geri kalanına dokunmazsınız. +- **Resource safety** – Çağıran, döndürülen akışı dispose etmekten sorumludur; bu yüzden metod içinde `Dispose` çağırmayız. + +### Yaygın tuzaklar + +| Sorun | Ne olur | Çözüm | +|-------|----------|------| +| Kapalı bir akış döndürmek | Tüketiciler yazma sırasında `ObjectDisposedException` alır. | Akışı devrederken **açık** olduğundan emin olun. | +| Yazdıktan sonra `Position = 0` ayarlamayı unutmak | Veri daha sonra okunduğunda boş görünür. | Önceden doldurduysanız döndürmeden önce `stream.Seek(0, SeekOrigin.Begin)` çağırın. | +| Büyük dosyalar için dev bir `MemoryStream` kullanmak | Bellek yetersizliği çöküşlerine yol açar. | Geçici bir `FileStream` veya özel bir tamponlu akışa geçin. | + +--- + +## Memory stream c# Oluşturma – Modern yaklaşım (24.2+) + +24.2 sürümünden itibaren kütüphane `ResourceHandler`'ı tanıttı. Artık bir arayüz yerine bir temel sınıftan miras alıp tek bir metodu geçersiniz. Bu, daha temiz ve async‑uyumlu bir giriş noktası sağlar. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### `ResourceHandler` tercih edilme nedeni + +- **Async support** – `HandleResourceAsync` metodu, iş parçacıklarını engellemeden I/O yapmanıza olanak tanır. +- **Built‑in error handling** – Temel sınıf istisnaları yakalar ve çerçeveye özgü hata kodlarına dönüştürür. +- **Future‑proof** – Yeni sürümler, yalnızca handler deseninde çalışan kancalar (ör. logging, telemetry) ekler. + +### Uç‑durum yönetimi + +1. **Disposal** – Çerçeve, iş bittiğinde akışı dispose eder, ancak başka bir disposable (ör. `FileStream`) sarmalıyorsanız, metod içinde bir `using` bloğu uygulamalı ve `Dispose`'ı ileten bir sarmalayıcı döndürmelisiniz. +2. **Large payloads** – 100 MB'den büyük yükler bekliyorsanız, `MemoryStream` yerine geçici bir dosyaya işaret eden bir `FileStream` kullanın. Örnek: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – Temel sınıf DI'den hizmet alıyorsa, bir mock `IServiceProvider` enjekte ederek handler'ınızı birim‑test edin. `HandleResource`'un yazılabilir ve okunabilir bir akış döndürdüğünü doğrulayın. + +--- + +## Akış oluşturma – Hızlı bir kılavuz + +| Senaryo | Önerilen API | Örnek Kod | +|----------|----------------|-------------| +| Basit bellek içi veri | `MemoryStream` | `new MemoryStream()` | +| Büyük geçici dosyalar | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Ağ tabanlı kaynak | `NetworkStream` | `new NetworkStream(socket)` | +| Özel tamponlama | Derive from `Stream` | Özel akış uygulaması için [Microsoft docs] sayfasına bakın | + +> **Not:** Akışı döndürmeden önce her zaman `stream.Position = 0` ayarlayın; aksi takdirde sonraki okuyucular akışın boş olduğunu düşünecek. + +--- + +## Görsel açıklama + +![create memory stream c# sürecini gösteren diyagram](https://example.com/images/create-memory-stream-diagram.png) + +*Alt metin:* create memory stream c# sürecini gösteren diyagram + +--- + +## Tam Çalıştırılabilir Örnek + +Aşağıda, hem eski hem de modern yaklaşımları gösteren minimal bir konsol uygulaması bulunmaktadır. Bunu yeni bir .NET 6 konsol projesine kopyala‑yapıştırabilir ve olduğu gibi çalıştırabilirsiniz. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Beklenen çıktı** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +Program, **how to create stream**'in üç yolunu gösterir: eski `IOutputStorage`, yeni senkron `HandleResource` ve asenkron `HandleResourceAsync`. Üçü de bir `MemoryStream` döndürür, böylece hedeflediğiniz sürüm ne olursa olsun özel akış oluşturmanın çalıştığını kanıtlar. + +--- + +## Sıkça Sorulan Sorular (SSS) + +**S: Geri aldığım akışta `Dispose` çağırmam gerekiyor mu?** +C: Çerçeve (veya çağıran kodunuz) disposal'dan sorumludur. Döndürdüğünüz akış içinde başka bir disposable sarmalıyorsanız, `Dispose` çağrısını ilettiğinden emin olun. + +**S: Salt okunur bir akış döndürebilir miyim?** +C: Evet, ancak sözleşme genellikle yazılabilir bir akış bekler. Sadece okuma ihtiyacınız varsa, `CanWrite => false` uygulayın ve sınırlamayı belgeleyin. + +**S: Verilerim mevcut RAM'den daha büyük olursa ne olur?** +C: Geçici bir dosyaya dayalı bir `FileStream`'e geçin veya diske parçalar halinde yazan özel bir tamponlu akış uygulayın. + +**S: İki yaklaşım arasında performans farkı var mı?** +C: Modern `ResourceHandler` ekstra temel‑sınıf mantığı nedeniyle çok küçük bir ek yük getirir, ancak async versiyon yüksek eşzamanlılıkta throughput'u önemli ölçüde artırabilir. + +--- + +## Özet + +Artık **create memory stream c#**'i her açıdan ele aldık. Hem eski `IOutputStorage` desenini hem de yeni `ResourceHandler` sınıfını kullanarak **how to create stream**'i nasıl yapacağınızı biliyorsunuz, ayrıca **how to handle resources**'ı sorumlu bir şekilde yönetmek ve büyük dosyalar ya da async senaryolar için **custom stream creation** ile deseni genişletmek için pratik ipuçlarını gördünüz. + +Ready for + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/turkish/net/generate-jpg-and-png-images/_index.md b/html/turkish/net/generate-jpg-and-png-images/_index.md index 1c1cfbfa4..dad24f331 100644 --- a/html/turkish/net/generate-jpg-and-png-images/_index.md +++ b/html/turkish/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Aspose.HTML for .NET'i .NET projelerinize entegre etmek zahmetsizdir. Kütüphan Aspose.HTML for .NET kullanarak dinamik web sayfaları oluşturmayı öğrenin. Bu adım adım eğitim, ön koşulları, ad alanlarını ve HTML'yi resimlere dönüştürmeyi kapsar. ### [Aspose.HTML ile .NET'te ImageDevice ile PNG Görüntüleri Oluşturun](./generate-png-images-by-imagedevice/) HTML belgelerini düzenlemek, HTML'yi resimlere dönüştürmek ve daha fazlası için Aspose.HTML for .NET'i kullanmayı öğrenin. SSS'li adım adım eğitim. +### [DOCX'yi PNG/JPG'ye Dönüştürürken Antialiasing'i Etkinleştirme](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +DOCX belgelerini PNG veya JPG formatına dönüştürürken antialiasing'i etkinleştirerek daha net ve pürüzsüz görüntüler elde edin. ## Çözüm @@ -52,4 +54,4 @@ Sonuç olarak, Aspose.HTML for .NET, HTML içeriğinden JPG ve PNG görüntüler {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/turkish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/turkish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..f6ac0365b --- /dev/null +++ b/html/turkish/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,277 @@ +--- +category: general +date: 2025-12-27 +description: DOCX'i PNG veya JPG'ye dönüştürürken antialiasing'i nasıl etkinleştireceğinizi + öğrenin. Bu adım adım rehber, ayrıca docx'i PNG'ye ve docx'i JPG'ye dönüştürmeyi + de kapsar. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: tr +og_description: DOCX dosyalarını PNG veya JPG’ye dönüştürürken antialiasing’i nasıl + etkinleştirirsiniz. Pürüzsüz, yüksek kaliteli çıktı için bu kapsamlı rehberi izleyin. +og_title: DOCX'i PNG/JPG'ye Dönüştürürken Antialiasing'i Nasıl Etkinleştirirsiniz +tags: +- C# +- Document Rendering +- Image Processing +title: DOCX'i PNG/JPG'ye Dönüştürürken Antialiasing'i Nasıl Etkinleştirirsiniz +url: /tr/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# DOCX'i PNG/JPG'ye Dönüştürürken Antialiasing'i Nasıl Etkinleştirirsiniz + +Hiç **antialiasing'i nasıl etkinleştirirsiniz** diye merak ettiniz mi, böylece dönüştürdüğünüz DOCX görselleri keskin, pürüzsüz görünür? Tek başınıza değilsiniz. Birçok geliştirici, bir Word belgesini PNG ya da JPG'ye dönüştürmek zorunda kaldığında, çizgi ve metin kenarlarında bulanıklaşmış kenarlar elde eder. İyi haber? Birkaç satır C# kodu ile bu kaba çıktıyı piksel‑mükemmel grafiklere dönüştürebilirsiniz—üçüncü‑taraf görüntü düzenleyicilere ihtiyaç yok. + +Bu öğreticide **convert docx to png** ve **convert docx to jpg** işlemlerini modern bir render kütüphanesi kullanarak adım adım inceleyeceğiz. Sadece *docx nasıl dönüştürülür* öğrenmekle kalmayacak, aynı zamanda antialiasing ve hinting etkinleştirilmiş *docx nasıl render edilir* konusunu da öğreneceksiniz, böylece her eğri ve karakter yumuşak görünür. Grafik programlamada önceden deneyim gerekmez; sadece temel bir C# ortamı ve bir DOCX dosyası yeterli. + +--- + +## Gerekenler + +- **.NET 6+** (veya klasik çalışma zamanı tercih ediyorsanız **.NET Framework 4.6+**) +- Renderlamak istediğiniz bir **DOCX** dosyası (demo için `input` adlı klasöre koyun) +- **Aspose.Words for .NET** NuGet paketi (veya `Document`, `ImageRenderingOptions` ve `ImageDevice` sınıflarını sunan herhangi bir kütüphane). Paketi şu komutla kurun: + +```bash +dotnet add package Aspose.Words +``` + +Hepsi bu—ekstra görüntü‑işleme araçlarına gerek yok. + +--- + +## Adım 1: DOCX Belgesini Yükleyin (how to convert docx) + +İlk olarak kaynak dosyayı temsil eden bir `Document` nesnesine ihtiyacımız var. Bu, kütüphanenin okuyup manipüle edebileceği Word dosyanızın dijital versiyonu gibi düşünülebilir. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Neden önemli:** Belgeyi yüklemek, *how to render docx* için temeldir. Dosya okunamazsa sonraki adımlar çalışmaz, bu yüzden burada başlıyoruz. + +--- + +## Adım 2: Görüntü Render Ayarlarını Yapılandırın (enable antialiasing) + +Şimdi sihirli kısım—antialiasing ve hinting’i açma zamanı. Antialiasing, çapraz çizgilerde gördüğünüz pürüzlü kenarları yumuşatırken, hinting küçük metinlerin netliğini artırır. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Pro ipucu:** Çok büyük belgelerde performans artışı istiyorsanız `UseAntialiasing` özelliğini kapatabilirsiniz, ancak görsel kalite belirgin şekilde düşer. + +--- + +## Adım 3: Çıktı Formatını Seçin – PNG ya da JPG (convert docx to png / convert docx to jpg) + +`ImageDevice` sınıfı, renderlanan sayfaların nereye kaydedileceğini belirler. `ImageSaveOptions`’ı değiştirerek PNG (kayıpsız) ya da JPG (sıkıştırılmış) formatlarından birini seçebilirsiniz. Aşağıda iki ayrı cihaz oluşturuyoruz, böylece tek bir çalıştırmada her iki formatı da üretebilirsiniz. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Neden ikisi?** PNG, her pikseli korur ve tam sadakat gerektiğinde (ör. baskı) mükemmeldir. JPG ise görüntüyü sıkıştırır, web sitesinde daha hızlı yüklenmesini sağlar. + +--- + +## Adım 4: Belge Sayfalarını Görsellere Render Edin (how to render docx) + +Cihazlar hazır olduğunda, `Document`’i her sayfayı render etmeye yönlendiriyoruz. Kütüphane otomatik olarak tüm sayfalarda döngü yapar ve tanımladığımız adlandırma desenine göre kaydeder. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Kod çalıştırıldıktan sonra `output` klasöründe `page_0.png`, `page_1.png`, … ve `page_0.jpg`, `page_1.jpg` gibi dosyalar bulacaksınız. Her görüntüde antialiasing uygulanmış olacak, böylece çizgiler yumuşak ve metin kristal‑net olacaktır. + +--- + +## Adım 5: Sonucu Doğrulayın (expected output) + +Oluşturulan görüntülerden birini açın. Şunları görmelisiniz: + +- **Şekil ve grafiklerde yumuşak eğriler** (basamaklı artefakt yok). +- **Küçük punto boyutlarında bile keskin, okunabilir metin**, hinting sayesinde. +- **PNG ve JPG arasında tutarlı renkler** (JPG kaliteyi düşürürseniz hafif sıkıştırma artefaktları olabilir). + +Eğer bulanıklık fark ederseniz, `UseAntialiasing` değerinin `true` olduğundan ve kaynak DOCX’in düşük çözünürlüklü raster görseller içermediğinden emin olun. + +--- + +## Yaygın Sorular & Kenar Durumları + +### Tek bir sayfaya ihtiyacım olursa ne yapmalıyım? + +`PageInfo` aşırı yüklemesini kullanarak belirli bir sayfayı render edebilirsiniz: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Daha yüksek çözünürlük için DPI’yı (dots per inch) değiştirebilir miyim? + +Tabii ki. `ImageRenderingOptions` üzerindeki `Resolution` özelliğini ayarlayın: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +Daha yüksek DPI, daha büyük dosyalar demektir, ancak antialiasing etkisi daha belirgin olur. + +### Büyük DOCX dosyalarını bellek tükenmeden nasıl işleyebilirim? + +Sayfaları tek tek render edin ve her yinelemeden sonra cihazı serbest bırakın: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### BMP ya da TIFF gibi başka formatlara dönüştürmek mümkün mü? + +Evet—`SaveFormat.Png` veya `SaveFormat.Jpeg` yerine `SaveFormat.Bmp` ya da `SaveFormat.Tiff` kullanın. Aynı antialiasing ayarları geçerli olur. + +--- + +## Tam Çalışan Örnek (Kopyala‑Yapıştır Hazır) + +Aşağıda yeni bir console projesine ekleyebileceğiniz, tüm using ifadeleri, hata yönetimi ve açıklamaları içeren tam program yer alıyor. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Sonuç:** Derledikten sonra (`dotnet run`) `output` dizininde bir dizi PNG ve JPG dosyası göreceksiniz; her biri antialiasing uygulanmış olacak. + +--- + +## Sonuç + +**DOCX'i PNG ya da JPG'ye dönüştürürken antialiasing'i nasıl etkinleştirirsiniz** konusunu ele aldık, **convert docx to png**, **convert docx to jpg** adımlarını adım adım gösterdik ve hatta **how to render docx** için özelleştirilmiş ipuçlarına değindik. + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/vietnamese/net/advanced-features/_index.md b/html/vietnamese/net/advanced-features/_index.md index b9219d741..c896a5578 100644 --- a/html/vietnamese/net/advanced-features/_index.md +++ b/html/vietnamese/net/advanced-features/_index.md @@ -42,7 +42,8 @@ Chuyển đổi HTML sang PDF động với Aspose.HTML cho .NET. Tích hợp d Tìm hiểu cách chuyển đổi HTML sang PDF, XPS và hình ảnh bằng Aspose.HTML cho .NET. Hướng dẫn từng bước với các ví dụ về mã và câu hỏi thường gặp. ### [Sử dụng mẫu HTML trong .NET với Aspose.HTML](./using-html-templates/) Tìm hiểu cách sử dụng Aspose.HTML cho .NET để tạo tài liệu HTML động từ dữ liệu JSON. Khai thác sức mạnh của thao tác HTML trong các ứng dụng .NET của bạn. - +### [Tạo memory stream C# – Hướng dẫn tạo luồng tùy chỉnh](./create-memory-stream-c-custom-stream-creation-guide/) +Hướng dẫn chi tiết cách tạo memory stream trong C# bằng Aspose.HTML, bao gồm các bước thực hiện và ví dụ thực tế. ## Phần kết luận @@ -52,4 +53,4 @@ Aspose.HTML cho .NET mở ra cánh cửa đến một thế giới khả năng k {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/vietnamese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md b/html/vietnamese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md new file mode 100644 index 000000000..79a8f1f38 --- /dev/null +++ b/html/vietnamese/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/_index.md @@ -0,0 +1,279 @@ +--- +category: general +date: 2025-12-27 +description: Tạo memory stream C# nhanh chóng với hướng dẫn từng bước. Tìm hiểu cách + tạo stream, quản lý tài nguyên và triển khai tạo stream tùy chỉnh trong .NET. +draft: false +keywords: +- create memory stream c# +- how to create stream +- how to handle resources +- custom stream creation +language: vi +og_description: Tạo MemoryStream trong C# trong vài giây. Hướng dẫn này cho thấy cách + tạo stream, quản lý tài nguyên và xây dựng việc tạo stream tùy chỉnh với các API + .NET hiện đại. +og_title: Tạo memory stream C# – Hướng dẫn đầy đủ về Stream tùy chỉnh +tags: +- stream +- csharp +- .net +- resource-handling +title: Tạo memory stream C# – Hướng dẫn tạo stream tùy chỉnh +url: /vi/net/advanced-features/create-memory-stream-c-custom-stream-creation-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Tạo memory stream c# – Hướng dẫn tạo stream tùy chỉnh + +Bạn đã bao giờ cần **create memory stream c#** nhưng không chắc nên chọn API nào? Bạn không phải là người duy nhất. Trong nhiều dự án legacy, bạn sẽ thấy `IOutputStorage`, trong khi các codebase mới hơn ưu tiên `ResourceHandler`. Dù sao, mục tiêu vẫn giống nhau: tạo ra một `Stream` mà framework của bạn có thể sử dụng. + +Trong hướng dẫn này, bạn sẽ học **how to create stream** objects, **how to handle resources** một cách an toàn, và làm chủ **custom stream creation** cho cả các phiên bản trước‑24.2 và 24.2+ của thư viện. Kết thúc, bạn sẽ có một ví dụ hoạt động mà bạn có thể chèn vào bất kỳ giải pháp .NET nào—không có tham chiếu bí ẩn, chỉ C# thuần túy. + +## Bạn sẽ nhận được gì + +- So sánh rõ ràng giữa mẫu `IOutputStorage` legacy và cách tiếp cận `ResourceHandler` hiện đại. +- Mã hoàn chỉnh, sẵn sàng copy‑paste, biên dịch trên .NET 6+ (hoặc phiên bản cũ hơn, nếu bạn cần). +- Mẹo cho các trường hợp biên như việc giải phóng stream, xử lý payload lớn, và kiểm thử stream tùy chỉnh. + +> **Pro tip:** Nếu bạn đang nhắm tới .NET 8, `ResourceHandler` mới hơn cung cấp hỗ trợ async tích hợp, có thể giảm vài mili giây trong các kịch bản thông lượng cao. + +--- + +## Tạo memory stream c# – Cách tiếp cận Legacy (pre‑24.2) + +Khi bạn bị kẹt ở phiên bản cũ của thư viện, hợp đồng bạn phải đáp ứng là `IOutputStorage`. Giao diện chỉ yêu cầu một phương thức trả về `Stream` cho một tên tài nguyên nhất định. + +```csharp +using System; +using System.IO; + +// Step 1: Implement the old IOutputStorage contract. +public class MyStorage : IOutputStorage +{ + /// + /// Returns a stream for the requested resource name. + /// In a real app you might open a file, a network socket, + /// or generate data on the fly. + /// + /// Logical name of the resource. + /// A writable Stream instance. + public Stream CreateStream(string name) + { + // Custom stream creation logic. + // Here we simply return an in‑memory stream. + // You could also wrap a FileStream if you prefer. + return new MemoryStream(); + } +} +``` + +### Tại sao cách này hoạt động + +- **Interface contract** – Framework sẽ gọi `CreateStream` bất cứ khi nào cần ghi output. +- **Flexibility** – Vì bạn trả về một `Stream`, bạn có thể thay `MemoryStream` bằng `FileStream` hoặc thậm chí một stream bộ đệm tùy chỉnh sau này mà không cần chạm vào phần còn lại của mã. +- **Resource safety** – Người gọi chịu trách nhiệm giải phóng stream trả về, vì vậy chúng ta không gọi `Dispose` bên trong phương thức. + +### Những sai lầm thường gặp + +| Issue | What happens | Fix | +|-------|--------------|-----| +| Trả về stream đã đóng | Người tiêu dùng sẽ nhận `ObjectDisposedException` khi ghi. | Đảm bảo stream **mở** khi bạn chuyển giao. | +| Quên đặt `Position = 0` sau khi ghi | Dữ liệu xuất hiện trống khi đọc sau. | Gọi `stream.Seek(0, SeekOrigin.Begin)` trước khi trả về nếu bạn đã điền trước. | +| Sử dụng `MemoryStream` lớn cho các tệp lớn | Sập do hết bộ nhớ. | Chuyển sang `FileStream` tạm thời hoặc một stream bộ đệm tùy chỉnh. | + +--- + +## Tạo memory stream c# – Cách tiếp cận Modern (24.2+) + +Bắt đầu từ phiên bản 24.2, thư viện đã giới thiệu `ResourceHandler`. Thay vì một giao diện, bạn bây giờ kế thừa từ một lớp cơ sở và ghi đè một phương thức duy nhất. Điều này cung cấp cho bạn một điểm vào sạch hơn, thân thiện với async. + +```csharp +using System; +using System.IO; + +// Step 2: Inherit from the new ResourceHandler base class. +public class MyHandler : ResourceHandler +{ + /// + /// Called by the framework to obtain a stream for a resource. + /// + /// The logical name of the resource. + /// A writable Stream instance. + public override Stream HandleResource(string name) + { + // Your custom stream creation logic goes here. + // For demonstration we use a MemoryStream. + return new MemoryStream(); + } + + // Optional async version (available in 24.2+) + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + // Simulate async work, e.g., fetching data from a service. + await Task.Delay(10, ct); + return new MemoryStream(); + } +} +``` + +### Tại sao nên ưu tiên `ResourceHandler` + +- **Async support** – Phương thức `HandleResourceAsync` cho phép bạn thực hiện I/O mà không chặn các luồng. +- **Built‑in error handling** – Lớp cơ sở bắt các ngoại lệ và chuyển chúng thành mã lỗi riêng của framework. +- **Future‑proof** – Các phiên bản mới hơn thêm các hook (ví dụ: logging, telemetry) chỉ hoạt động với mẫu handler. + +### Xử lý các trường hợp biên + +1. **Disposal** – Framework sẽ giải phóng stream sau khi hoàn thành, nhưng nếu bạn bọc một đối tượng disposable khác (như `FileStream`) bạn nên triển khai một khối `using` bên trong phương thức và trả về một wrapper chuyển tiếp `Dispose`. +2. **Large payloads** – Nếu bạn dự đoán payload > 100 MB, thay `MemoryStream` bằng `FileStream` trỏ tới một tệp tạm. Ví dụ: + + ```csharp + return new FileStream(Path.GetTempFileName(), + FileMode.Create, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 81920, + useAsync: true); + ``` + +3. **Testing** – Kiểm thử đơn vị handler của bạn bằng cách tiêm một mock `IServiceProvider` nếu lớp cơ sở lấy dịch vụ từ DI. Xác minh rằng `HandleResource` trả về một stream có thể ghi và đọc. + +--- + +## Cách tạo stream – Bảng cheat sheet nhanh + +| Scenario | Recommended API | Sample Code | +|----------|----------------|-------------| +| Dữ liệu trong bộ nhớ đơn giản | `MemoryStream` | `new MemoryStream()` | +| Tệp tạm thời lớn | `FileStream` (temp) | `new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, true)` | +| Nguồn dựa trên mạng | `NetworkStream` | `new NetworkStream(socket)` | +| Bộ đệm tùy chỉnh | Derive from `Stream` | Xem [Microsoft docs] để biết cách triển khai stream tùy chỉnh | + +> **Note:** Luôn đặt `stream.Position = 0` trước khi trả về nếu bạn đã điền trước stream; nếu không, các trình đọc phía dưới sẽ nghĩ stream là trống. + +--- + +## Minh họa hình ảnh + +![Diagram showing create memory stream c# process](https://example.com/images/create-memory-stream-diagram.png) + +*Alt text:* sơ đồ mô tả quy trình tạo memory stream c# + +--- + +## Ví dụ chạy đầy đủ + +Dưới đây là một ứng dụng console tối thiểu minh họa cả hai cách tiếp cận legacy và modern. Bạn có thể copy‑paste nó vào một dự án console .NET 6 mới và chạy ngay. + +```csharp +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +// ------------------------------------------------- +// Legacy implementation (pre‑24.2) +// ------------------------------------------------- +public class MyStorage : IOutputStorage +{ + public Stream CreateStream(string name) => new MemoryStream(); +} + +// ------------------------------------------------- +// Modern implementation (24.2+) +// ------------------------------------------------- +public class MyHandler : ResourceHandler +{ + public override Stream HandleResource(string name) => new MemoryStream(); + + public override async Task HandleResourceAsync(string name, CancellationToken ct = default) + { + await Task.Delay(10, ct); // simulate async work + return new MemoryStream(); + } +} + +// ------------------------------------------------- +// Demo program +// ------------------------------------------------- +class Program +{ + static async Task Main() + { + // Legacy usage + IOutputStorage legacy = new MyStorage(); + using (var legacyStream = legacy.CreateStream("legacy")) + using (var writer = new StreamWriter(legacyStream)) + { + writer.Write("Hello from legacy API!"); + writer.Flush(); + legacyStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(legacyStream).ReadToEnd()); + } + + // Modern sync usage + var handler = new MyHandler(); + using (var modernStream = handler.HandleResource("modern")) + using (var writer = new StreamWriter(modernStream)) + { + writer.Write("Hello from modern API!"); + writer.Flush(); + modernStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(new StreamReader(modernStream).ReadToEnd()); + } + + // Modern async usage + using (var asyncStream = await handler.HandleResourceAsync("async")) + using (var writer = new StreamWriter(asyncStream)) + { + await writer.WriteAsync("Hello from async API!"); + await writer.FlushAsync(); + asyncStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine(await new StreamReader(asyncStream).ReadToEndAsync()); + } + } +} +``` + +**Kết quả mong đợi** + +``` +Hello from legacy API! +Hello from modern API! +Hello from async API! +``` + +Chương trình hiển thị ba cách để **how to create stream**: `IOutputStorage` cũ, `HandleResource` đồng bộ mới, và `HandleResourceAsync` bất đồng bộ. Cả ba đều trả về một `MemoryStream`, chứng minh rằng việc tạo stream tùy chỉnh hoạt động bất kể bạn nhắm tới phiên bản nào. + +--- + +## Câu hỏi thường gặp (FAQ) + +**Q: Tôi có cần gọi `Dispose` trên stream mà tôi nhận được không?** +A: Framework (hoặc mã gọi của bạn) chịu trách nhiệm giải phóng. Nếu bạn bọc một đối tượng disposable khác bên trong stream trả về, hãy chắc chắn nó truyền gọi `Dispose`. + +**Q: Tôi có thể trả về một stream chỉ đọc không?** +A: Có, nhưng hợp đồng thường mong đợi một stream có thể ghi. Nếu bạn chỉ cần đọc, triển khai `CanWrite => false` và ghi chú giới hạn. + +**Q: Nếu dữ liệu của tôi lớn hơn RAM có sẵn thì sao?** +A: Chuyển sang `FileStream` dựa trên tệp tạm thời, hoặc triển khai một stream bộ đệm tùy chỉnh ghi vào đĩa theo từng khối. + +**Q: Có sự khác biệt về hiệu năng giữa hai cách tiếp cận không?** +A: `ResourceHandler` hiện đại thêm một chút overhead cho logic lớp cơ sở, nhưng phiên bản async có thể cải thiện đáng kể thông lượng trong môi trường đồng thời cao. + +--- + +## Kết luận + +Chúng tôi vừa đề cập đến **create memory stream c#** từ mọi góc độ bạn có thể gặp trong thực tế. Bây giờ bạn biết **how to create stream** bằng cả mẫu `IOutputStorage` legacy và lớp `ResourceHandler` mới hơn, cùng với các mẹo thực tế về **how to handle resources** một cách có trách nhiệm và mở rộng mẫu với **custom stream creation** cho các tệp lớn hoặc kịch bản async. + +Sẵn sàng cho + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/vietnamese/net/generate-jpg-and-png-images/_index.md b/html/vietnamese/net/generate-jpg-and-png-images/_index.md index a600ee56d..4b3573958 100644 --- a/html/vietnamese/net/generate-jpg-and-png-images/_index.md +++ b/html/vietnamese/net/generate-jpg-and-png-images/_index.md @@ -41,6 +41,8 @@ Tích hợp Aspose.HTML cho .NET vào các dự án .NET của bạn thật dễ Tìm hiểu cách tạo trang web động bằng Aspose.HTML cho .NET. Hướng dẫn từng bước này bao gồm các điều kiện tiên quyết, không gian tên và kết xuất HTML thành hình ảnh. ### [Tạo hình ảnh PNG bằng ImageDevice trong .NET với Aspose.HTML](./generate-png-images-by-imagedevice/) Học cách sử dụng Aspose.HTML cho .NET để thao tác với các tài liệu HTML, chuyển đổi HTML thành hình ảnh và nhiều hơn nữa. Hướng dẫn từng bước có Câu hỏi thường gặp. +### [Cách bật khử răng cưa khi chuyển đổi DOCX sang PNG/JPG](./how-to-enable-antialiasing-when-converting-docx-to-png-jpg/) +Hướng dẫn chi tiết cách bật khử răng cưa để cải thiện chất lượng hình ảnh khi chuyển đổi tài liệu DOCX sang PNG hoặc JPG bằng Aspose.HTML. ## Phần kết luận @@ -52,4 +54,4 @@ Vậy thì còn chần chừ gì nữa? Hãy bắt đầu khám phá thế giớ {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/vietnamese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md b/html/vietnamese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md new file mode 100644 index 000000000..2958ab3b6 --- /dev/null +++ b/html/vietnamese/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/_index.md @@ -0,0 +1,277 @@ +--- +category: general +date: 2025-12-27 +description: Tìm hiểu cách bật khử răng cưa khi chuyển đổi DOCX sang PNG hoặc JPG. + Hướng dẫn từng bước này cũng bao gồm cách chuyển DOCX sang PNG và chuyển DOCX sang + JPG. +draft: false +keywords: +- how to enable antialiasing +- convert docx to png +- convert docx to jpg +- how to convert docx +- how to render docx +language: vi +og_description: Cách bật khử răng cưa khi chuyển đổi tệp DOCX sang PNG hoặc JPG. Hãy + theo dõi hướng dẫn đầy đủ này để có kết quả mượt mà, chất lượng cao. +og_title: Cách bật khử răng cưa khi chuyển DOCX sang PNG/JPG +tags: +- C# +- Document Rendering +- Image Processing +title: Cách bật khử răng cưa khi chuyển đổi DOCX sang PNG/JPG +url: /vi/net/generate-jpg-and-png-images/how-to-enable-antialiasing-when-converting-docx-to-png-jpg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cách Bật Antialiasing Khi Chuyển DOCX Sang PNG/JPG + +Bạn đã bao giờ tự hỏi **cách bật antialiasing** để hình ảnh DOCX đã chuyển đổi trông sắc nét thay vì răng cưa chưa? Bạn không phải là người duy nhất. Nhiều nhà phát triển gặp khó khăn khi cần chuyển một tài liệu Word sang PNG hoặc JPG và kết quả lại có các cạnh mờ nhạt trên đường nét và văn bản. Tin tốt là gì? Chỉ với vài dòng C# bạn có thể biến đầu ra thô thành đồ họa pixel‑perfect—không cần phần mềm chỉnh sửa ảnh bên thứ ba. + +Trong hướng dẫn này, chúng ta sẽ đi qua toàn bộ quy trình **convert docx to png** và **convert docx to jpg** bằng một thư viện render hiện đại. Bạn sẽ học không chỉ *cách chuyển docx* mà còn *cách render docx* với antialiasing và hinting được bật, để mọi đường cong và ký tự đều mượt mà. Không cần kinh nghiệm lập trình đồ họa trước; chỉ cần một môi trường C# cơ bản và một file DOCX bạn muốn chuyển thành ảnh. + +--- + +## Những Gì Bạn Cần Chuẩn Bị + +- **.NET 6+** (hoặc .NET Framework 4.6+ nếu bạn thích runtime cổ điển) +- Một file **DOCX** mà bạn muốn render (đặt nó trong thư mục có tên `input` cho bản demo) +- Gói NuGet **Aspose.Words for .NET** (hoặc bất kỳ thư viện nào cung cấp `Document`, `ImageRenderingOptions`, và `ImageDevice`). Cài đặt bằng lệnh: + +```bash +dotnet add package Aspose.Words +``` + +Thế là xong—không cần công cụ xử lý ảnh bổ sung. + +--- + +## Bước 1: Tải Tài Liệu DOCX (how to convert docx) + +Đầu tiên chúng ta cần một đối tượng `Document` đại diện cho file nguồn. Hãy nghĩ nó như phiên bản số của file Word mà thư viện có thể đọc và thao tác. + +```csharp +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +// Load the DOCX you want to render +Document sourceDoc = new Document("input/input.docx"); +``` + +> **Tại sao lại quan trọng:** Việc tải tài liệu là nền tảng cho *how to render docx*. Nếu file không thể đọc được, các bước sau sẽ không hoạt động, vì vậy chúng ta bắt đầu từ đây. + +--- + +## Bước 2: Cấu Hình Image Rendering Options (enable antialiasing) + +Bây giờ là phần “ma thuật” — bật antialiasing và hinting. Antialiasing làm mượt các cạnh răng cưa trên các đường chéo, trong khi hinting cải thiện độ rõ nét của văn bản nhỏ. + +```csharp +// Set up rendering options with antialiasing and hinting +ImageRenderingOptions renderingOptions = new ImageRenderingOptions +{ + UseAntialiasing = true, // <‑‑ smooth graphics + Text = { UseHinting = true } // <‑‑ sharper text +}; +``` + +> **Mẹo chuyên nghiệp:** Nếu bạn cần tăng hiệu năng trên các tài liệu lớn, có thể tắt `UseAntialiasing`, nhưng chất lượng hình ảnh sẽ giảm đáng kể. + +--- + +## Bước 3: Chọn Định Dạng Đầu Ra – PNG hoặc JPG (convert docx to png / convert docx to jpg) + +Lớp `ImageDevice` quyết định nơi các trang đã render sẽ được lưu. Bằng cách hoán đổi `ImageSaveOptions` bạn có thể xuất ra PNG (không mất dữ liệu) hoặc JPG (nén). Dưới đây chúng ta tạo hai thiết bị riêng biệt để bạn có thể tạo cả hai định dạng trong một lần chạy. + +```csharp +// PNG device – lossless, ideal for screenshots or further editing +ImageDevice pngDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = "output/page_{0}.png" // {0} will be replaced by page number + } +}; + +// JPG device – smaller file size, good for web thumbnails +ImageDevice jpgDevice = new ImageDevice(renderingOptions) +{ + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = "output/page_{0}.jpg", + JpegQuality = 90 // 0‑100, higher = better quality + } +}; +``` + +> **Tại sao cần cả hai?** PNG giữ nguyên mọi pixel, rất phù hợp khi bạn cần độ trung thực cao (ví dụ: in ấn). JPG ngược lại, nén ảnh, giúp tải nhanh hơn trên website. + +--- + +## Bước 4: Render Các Trang Tài Liệu Thành Ảnh (how to render docx) + +Với các thiết bị đã sẵn sàng, chúng ta yêu cầu `Document` render từng trang. Thư viện sẽ tự động lặp qua tất cả các trang và lưu chúng theo mẫu đặt tên mà chúng ta đã định nghĩa. + +```csharp +// Render to PNG +sourceDoc.RenderTo(pngDevice); + +// Render to JPG +sourceDoc.RenderTo(jpgDevice); +``` + +Sau khi chạy code, bạn sẽ thấy một loạt file như `page_0.png`, `page_1.png`, … và `page_0.jpg`, `page_1.jpg` trong thư mục `output`. Mỗi ảnh sẽ có antialiasing được áp dụng, nên các đường nét mượt mà và văn bản rõ ràng như pha lê. + +--- + +## Bước 5: Kiểm Tra Kết Quả (expected output) + +Mở bất kỳ ảnh nào đã tạo. Bạn sẽ thấy: + +- **Đường cong mượt** trên các hình dạng và biểu đồ (không có hiện tượng “bậc thang”). +- **Văn bản sắc nét, dễ đọc** ngay cả ở kích thước phông chữ nhỏ, nhờ hinting. +- **Màu sắc đồng nhất** giữa PNG và JPG (mặc dù JPG có thể có một chút hiện tượng nén nếu bạn giảm chất lượng). + +Nếu bạn thấy bất kỳ hiện tượng mờ nào, hãy kiểm tra lại rằng `UseAntialiasing` được đặt thành `true` và file DOCX nguồn không chứa ảnh raster độ phân giải thấp. + +--- + +## Các Câu Hỏi Thường Gặp & Trường Hợp Đặc Biệt + +### Nếu tôi chỉ cần một trang duy nhất thì sao? + +Bạn có thể render một trang cụ thể bằng cách sử dụng overload `PageInfo`: + +```csharp +// Render only the first page to PNG +sourceDoc.RenderTo(pngDevice, new PageInfo(0)); +``` + +### Có thể thay đổi DPI (dots per inch) để có đầu ra độ phân giải cao hơn không? + +Chắc chắn rồi. Điều chỉnh thuộc tính `Resolution` trên `ImageRenderingOptions`: + +```csharp +renderingOptions.Resolution = 300; // 300 DPI for print‑quality images +``` + +DPI cao hơn đồng nghĩa với file lớn hơn, nhưng hiệu ứng antialiasing sẽ còn rõ rệt hơn. + +### Làm sao xử lý các file DOCX lớn mà không bị hết bộ nhớ? + +Render từng trang một và giải phóng thiết bị sau mỗi vòng lặp: + +```csharp +for (int i = 0; i < sourceDoc.PageCount; i++) +{ + using var singlePageDevice = new ImageDevice(renderingOptions); + singlePageDevice.SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = $"output/page_{i}.png" + }; + sourceDoc.RenderTo(singlePageDevice, new PageInfo(i)); +} +``` + +### Có thể chuyển đổi sang các định dạng khác như BMP hoặc TIFF không? + +Có—chỉ cần hoán đổi `SaveFormat.Png` hoặc `SaveFormat.Jpeg` thành `SaveFormat.Bmp` hoặc `SaveFormat.Tiff`. Các cài đặt antialiasing vẫn được áp dụng. + +--- + +## Ví Dụ Hoàn Chỉnh (Sẵn Sàng Sao Chép‑Dán) + +Dưới đây là chương trình đầy đủ mà bạn có thể đặt vào một dự án console mới. Nó bao gồm tất cả các câu lệnh `using`, xử lý lỗi, và chú thích để dễ hiểu. + +```csharp +// File: Program.cs +using System; +using System.IO; +using Aspose.Words; +using Aspose.Words.Rendering; +using Aspose.Words.Saving; + +class Program +{ + static void Main() + { + // ------------------------------------------------- + // 1️⃣ Load the DOCX document (how to convert docx) + // ------------------------------------------------- + string inputPath = Path.Combine("input", "input.docx"); + if (!File.Exists(inputPath)) + { + Console.WriteLine($"❗ Input file not found: {inputPath}"); + return; + } + + Document sourceDoc = new Document(inputPath); + + // ------------------------------------------------- + // 2️⃣ Configure rendering options (enable antialiasing) + // ------------------------------------------------- + ImageRenderingOptions renderingOptions = new ImageRenderingOptions + { + UseAntialiasing = true, + Text = { UseHinting = true }, + Resolution = 150 // optional – 150 DPI is a good balance + }; + + // ------------------------------------------------- + // 3️⃣ Set up PNG and JPG devices (convert docx to png / convert docx to jpg) + // ------------------------------------------------- + string outputFolder = "output"; + Directory.CreateDirectory(outputFolder); + + // PNG (lossless) + ImageDevice pngDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Png) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.png") + } + }; + + // JPG (compressed) + ImageDevice jpgDevice = new ImageDevice(renderingOptions) + { + SaveOptions = new ImageSaveOptions(SaveFormat.Jpeg) + { + OutputFileName = Path.Combine(outputFolder, "page_{0}.jpg"), + JpegQuality = 90 + } + }; + + // ------------------------------------------------- + // 4️⃣ Render all pages (how to render docx) + // ------------------------------------------------- + try + { + sourceDoc.RenderTo(pngDevice); + sourceDoc.RenderTo(jpgDevice); + Console.WriteLine($"✅ Rendering complete! Check the '{outputFolder}' folder."); + } + catch (Exception ex) + { + Console.WriteLine($"❌ An error occurred: {ex.Message}"); + } + } +} +``` + +> **Kết quả:** Sau khi biên dịch (`dotnet run`) bạn sẽ thấy một loạt file PNG và JPG trong thư mục `output`, mỗi file đều có antialiasing được áp dụng. + +--- + +## Kết Luận + +Chúng ta đã tìm hiểu **cách bật antialiasing** khi **chuyển DOCX sang PNG hoặc JPG**, đi qua các bước cụ thể để **convert docx to png**, **convert docx to jpg**, và thậm chí đề cập tới **how to render docx** cho các nhu cầu tùy chỉnh. + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file