Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 88 additions & 50 deletions content/arabic/_index.md

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,6 @@ weight: 1

أضف التكوين التالي إلى ملف `pom.xml` الخاص بك:

```xml
```xml
<repositories>
<repository>
Expand All @@ -151,7 +150,6 @@ weight: 1
</dependency>
</dependencies>
```
```

### فهم متطلبات الترخيص

Expand All @@ -167,14 +165,12 @@ weight: 1

فئة `Annotator` هي نقطة الدخول لجميع عمليات التوضيح. تقوم بتحميل المستند، توفر واجهات برمجة التطبيقات للتعديل، وتكتب النتيجة مرة أخرى إلى القرص.

```java
```java
import com.groupdocs.annotation.Annotator;

// Initialize annotator with the input file path
final Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf");
```
```

**نصيحة احترافية:** ضع كائن `Annotator` داخل كتلة try‑with‑resources أو استدعِ `dispose()` صراحة لتجنب تسرب الذاكرة الأصلية.

Expand All @@ -186,7 +182,6 @@ final Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf");

تتيح الردود للمساهمين إرفاق تعليقات مباشرة بالقياس، مما يحول المسطرة البسيطة إلى سلسلة مناقشة.

```java
```java
import com.groupdocs.annotation.models.Reply;
import java.util.ArrayList;
Expand All @@ -204,7 +199,6 @@ ArrayList<Reply> replies = new ArrayList<>();
replies.add(reply1);
replies.add(reply2);
```
```

**متى تستخدم الردود:** في دورات المراجعة متعددة المستخدمين، عندما تحتاج إلى شرح سبب اختيار البُعد أو طلب توضيح من زميل.

Expand All @@ -214,7 +208,6 @@ replies.add(reply2);

`Rectangle` يحدد الصندوق المحيط بالتوضيح على الصفحة. `PenStyle` يعدد أنماط الخط مثل الصلب، المتقطع، والنقطة.

```java
```java
import com.groupdocs.annotation.models.Rectangle;
import com.groupdocs.annotation.models.PenStyle;
Expand All @@ -232,7 +225,6 @@ distance.setPenWidth((byte) 3);

distance.setReplies(replies); // Attach replies
```
```

**خيارات التكوين الأساسية**
- `setBox()` – يحدد المستطيل المحيط بالتوضيح على الصفحة.
Expand All @@ -245,21 +237,18 @@ distance.setReplies(replies); // Attach replies

بمجرد أن يصبح التوضيح جاهزًا، أضفه إلى المستند واحفظ التغييرات.

```java
```java
annotator.add(distance);
annotator.save("YOUR_OUTPUT_DIRECTORY/output.pdf");
annotator.dispose();
```
```

**مهم:** دائمًا استدعِ `dispose()` بعد الحفظ، خاصةً عند معالجة العديد من المستندات في مهمة دفعة.

## مثال عملي كامل

بدمج كل شيء معًا، إليك مثالًا كاملاً من البداية إلى النهاية يقوم بتحميل ملف PDF، إضافة توضيح مسافة، وحفظ النتيجة.

```java
```java
import com.groupdocs.annotation.Annotator;
import com.groupdocs.annotation.models.Reply;
Expand Down Expand Up @@ -302,7 +291,6 @@ public class DistanceAnnotationExample {
}
}
```
```

شغّل المقتطف، افتح ملف الإخراج في أي عارض PDF يدعم التوضيحات، وسترى مسطرة تعمل بالكامل جاهزة للتفاعل.

Expand Down Expand Up @@ -338,27 +326,23 @@ public class DistanceAnnotationExample {
**الأعراض:** يتم رمي استثناء عند إنشاء `Annotator`.
**الحل:** استخدم مسارًا مطلقًا أثناء التطوير، تحقق من وجود الملف، وتأكد من أن العملية لديها أذونات القراءة.

```java
```java
// Better path handling
String inputPath = new File("documents/input.pdf").getAbsolutePath();
final Annotator annotator = new Annotator(inputPath);
```
```

### المشكلة: عدم ظهور التوضيح
**الأعراض:** الشيفرة تعمل بدون أخطاء، لكن لا تظهر أي مسطرة.
**الأسباب الشائعة:** فهرس صفحة خاطئ (تذكر أن الصفحات تبدأ من 0)، وضع التوضيح خارج مساحة العرض المرئية، أو ضبط الشفافية منخفضًا جدًا.

**إصلاحات سريعة:**

```java
```java
distance.setPageNumber(0); // First page
distance.setOpacity(1.0); // Fully opaque
distance.setBox(new Rectangle(50, 50, 200, 30)); // Visible position
```
```

### المشكلة: مشاكل الذاكرة مع المستندات الكبيرة
**الأعراض:** `OutOfMemoryError` أو أداء بطيء على ملفات مئات الصفحات.
Expand All @@ -367,14 +351,12 @@ distance.setBox(new Rectangle(50, 50, 200, 30)); // Visible position
- عالج المستندات بشكل متسلسل بدلاً من تحميلها جميعًا مرة واحدة.
- زد حجم ذاكرة JVM (`-Xmx4g` أو أعلى) للمدخلات الكبيرة جدًا.

```java
```java
// Good practice - use try-with-resources
try (Annotator annotator = new Annotator("large-document.pdf")) {
// Your annotation code here
} // Automatic disposal
```
```

### المشكلة: أخطاء متعلقة بالترخيص
**الأعراض:** تحذيرات حول قيود النسخة التجريبية أو فشل التحقق من الترخيص.
Expand All @@ -400,7 +382,6 @@ try (Annotator annotator = new Annotator("large-document.pdf")) {
### اعتبارات المعالجة المتزامنة
إذا كانت خدمتك تعالج العديد من الملفات بشكل متوازي، اتبع هذه القواعد:

```java
```java
// Example of efficient batch processing
public void processMultipleDocuments(List<String> filePaths) {
Expand All @@ -415,7 +396,6 @@ public void processMultipleDocuments(List<String> filePaths) {
}
}
```
```

- كل خيط يجب أن ينشئ نسخة خاصة به من `Annotator`.
- استخدم مجموعة خيوط محدودة لتجنب استنزاف موارد النظام.
Expand All @@ -427,7 +407,6 @@ public void processMultipleDocuments(List<String> filePaths) {

### خيارات التنسيق المخصص
```java
```java
// Advanced pen styling
distance.setPenStyle(PenStyle.DASH_DOT);
distance.setPenWidth((byte) 4);
Expand All @@ -438,24 +417,20 @@ distance.setOpacity(0.6); // Subtle background measurements
// vs
distance.setOpacity(1.0); // Prominent foreground measurements
```
```

يمكنك تعريف كائن `Pen` مخصص، تطبيق تعبئة متدرجة، أو حتى تضمين علامات SVG في نهايات خط المسطرة.

### التحديد الديناميكي للموقع
```java
```java
// Calculate position based on document dimensions or content
Rectangle dynamicBox = calculateOptimalPosition(documentWidth, documentHeight);
distance.setBox(dynamicBox);
```
```

استفد من الإحداثيات النسبية للصفحة بحيث يعيد التوضيح تحديد موقعه تلقائيًا عند تكبير أو تدوير المستند.

### توضيحات شرطية
```java
```java
// Add annotations based on document content or user preferences
if (document.getType() == DocumentType.ARCHITECTURAL_PLAN) {
distance.setMessage("Room dimension");
Expand All @@ -465,7 +440,6 @@ if (document.getType() == DocumentType.ARCHITECTURAL_PLAN) {
distance.setPenStyle(PenStyle.DOT);
}
```
```

أضف منطقًا ينشئ توضيح مسافة فقط عندما يتحقق شرط معين (مثلاً، عندما يتجاوز مكون ما حد التحمل).

Expand All @@ -476,7 +450,6 @@ if (document.getType() == DocumentType.ARCHITECTURAL_PLAN) {
### التكامل مع قاعدة البيانات
`AnnotationRecord` هو نموذج بيانات مخصص لحفظ بيانات توضيحات في قاعدة البيانات.

```java
```java
// Save annotation details to database
AnnotationRecord record = new AnnotationRecord();
Expand All @@ -485,14 +458,12 @@ record.setAnnotationType("distance");
record.setMeasurement(distance.getMessage());
record.setCreatedDate(distance.getCreatedOn());
```
```

احفظ بيانات توضيحات (المؤلف، الطابع الزمني، قيمة القياس) في قاعدة بيانات علائقية للتقارير والبحث.

### التكامل مع تطبيقات الويب
`DistanceAnnotationRequest` هو كائن نقل بيانات (DTO) يحمل معلمات التوضيح من العميل إلى الخادم.

```java
```java
@PostMapping("/documents/{id}/annotations/distance")
public ResponseEntity<String> addDistanceAnnotation(
Expand All @@ -502,20 +473,17 @@ public ResponseEntity<String> addDistanceAnnotation(
// Return success/failure response
}
```
```

اعرض نقطة نهاية REST تستقبل ملفًا، تضيف توضيح مسافة بناءً على حمولة JSON، وتعيد المستند الموضح.

### التكامل مع التخزين السحابي
```java
```java
// Download from cloud, process, upload result
byte[] documentBytes = cloudStorageService.download(documentPath);
// Process with GroupDocs.Annotation
byte[] annotatedDocument = processAnnotations(documentBytes);
cloudStorageService.upload(outputPath, annotatedDocument);
```
```

اقرأ واكتب الملفات مباشرةً من AWS S3، Azure Blob Storage، أو Google Cloud Storage باستخدام SDKs الخاصة بها، ثم مرّر التدفقات إلى `Annotator`.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,12 @@ GroupDocs.Annotation هي مكتبة .NET تمكّنك من إضافة، تعد
```bash
Install-Package GroupDocs.Annotation -Version 25.4.0
```
```

### الخيار ب: .NET CLI
```text
```bash
dotnet add package GroupDocs.Annotation --version 25.4.0
```
```

### الخيار ج: واجهة Visual Studio
1. انقر بزر الماوس الأيمن على المشروع → **Manage NuGet Packages**
Expand All @@ -105,7 +103,6 @@ dotnet add package GroupDocs.Annotation --version 25.4.0
// Free trial - no license needed initially
Annotator annotator = new Annotator("input.pdf");
```
```

### ترخيص الإنتاج
```text
Expand All @@ -114,7 +111,6 @@ Annotator annotator = new Annotator("input.pdf");
License license = new License();
license.SetLicense("path/to/your/license.lic");
```
```

**نصيحة احترافية:** اطلب [ترخيص مؤقت](https://purchase.groupdocs.com/temporary-license) لتقييم ممتد بدون علامات مائية.

Expand All @@ -128,7 +124,6 @@ using GroupDocs.Annotation;
// This should compile without errors
Annotator annotator = new Annotator("test.pdf");
```
```

إذا تم تجميع الكود وتشغيله، فإن بيئتك جاهزة للخطوات التالية.

Expand All @@ -144,7 +139,6 @@ HttpClient هي فئة .NET تُستخدم لإرسال طلبات HTTP واست
string url = "https://github.com/groupdocs-annotation/GroupDocs.Annotation-for-.NET/blob/master/Examples/Resources/SampleFiles/input.pdf?raw=true";
WebRequest request = WebRequest.Create(url);
```
```

- استخدم URL الملف المباشر (مثلاً أضف `?raw=true` لملفات GitHub الخام).
- إذا كان الطرف يتطلب مصادقة، أضف الرؤوس المناسبة أو رمز الحامل (Bearer token).
Expand All @@ -167,7 +161,6 @@ private static Stream GetFileStream(WebResponse response)
return fileStream;
}
```
```

- `MemoryStream` يحتفظ بـ PDF في الذاكرة، مما يمنح GroupDocs إمكانية قراءة عشوائية سريعة.
- إعادة ضبط `Position = 0` يضمن أن الـ annotator يقرأ من البداية.
Expand Down Expand Up @@ -196,7 +189,6 @@ using (Annotator annotator = new Annotator(GetRemoteFile("YOUR_DOCUMENT_DIRECTOR
// Proceed with annotation steps
}
```
```

#### ضبط تفاصيل التعليق
```text
Expand All @@ -209,7 +201,6 @@ AreaAnnotation area = new AreaAnnotation()

annotator.Add(area); // Add annotation to the document
```
```

- `Box` يحدد المستطيل بالنقاط (1 pt ≈ 1/72 in).
- `BackgroundColor` بقيمة `65535` ينتج تظليل أصفر ساطع.
Expand All @@ -232,7 +223,6 @@ Annotator.Save هي طريقة تكتب المستند المعدل، بما ف
string outputPath = Path.Combine("YOUR_OUTPUT_DIRECTORY", "annotated_output.pdf");
annotator.Save(outputPath);
```
```

**نصيحة احترافية:** استخدم `Path.Combine()` لبناء مسارات الملفات بأمان عبر Windows، Linux، وmacOS.

Expand Down Expand Up @@ -271,7 +261,6 @@ catch (WebException ex)
throw;
}
```
```

### لماذا ينهار التطبيق بسبب نقص الذاكرة مع PDFs الكبيرة؟
تحميل PDFs الكبيرة بالكامل إلى `MemoryStream` قد يستنزف الذاكرة المتاحة للعملية، خصوصًا في بيئات 32‑bit أو الحاويات ذات الذاكرة المحدودة.
Expand All @@ -296,7 +285,6 @@ private static Stream GetRemoteFile(string url)
}
}
```
```

### لماذا تظهر تعليقاتي في المكان الخطأ؟
الموضع غير الصحيح غالبًا ما ينتج عن أبعاد صفحة غير متطابقة، دوران، أو استخدام نظام إحداثيات مختلف عما يتوقعه PDF.
Expand All @@ -314,7 +302,6 @@ if (pageInfo != null)
// Adjust your coordinates accordingly
}
```
```

## أفضل ممارسات الأداء

Expand All @@ -330,7 +317,6 @@ private static readonly HttpClient httpClient = new HttpClient()
Timeout = TimeSpan.FromSeconds(30)
};
```
```
- **تخزين المستندات مؤقتًا:** احفظ ملفات PDF المتكررة في ذاكرة تخزين موزعة (Redis، MemoryCache).
- **واجهات Async:** فضل الأساليب غير المتزامنة (`await annotator.SaveAsync(...)`) لإبقاء الخيوط حرة.
```text
Expand All @@ -343,7 +329,6 @@ public async Task<Stream> GetRemoteFileAsync(string url)
return await response.Content.ReadAsStreamAsync();
}
```
```

### كيف أدير الذاكرة بكفاءة؟
عبارة `using` تضمن إغلاق الكائنات القابلة للتصرف مثل الـ streams وAnnotator بشكل صحيح، مما يمنع تسرب الذاكرة.
Expand All @@ -357,7 +342,6 @@ using (var outputStream = new FileStream(outputPath, FileMode.Create))
annotator.Save(outputStream);
} // Resources automatically disposed here
```
```

راقب استهلاك الذاكرة لتطبيقك باستخدام أدوات مثل **dotMemory** أو **PerfView**، خاصةً عند معالجة دفعات من PDFs بشكل متزامن.

Expand Down
Loading
Loading