From 1d7a0b09cd26001b393ffd81ec516573b5bc21b7 Mon Sep 17 00:00:00 2001 From: Muhammad Adil Date: Fri, 31 Jul 2026 10:42:43 +0000 Subject: [PATCH] Add 4 html python tutorials MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Categories: general Source: AI Search API Tutorials: - HTML to PDF Tutorial – Convert HTML Files to PDF with Aspose.HTML - Create markdown from HTML in Python – Complete Guide - How to Limit Recursion in HTML Processing – Complete Guide - Create SVG Document – Add a Circle and Save as SVG Auto-generated by Professionalize.Tutorials Agent --- .../_index.md | 261 +++++++++++++++ .../_index.md | 210 ++++++++++++ .../_index.md | 257 ++++++++++++++ .../_index.md | 310 +++++++++++++++++ .../_index.md | 258 ++++++++++++++ .../_index.md | 208 ++++++++++++ .../_index.md | 257 ++++++++++++++ .../_index.md | 290 ++++++++++++++++ .../_index.md | 263 +++++++++++++++ .../_index.md | 210 ++++++++++++ .../_index.md | 263 +++++++++++++++ .../_index.md | 310 +++++++++++++++++ .../_index.md | 263 +++++++++++++++ .../_index.md | 211 ++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 314 ++++++++++++++++++ .../_index.md | 263 +++++++++++++++ .../og-image.png | Bin 0 -> 48868 bytes .../_index.md | 212 ++++++++++++ .../og-image.png | Bin 0 -> 54606 bytes .../_index.md | 262 +++++++++++++++ .../og-image.png | Bin 0 -> 48714 bytes .../_index.md | 312 +++++++++++++++++ .../og-image.png | Bin 0 -> 42796 bytes .../_index.md | 261 +++++++++++++++ .../_index.md | 213 ++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 312 +++++++++++++++++ .../_index.md | 260 +++++++++++++++ .../_index.md | 211 ++++++++++++ .../_index.md | 262 +++++++++++++++ .../_index.md | 313 +++++++++++++++++ .../_index.md | 263 +++++++++++++++ .../_index.md | 211 ++++++++++++ .../_index.md | 257 ++++++++++++++ .../_index.md | 312 +++++++++++++++++ .../_index.md | 263 +++++++++++++++ .../_index.md | 214 ++++++++++++ .../_index.md | 241 ++++++++++++++ .../_index.md | 312 +++++++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 207 ++++++++++++ .../_index.md | 257 ++++++++++++++ .../_index.md | 293 ++++++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 211 ++++++++++++ .../_index.md | 263 +++++++++++++++ .../_index.md | 312 +++++++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 213 ++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 313 +++++++++++++++++ .../_index.md | 263 +++++++++++++++ .../_index.md | 210 ++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 295 ++++++++++++++++ .../_index.md | 259 +++++++++++++++ .../_index.md | 210 ++++++++++++ .../_index.md | 257 ++++++++++++++ .../_index.md | 310 +++++++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 210 ++++++++++++ .../_index.md | 257 ++++++++++++++ .../_index.md | 310 +++++++++++++++++ .../_index.md | 262 +++++++++++++++ .../_index.md | 211 ++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 292 ++++++++++++++++ .../_index.md | 263 +++++++++++++++ .../_index.md | 209 ++++++++++++ .../_index.md | 259 +++++++++++++++ .../_index.md | 292 ++++++++++++++++ .../_index.md | 264 +++++++++++++++ .../_index.md | 210 ++++++++++++ .../_index.md | 259 +++++++++++++++ .../_index.md | 313 +++++++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 213 ++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 294 ++++++++++++++++ .../_index.md | 263 +++++++++++++++ .../_index.md | 210 ++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 293 ++++++++++++++++ .../_index.md | 261 +++++++++++++++ .../_index.md | 210 ++++++++++++ .../_index.md | 259 +++++++++++++++ .../_index.md | 311 +++++++++++++++++ .../_index.md | 263 +++++++++++++++ .../_index.md | 210 ++++++++++++ .../_index.md | 263 +++++++++++++++ .../_index.md | 294 ++++++++++++++++ .../_index.md | 263 +++++++++++++++ .../_index.md | 210 ++++++++++++ .../_index.md | 262 +++++++++++++++ .../_index.md | 312 +++++++++++++++++ 96 files changed, 23846 insertions(+) create mode 100644 html/arabic/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/arabic/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/arabic/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/arabic/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/chinese/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/chinese/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/chinese/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/chinese/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/czech/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/czech/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/czech/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/czech/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/dutch/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/dutch/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/dutch/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/dutch/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/english/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/english/python/general/create-markdown-from-html-in-python-complete-guide/og-image.png create mode 100644 html/english/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/english/python/general/create-svg-document-add-a-circle-and-save-as-svg/og-image.png create mode 100644 html/english/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/english/python/general/how-to-limit-recursion-in-html-processing-complete-guide/og-image.png create mode 100644 html/english/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/english/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/og-image.png create mode 100644 html/french/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/french/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/french/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/french/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/german/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/german/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/german/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/german/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/greek/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/greek/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/greek/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/greek/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/hindi/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/hindi/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/hindi/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/hindi/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/hongkong/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/hongkong/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/hongkong/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/hongkong/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/hungarian/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/hungarian/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/hungarian/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/hungarian/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/indonesian/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/indonesian/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/indonesian/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/indonesian/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/italian/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/italian/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/italian/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/italian/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/japanese/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/japanese/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/japanese/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/japanese/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/korean/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/korean/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/korean/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/korean/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/polish/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/polish/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/polish/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/polish/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/portuguese/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/portuguese/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/portuguese/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/portuguese/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/russian/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/russian/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/russian/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/russian/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/spanish/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/spanish/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/spanish/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/spanish/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/swedish/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/swedish/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/swedish/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/swedish/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/thai/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/thai/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/thai/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/thai/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/turkish/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/turkish/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/turkish/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/turkish/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md create mode 100644 html/vietnamese/python/general/create-markdown-from-html-in-python-complete-guide/_index.md create mode 100644 html/vietnamese/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md create mode 100644 html/vietnamese/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md create mode 100644 html/vietnamese/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/_index.md diff --git a/html/arabic/python/general/create-markdown-from-html-in-python-complete-guide/_index.md b/html/arabic/python/general/create-markdown-from-html-in-python-complete-guide/_index.md new file mode 100644 index 000000000..506635d13 --- /dev/null +++ b/html/arabic/python/general/create-markdown-from-html-in-python-complete-guide/_index.md @@ -0,0 +1,261 @@ +--- +category: general +date: 2026-07-31 +description: أنشئ ماركداون من HTML باستخدام بايثون بسرعة. تعلّم كيفية تحويل HTML إلى + ماركداون باستخدام سكريبت بسيط واستكشف خيارات تحويل HTML إلى ماركداون في بايثون. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create markdown from html +- convert html to markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: ar +lastmod: 2026-07-31 +og_description: إنشاء ملف markdown من HTML باستخدام سكريبت Python مختصر. يوضح هذا + الدرس كيفية تحويل HTML إلى markdown، يغطي خيارات التحويل من HTML إلى markdown، ويقدم + مثالًا جاهزًا للتنفيذ لمستخدمي Python لتحويل HTML إلى markdown. +og_image_alt: Screenshot of a Python script that converts an HTML file into a Markdown + document +og_title: إنشاء ماركداون من HTML باستخدام بايثون – دليل خطوة بخطوة +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: Create markdown from HTML using Python quickly. Learn how to convert + HTML to markdown with a simple script and explore html to markdown python options. + headline: Create markdown from HTML in Python – Complete Guide + type: TechArticle +- description: Create markdown from HTML using Python quickly. Learn how to convert + HTML to markdown with a simple script and explore html to markdown python options. + name: Create markdown from HTML in Python – Complete Guide + steps: + - name: Expected Output + text: 'Running `python convert_html_to_md.py` should print something like:' + - name: 1. Embedded Images + text: 'If your HTML contains `` tags with relative paths, the converter will + embed the same relative paths in Markdown. Make sure the images are copied alongside + the `.md` file, or adjust the `options` to embed base‑64 data URLs:' + - name: 2. Special Characters & Entities + text: 'HTML entities like ` ` or `&` are automatically decoded. However, + if you need to preserve them literally, set:' + - name: 3. Large Files + text: For massive HTML documents (hundreds of megabytes), consider streaming the + input or increasing the Python recursion limit. The Aspose engine is memory‑efficient, + but a 64‑bit Python interpreter is recommended. + type: HowTo +tags: +- python +- html +- markdown +title: إنشاء ماركداون من HTML في بايثون – دليل شامل +url: /ar/python/general/create-markdown-from-html-in-python-complete-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# إنشاء markdown من HTML في Python – دليل كامل + +هل تساءلت يومًا **كيف تحول HTML** إلى Markdown نظيف وقابل للقراءة دون أن تفقد صبرك؟ لست وحدك. سواء كنت تنقل مدونة، تبني مولد مواقع ثابتة، أو تحتاج فقط إلى تحويل سريع لمرة واحدة، فإن القدرة على **إنشاء markdown من HTML** هي مهارة مفيدة لأي مطور Python. + +في هذا الدرس سنستعرض حلًا بسيطًا وشاملًا **يحوّل HTML إلى markdown** باستخدام مكتبة واحدة موثقة جيدًا. بنهاية الدرس ستحصل على سكربت قابل لإعادة الاستخدام، وتفهم تفاصيل **تحويل html إلى markdown**، وتعرف كيف تعدله لمشاريعك الخاصة. + +## ما ستتعلمه + +- تثبيت حزمة Python المناسبة لمهام **html to markdown python**. +- تحميل ملف HTML وتكوين خيارات التحويل. +- تشغيل التحويل والتحقق من ملف Markdown الناتج. +- التعامل مع الحالات الشائعة مثل الصور المدمجة أو الأحرف الخاصة. + +لا تحتاج إلى خبرة سابقة في محللات Markdown—فقط معرفة أساسية بـ Python وإدارة الملفات. + +## المتطلبات المسبقة + +قبل أن نبدأ، تأكد من وجود ما يلي: + +1. Python 3.8 أو أحدث مثبت على جهازك. +2. طرفية أو موجه أوامر تشعر بالراحة في استخدامه. +3. ملف HTML ترغب في تحويله (سنسميه `sample.html`). + +هذا كل شيء. إذا كان أي من ما سبق غير متوفر، خذ لحظة لتثبيت Python من python.org وإنشاء ملف HTML تجريبي صغير—سنتناول باقي التفاصيل هنا. + +## الخطوة 1: تثبيت Aspose.HTML لـ Python عبر pip + +أسهل طريقة **لإنشاء markdown من HTML** في Python هي استخدام حزمة `aspose.html`، التي تتضمن فئة `MarkdownSaveOptions` موثوقة. نفّذ الأمر التالي: + +```bash +pip install aspose-html +``` + +> **نصيحة احترافية:** إذا كنت تعمل داخل بيئة افتراضية (مستحسن جدًا)، فعّلها أولًا؛ وإلا ستُثبت الحزمة عالميًا وقد تتعارض مع مشاريع أخرى. + +## الخطوة 2: استيراد الفئات المطلوبة + +بعد تثبيت المكتبة، استورد الكائنات اللازمة. هذا المقتطف الصغير يهيئ كل ما سيأتي لاحقًا: + +```python +# Import the core Aspose.HTML classes +from aspose.html import HTMLDocument, Converter, MarkdownSaveOptions +``` + +لماذا هذه الثلاثة؟ `HTMLDocument` يقوم بتحميل وتحليل الملف المصدر، `Converter` يدير عملية التحويل، و`MarkdownSaveOptions` يسمح لك بضبط تنسيق الإخراج—مثالي لمهام **html to markdown conversion**. + +## الخطوة 3: تحميل مستند HTML الذي تريد تحويله + +الآن نقوم بقراءة ملف HTML فعليًا. استبدل `YOUR_DIRECTORY` بالمسار الذي يوجد فيه `sample.html`: + +```python +# Step 1: Load the HTML document you want to convert +doc = HTMLDocument("YOUR_DIRECTORY/sample.html") +``` + +إذا لم يُعثر على الملف، سيُطلق Python استثناء `FileNotFoundError`. لتجنب ذلك، تحقق من المسار أو استخدم `os.path.join` لضمان التوافق عبر الأنظمة. + +## الخطوة 4: إنشاء خيارات حفظ Markdown (اختياري لكن قوي) + +كائن `MarkdownSaveOptions` يتيح لك التحكم في أشياء مثل فواصل الأسطر، أنماط العناوين، وما إذا كنت تريد الاحتفاظ بكيانات HTML. الإعدادات الافتراضية تنتج بالفعل Markdown نظيف، لكن يمكنك تخصيصها إذا لزم الأمر: + +```python +# Step 2: Create Markdown save options (defaults produce standard Markdown) +options = MarkdownSaveOptions() +# Example tweak: preserve original line breaks +options.preserve_line_breaks = True +``` + +لا تتردد في تخطي التعديل—السكريبت يعمل بشكل مثالي مباشرةً. هذه الخطوة توضح فقط كيف يمكنك تعديل التحويل لتلبية متطلبات **html to markdown python** المحددة. + +## الخطوة 5: تنفيذ التحويل + +العمل الشاق يتم في سطر واحد. نمرر المستند، الخيارات، واسم الملف الهدف إلى `Converter`: + +```python +# Step 3: Convert the HTML document to a Markdown file +Converter.convert_html(doc, options, "YOUR_DIRECTORY/sample.md") +``` + +بعد تشغيل هذا السطر، ستجد `sample.md` بجوار ملف HTML الأصلي، مملوءًا بـ Markdown منسق بشكل أنيق. + +## البرنامج الكامل – جاهز للتنفيذ + +بجمع كل ما سبق، إليك سكربت كامل قابل للتنفيذ يمكنك نسخه إلى `convert_html_to_md.py`: + +```python +# convert_html_to_md.py +import os +from aspose.html import HTMLDocument, Converter, MarkdownSaveOptions + +def convert_html_to_markdown(html_path: str, md_path: str) -> None: + """ + Convert an HTML file to Markdown. + + Parameters + ---------- + html_path : str + Path to the source HTML file. + md_path : str + Desired output path for the Markdown file. + """ + # Verify that the source exists + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + # Load the HTML document + doc = HTMLDocument(html_path) + + # Set up conversion options (you can tweak these) + options = MarkdownSaveOptions() + # Example: keep original line breaks for better diffing + options.preserve_line_breaks = True + + # Perform conversion + Converter.convert_html(doc, options, md_path) + print(f"✅ Conversion complete! Markdown saved to: {md_path}") + +if __name__ == "__main__": + # Adjust these paths to match your environment + html_file = "YOUR_DIRECTORY/sample.html" + markdown_file = "YOUR_DIRECTORY/sample.md" + convert_html_to_markdown(html_file, markdown_file) +``` + +### النتيجة المتوقعة + +تشغيل `python convert_html_to_md.py` يجب أن يطبع شيئًا مشابهًا لـ: + +``` +✅ Conversion complete! Markdown saved to: YOUR_DIRECTORY/sample.md +``` + +افتح `sample.md` وسترى تمثيلًا بـ Markdown للـ HTML الأصلي—العناوين تتحول إلى رموز `#`، الفقرات كنص عادي، الروابط بصيغة `[text](url)`, وهكذا. + +## التعامل مع الحالات الشائعة + +### 1. الصور المدمجة + +إذا كان HTML يحتوي على وسوم `` بمسارات نسبية، سيُدرج المحول نفس المسارات النسبية في Markdown. تأكد من نسخ الصور إلى جانب ملف `.md`، أو عدّل `options` لتضمين عناوين URL ببيانات base‑64: + +```python +options.embed_images = True # Converts images to inline base64 strings +``` + +### 2. الأحرف الخاصة والكيانات + +كيانات HTML مثل ` ` أو `&` تُفك تلقائيًا. ومع ذلك، إذا أردت الحفاظ عليها حرفيًا، اضبط: + +```python +options.decode_entities = False +``` + +### 3. الملفات الكبيرة + +للمستندات HTML الضخمة (مئات الميجابايت)، فكر في تدفق الإدخال أو زيادة حد الاستدعاء المتكرر في Python. محرك Aspose فعال في استهلاك الذاكرة، لكن يُنصح باستخدام مفسر Python 64‑bit. + +## لماذا هذا النهج يتفوق على كتابة Regex يدويًا + +قد تغريك كتابة تعبيرات نمطية تستبدل `

` بـ `# `، `

` بفواصل أسطر، إلخ. بينما يعمل ذلك على مقاطع صغيرة، سيتعطل سريعًا مع الوسوم المتداخلة، أو العلامات المعيبة، أو الجداول المعقدة. باستخدام مكتبة مخصصة: + +- يضمن **امتثال HTML** (المحلل يصلح الوسوم المكسورة). +- يتعامل مع **الحالات الخاصة** مثل السكربتات، كتل الأنماط، والتعليقات مباشرةً. +- ينتج **Markdown متسق** يمكن لأدوات مثل Pandoc أو Jekyll استيعابه دون تنظيف إضافي. + +باختصار، سير عمل **convert html to markdown** الذي عرضناه قوي، قابل للصيانة، وجاهز للإنتاج. + +## ملخص سريع + +- ثبّت `aspose-html` (`pip install aspose-html`). +- حمّل HTML باستخدام `HTMLDocument`. +- عدّل `MarkdownSaveOptions` إذا رغبت. +- استدعِ `Converter.convert_html` للحصول على ملف `.md`. + +هذه هي سلسلة **create markdown from html** بالكامل—بدون خطوات مخفية، بدون خدمات خارجية، فقط Python نقي. + +## الخطوات التالية والمواضيع ذات الصلة + +الآن بعد أن أتقنت **تحويل html إلى markdown** الأساسي، قد ترغب في استكشاف: + +- **معالجة دفعات**: حلقة عبر مجلد كامل من ملفات HTML. +- **التكامل مع مولدات المواقع الثابتة** مثل Hugo أو MkDocs. +- **معالجة ما بعد التحويل**: استخدم مكتبات `markdown` أو `mistune` لتعديل الناتج أكثر. +- **مكتبات بديلة**: `html2text`، `markdownify`، أو `pandoc` لمجموعات ميزات مختلفة. + +كل من هذه يبني على الأساس الذي غطيناه، وتستفيد جميعها من نفس نهج **html to markdown python**. + +--- + +*برمجة سعيدة! إذا واجهت أي صعوبات أو كان لديك أفكار لتوسيع هذا السكربت، اترك تعليقًا أدناه—لنبقِ الحوار مستمرًا.* + +## ما الذي يجب أن تتعلمه بعد ذلك؟ + +الدروس التالية تغطي مواضيع ذات صلة وثيقة تبني على التقنيات التي تم توضيحها في هذا الدليل. كل مصدر يتضمن أمثلة شاملة مع شروحات خطوة بخطوة لمساعدتك على إتقان ميزات API إضافية واستكشاف أساليب تنفيذ بديلة في مشاريعك الخاصة. + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) + +{{< /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/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md b/html/arabic/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md new file mode 100644 index 000000000..f67eb2d82 --- /dev/null +++ b/html/arabic/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md @@ -0,0 +1,210 @@ +--- +category: general +date: 2026-07-31 +description: تعلم كيفية إنشاء مستند SVG، إضافة دائرة، وحفظ ملف SVG بسرعة. صدّر الرسمة + كـ SVG ببضع أسطر من كود بايثون. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create svg document +- save svg file +- export graphic as svg +- add circle to svg +language: ar +lastmod: 2026-07-31 +og_description: إنشاء مستند SVG، إضافة دائرة، وحفظ ملف SVG في ثوانٍ. يوضح لك هذا الدليل + كيفية تصدير الرسم كملف SVG مع كود واضح وقابل للتنفيذ. +og_image_alt: Screenshot of a red circle inside an SVG file named circle.svg +og_title: إنشاء مستند SVG – إضافة دائرة وحفظه كملف SVG +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: Learn how to create SVG document, add a circle, and save SVG file quickly. + Export graphic as SVG with a few lines of Python code. + headline: Create SVG Document – Add a Circle and Save as SVG + type: TechArticle +- description: Learn how to create SVG document, add a circle, and save SVG file quickly. + Export graphic as SVG with a few lines of Python code. + name: Create SVG Document – Add a Circle and Save as SVG + steps: + - name: Pro tip + text: If you plan to generate many files in a loop, give each `Drawing` a unique + name or use `io.BytesIO` to keep everything in memory until you’re ready to + write. + - name: Edge case – Transparent background + text: 'If you need a transparent background (the default for SVG), you can skip + setting a `fill` on the root. For a white background, add:' + - name: 'Bonus: Export graphic as SVG programmatically' + text: 'If you need the SVG content as a string—for example, to embed it in an + HTML email—you can call `dwg.tostring()` instead of `save()`:' + type: HowTo +- questions: + - answer: Swap `dwg.circle` for `dwg.rect`, `dwg.ellipse`, or even a custom `` + string. The API is consistent across shapes. + question: What if I want a different shape? + - answer: Absolutely. The file you just created can be referenced with `Red circle` or inlined with `` tags. + question: Can I embed the SVG directly in HTML? + - answer: You could, but libraries like `svgwrite` handle namespace quirks and make + the code far more maintainable—especially when you start adding gradients or + animations. + question: Why not write raw XML? + type: FAQPage +tags: +- svg +- python +- vector-graphics +- programming-tutorial +title: إنشاء مستند SVG – إضافة دائرة وحفظه كـ SVG +url: /ar/python/general/create-svg-document-add-a-circle-and-save-as-svg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# إنشاء مستند SVG – إضافة دائرة وحفظه كملف SVG + +هل احتجت يوماً إلى **إنشاء مستند SVG** من الشيفرة ولكن لم تكن متأكدًا من أين تبدأ؟ لست وحدك؛ يواجه العديد من المطورين هذا العائق عندما يبدؤون أول مرة مع الرسومات المتجهة. في هذا الدرس سنستعرض مثالًا صغيرًا ومستقلاً يوضح لك كيفية **إضافة دائرة إلى SVG**، ثم **حفظ ملف SVG** بحيث يمكنك **تصدير الرسم كملف SVG** للاستخدام على الويب أو في أدوات التصميم. + +سنحافظ على البساطة: بضع أسطر من بايثون، مكتبة مساعدة شائعة للـ SVG، وقليل من الشرح. في النهاية ستحصل على ملف `circle.svg` جاهز في مجلدك، وستفهم لماذا كل خطوة مهمة—بدون اختصارات “انظر الوثائق”. + +## ما ستحتاجه + +- Python 3.8+ (أي نسخة حديثة تعمل) +- حزمة `svgwrite` – ثبّتها باستخدام `pip install svgwrite` +- محرر نصوص أو بيئة تطوير (VS Code، PyCharm، أو حتى Notepad يكفي) +- صلاحية كتابة في الدليل الذي تريد حفظ الملف فيه + +هذا كل شيء. لا تبعيات ثقيلة، ولا خدمات خارجية. + +## الخطوة 1: إعداد مستند SVG + +إنشاء مستند SVG سهل كإنشاء كائن `Drawing` من مكتبة `svgwrite`. فكر في هذا الكائن كقماش فارغ حيث تعيش كل الأشكال. + +```python +import svgwrite + +# Step 1: Create a new SVG document (canvas) 800×800 pixels +dwg = svgwrite.Drawing(filename="circle.svg", size=("200px", "200px")) +``` + +> **لماذا هذا مهم:** فئة `Drawing` تتولى كل تفاصيل XML الأساسية لك—المساحات الاسمية، الرؤوس، وعنصر الجذر ``. بتحديد اسم الملف مسبقًا نعرف بالفعل أين سيُحفظ الملف، مما يجعل خطوة **حفظ ملف SVG** لاحقًا بسيطة. + +### نصيحة احترافية +إذا كنت تخطط لإنشاء ملفات متعددة داخل حلقة، أعط كل `Drawing` اسمًا فريدًا أو استخدم `io.BytesIO` للاحتفاظ بكل شيء في الذاكرة حتى تكون جاهزًا للكتابة. + +## الخطوة 2: إضافة دائرة إلى SVG + +الآن بعد أن المستند موجود، لنـ **نضيف دائرة إلى SVG**. طريقة `add()` تقبل أي كائن شكل؛ `Circle` مثالية لنقطة حمراء بسيطة في المركز. + +```python +# Step 2: Add a red circle element to the SVG root +center = (100, 100) # x, y coordinates (half of 200px canvas) +radius = 80 # radius in pixels +circle = dwg.circle(center=center, r=radius, fill='red') +dwg.add(circle) +``` + +> **لماذا نستخدم المتغيرين `center` و `radius`:** كتابة القيم مباشرة تجعل الشيفرة أصعب قراءة وصيانة. بتسمية القيم نوضح النية—هذه الدائرة تقع في وسط لوحة 200 × 200 وتكون كبيرة بما يكفي لتُلاحظ. + +### حالة خاصة – خلفية شفافة +إذا كنت تحتاج خلفية شفافة (وهي الافتراضية للـ SVG)، يمكنك تجاهل تعيين `fill` على الجذر. للحصول على خلفية بيضاء، أضف: + +```python +dwg.add(dwg.rect(insert=(0, 0), size=("200px", "200px"), fill='white')) +``` + +ضع هذا قبل إضافة الدائرة بحيث يكون المستطيل تحتها. + +## الخطوة 3: حفظ ملف SVG + +مع وجود الشكل، الخطوة الأخيرة هي **حفظ ملف SVG**. طريقة `save()` تكتب XML إلى القرص، وبما أننا قد أعطينا `Drawing` اسم ملف، فإن استدعاء واحد يكفي. + +```python +# Step 3: Save the SVG document to a file +dwg.save() +print("✅ circle.svg has been created in the current directory.") +``` + +> **ماذا يحدث خلف الكواليس؟** تقوم `svgwrite` بتسلسل شجرة العناصر إلى سلسلة نصية، وتضيف إعلان XML، وتكتبها بترميز UTF‑8. إذا لم يكن الدليل الهدف موجودًا، سيُطلق بايثون استثناء `FileNotFoundError`؛ تأكد من صحة المسار أو أنشئه باستخدام `os.makedirs()`. + +### إضافي: تصدير الرسم كـ SVG برمجيًا + +إذا كنت تحتاج محتوى الـ SVG كسلسلة نصية—مثلاً لتضمينه في بريد إلكتروني HTML—يمكنك استدعاء `dwg.tostring()` بدلاً من `save()`: + +```python +svg_content = dwg.tostring() +# Now you can send svg_content over a network, store it in a DB, etc. +``` + +## مثال كامل يعمل + +نجمع كل ما سبق في سكريبت كامل جاهز للتنفيذ: + +```python +import svgwrite +import os + +def create_svg_with_circle(output_path: str): + """ + Creates an SVG file containing a single red circle. + Parameters + ---------- + output_path: str + Full path where the SVG file will be saved. + """ + # Ensure the directory exists + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + # Initialise the SVG document (800×800 canvas) + dwg = svgwrite.Drawing(filename=output_path, size=("200px", "200px")) + + # Optional: add a white background rectangle + dwg.add(dwg.rect(insert=(0, 0), size=("200px", "200px"), fill='white')) + + # Add a red circle in the centre + center = (100, 100) + radius = 80 + circle = dwg.circle(center=center, r=radius, fill='red') + dwg.add(circle) + + # Save the file – this is the key step to **save svg file** + dwg.save() + print(f"✅ SVG saved to {output_path}") + +if __name__ == "__main__": + # Change this path to wherever you want the file + output_file = os.path.join(os.getcwd(), "circle.svg") + create_svg_with_circle(output_file) +``` + +**الناتج المتوقع:** بعد تشغيل السكريبت، ستظهر لك ملف `circle.svg` في نفس المجلد. فتحه في المتصفح أو أي محرر متجه سيظهر دائرة حمراء متمركزة على مربع أبيض—تمامًا ما برمجناه. + +## أسئلة شائعة ومشكلات محتملة + +- **ماذا لو أردت شكلاً مختلفًا؟** استبدل `dwg.circle` بـ `dwg.rect` أو `dwg.ellipse` أو حتى سلسلة `` مخصصة. الـ API ثابت عبر الأشكال. +- **هل يمكن تضمين الـ SVG مباشرة في HTML؟** بالطبع. الملف الذي أنشأته يمكن الإشارة إليه بـ `Red circle` أو تضمينه داخل وسوم ``. +- **لماذا لا نكتب XML يدويًا؟** يمكنك ذلك، لكن مكتبات مثل `svgwrite` تتعامل مع تعقيدات المساحات الاسمية وتجعل الشيفرة أكثر قابلية للصيانة—خاصةً عندما تبدأ بإضافة تدرجات أو تحريكات. + +## الخلاصة + +الآن تعرف كيف **تنشئ مستند SVG**، **تضيف دائرة إلى SVG**، و**تحفظ ملف SVG** لتتمكن من **تصدير الرسم كملف SVG** ببضع أسطر من بايثون فقط. النمط قابل للتوسيع: استبدل الدائرة بأي شكل متجه، أو أنشئ مخططات عبر حلقة بيانات، أو عالج مجموعة من الأصول لنظام تصميم. + +ما الخطوة التالية؟ جرّب إضافة تسميات نصية، أو تجربة التدرجات، أو توليد معرض كامل من الأيقونات في سكريبت واحد. إذا كنت ترغب في استكشاف ميزات متقدمة، اطلع على توثيق `svgwrite` حول المجموعات (``)، التحويلات، ودعم التحريكات. + +برمجة سعيدة، ولتظل رسوماتك المتجهة دائمًا حادة! + +## ما الذي ينبغي أن تتعلمه بعد ذلك؟ + +الدروس التالية تغطي مواضيع ذات صلة وثيقة تبني على التقنيات التي تم توضيحها في هذا الدليل. كل مورد يتضمن أمثلة شاملة مع شروحات خطوة بخطوة لمساعدتك على إتقان ميزات API إضافية واستكشاف أساليب تنفيذ بديلة في مشاريعك. + +- [Save SVG Document in Aspose.HTML for Java](/html/english/java/saving-html-documents/save-svg-document/) +- [Create and Manage SVG Documents in Aspose.HTML for Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [svg to png java – Convert SVG to Image with Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /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/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md b/html/arabic/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md new file mode 100644 index 000000000..16d443023 --- /dev/null +++ b/html/arabic/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md @@ -0,0 +1,257 @@ +--- +category: general +date: 2026-07-31 +description: كيفية تحديد حد للتكرار أثناء معالجة موارد HTML. تعلّم تكوين خيارات معالجة + الموارد، وتحديد أقصى عمق، وحفظ الملفات المعالجة بكفاءة. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to limit recursion +- resource handling options +- max handling depth +- HTMLDocument save settings +- prevent infinite loops +language: ar +lastmod: 2026-07-31 +og_description: كيفية تحديد حد للتكرار عند العمل مع مستندات HTML. يوضح لك هذا الدليل + كيفية تكوين خيارات معالجة الموارد، وتعيين عمق أقصى آمن، وتجنب الحلقات اللانهائية. +og_image_alt: Screenshot illustrating how to limit recursion settings in an HTML processing + script +og_title: كيفية تقييد التكرار في معالجة HTML – خطوة بخطوة +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: How to limit recursion while handling HTML resources. Learn to configure + resource handling options, set max depth, and save processed files efficiently. + headline: How to Limit Recursion in HTML Processing – Complete Guide + type: TechArticle +- description: How to limit recursion while handling HTML resources. Learn to configure + resource handling options, set max depth, and save processed files efficiently. + name: How to Limit Recursion in HTML Processing – Complete Guide + steps: + - name: Understanding `max_handling_depth` + text: '- **Depth 0** – Only the root HTML file is processed; no external resources + are followed. - **Depth 1** – The root file *and* any first‑level resources + (e.g., a CSS file referenced directly) are processed. - **Depth 3** – The root, + its direct resources, and the resources of those resources, up to th' + - name: Why a Separate `SaveOptions` Object? + text: Separating **resource handling** from **serialization** keeps your code + modular. You could later add compression, embedding preferences, or different + output formats (e.g., PDF) without touching the recursion logic. + - name: Expected Result + text: '- The output file (`big_document_processed.html`) will contain the original + markup **plus** any resources discovered within the three‑level limit. - Any + deeper‑nested resources are omitted, preventing runaway recursion. - If the + original document referenced a circular chain (e.g., page A → page B → ' + type: HowTo +tags: +- recursion +- HTML processing +- Python +- resource handling +title: كيفية تحديد حد التكرار في معالجة HTML – دليل كامل +url: /ar/python/general/how-to-limit-recursion-in-html-processing-complete-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# كيفية تقييد التكرار في معالجة HTML – دليل كامل + +هل تساءلت يومًا **كيف تقييد التكرار** عندما تقوم بتحليل ملف HTML ضخم؟ من المحتمل أنك صادفت خطأ تجاوز المكدس أو أن سكريبتك يتوقف إلى الأبد لأن موردًا ما يستمر في جلب موارد أخرى. باختصار، عمق التكرار غير المتحكم فيه يمكن أن يحول عملية تحويل بسيطة إلى كابوس. + +الخبر السار؟ يمكنك إخبار المعالج بالتوقف عن الحفر بعد عدد آمن من المستويات، وستحافظ على بصمة الذاكرة مرتبة. أدناه ستشاهد مثالًا عمليًا يوضح **كيفية تقييد التكرار** باستخدام خيارات معالجة الموارد، ولماذا ذلك مهم، وكيفية حفظ المستند المنقح دون أي مشاكل. + +> **فوز سريع:** اضبط `max_handling_depth` إلى `3` وستمنع أي تعشيق أعمق من المتابعة—مثالي لحزم HTML الكبيرة ذات الإشارة الذاتية. + +--- + +## ما ستتعلمه + +- لماذا التكرار غير المتحكم فيه خطر في معالجة مستندات HTML. +- كيفية تكوين **resource handling options** لفرض حد أقصى للعمق. +- الكود الدقيق اللازم لتحميل ومعالجة وحفظ ملف HTML بأمان. +- المشكلات الشائعة (مثل التضمينات الدائرية) وكيفية تجنبها. +- نصائح لضبط حد العمق لمشاريع بأحجام مختلفة. + +لا تحتاج إلى مكتبات خارجية بخلاف حزمة معالجة HTML القياسية (المقتطف أدناه يستخدم فئة `HTMLDocument` العامة التي تعرضها العديد من SDKs، مثل Aspose.HTML للغة Python). إذا كنت تستخدم مكتبة مختلفة، فإن المفاهيم تُترجم مباشرة. + +--- + +## المتطلبات المسبقة + +| المتطلب | السبب | +|-------------|--------| +| Python 3.9+ (or a comparable runtime) | الصياغة الحديثة وتلميحات النوع | +| An HTML processing library that supports `ResourceHandlingOptions` (e.g., `aspose.html`) | يوفر الخاصية `max_handling_depth` | +| A large HTML file (`big_document.html`) you want to clean | يوضح حد التكرار عمليًا | +| Write permissions to the output folder | مطلوب لـ `doc.save(...)` | + +إذا كان أي من هذه مفقودًا، قم بتثبيت المكتبة باستخدام `pip install aspose.html` (أو الحزمة المناسبة) وستكون جاهزًا للانطلاق. + +--- + +## الخطوة 1: تحميل مستند HTML + +أول شيء تقوم به هو إنشاء نسخة من `HTMLDocument` تشير إلى ملف المصدر الخاص بك. فكر في هذا الكائن كنقطة الدخول إلى شجرة DOM بالكامل، وكذلك كبوابة لأي موارد خارجية (صور، CSS، سكريبتات) قد يشير إليها المستند. + +```python +# Step 1: Load the HTML document +doc = HTMLDocument("YOUR_DIRECTORY/big_document.html") +``` + +> **لماذا هذا مهم:** تحميل المستند وحده لا يسبب التكرار بعد، لكنه يجهز المحلل الداخلي لاكتشاف الموارد المرتبطة لاحقًا. إذا كان المستند يحتوي على وسوم `` paths to local files. + - name: 2. Unicode and Right‑to‑Left Languages + text: Aspose.HTML ships with a set of built‑in fonts, but for full Unicode coverage + you may need to embed custom fonts. + - name: 3. Large Documents + text: For HTML files exceeding a few megabytes, you might hit memory limits. The + library offers a streaming API, but for most use‑cases the one‑call `convert` + method suffices. + type: HowTo +- questions: + - answer: Yes. Aspose.HTML renders `` elements as raster images in the PDF, + preserving visual fidelity. + question: Does this work with HTML5 features like ``? + - answer: Absolutely. Use the overload that accepts `PdfSaveOptions` and set properties + like `author`, `title`, or `subject`. + question: Can I set PDF metadata (author, title)? + - answer: 'The `PdfSaveOptions` class includes `encrypt` and `user_password` fields. + Combine them with the `convert` call for secure PDFs. --- ## ## Next Steps and + Related Topics Now that you’ve learned how to **generate pdf from html** with + Aspose.HTML, you might want to explore: * **Batch conversion** – loop' + question: What about password‑protecting the PDF? + type: FAQPage +tags: +- Python +- Aspose.HTML +- PDF conversion +title: دليل تحويل HTML إلى PDF – تحويل ملفات HTML إلى PDF باستخدام Aspose.HTML +url: /ar/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# دليل HTML إلى PDF – تحويل ملفات HTML إلى PDF باستخدام Aspose.HTML + +هل تساءلت يوماً كيف تحول صفحة ويب إلى ملف PDF قابل للطباعة دون العبث بحوارات الطباعة في المتصفح؟ هذا هو بالضبط ما يحله **html to pdf tutorial**. في هذا الدليل ستتعرف على كيفية **generate pdf from html** في ثلاث أسطر فقط من بايثون، باستخدام مكتبة **Aspose.HTML** القوية. + +إذا احتجت يوماً إلى **create pdf from html** للفواتير أو التقارير أو الكتب الإلكترونية، فأنت في المكان الصحيح. سنغطي أيضاً تفاصيل **convert html file pdf** مثل الترميز، تضمين الصور، والحفاظ على الخطوط—حتى لا تواجه مفاجآت غير سارة لاحقاً. + +## ما يغطيه هذا الدليل + +* نظرة سريعة على المتطلبات المسبقة (إصدار بايثون، تثبيت Aspose.HTML، وعينة ملف HTML). +* دليل **html to pdf tutorial** خطوة بخطوة يوضح الاستيراد، الإعداد، واستدعاء المحول. +* لماذا Aspose.HTML خيار قوي لسيناريو **aspose html to pdf**، مع ملاحظات حول الأداء والدقة. +* نصائح للحالات الخاصة—الصور الكبيرة، CSS الخارجي، وحروف Unicode. +* سكريبت كامل قابل للتنفيذ يمكنك نسخه ولصقه وتشغيله اليوم. + +بنهاية هذا المقال ستتمكن من **generate pdf from html** على أي منصة تدعم بايثون، وستفهم “السبب” وراء كل سطر من الشيفرة. + +--- + +## المتطلبات المسبقة – ما تحتاجه قبل البدء + +قبل أن نغوص في الشيفرة، تأكد من وجود ما يلي: + +| المتطلب | السبب | +|-------------|--------| +| Python 3.8 أو أحدث | إصدارات Aspose.HTML تستهدف 3.8+. | +| إمكانية الوصول إلى `pip` لتثبيت الحزم | سنقوم بتحميل `aspose-html` من PyPI. | +| ملف HTML بسيط (`input.html`) | هذا هو المصدر الذي ستقوم بـ **convert html file pdf** منه. | +| صلاحية كتابة في مجلد الإخراج | سيقوم السكريبت بإنشاء `output.pdf`. | + +يمكنك تثبيت المكتبة بأمر واحد: + +```bash +pip install aspose-html +``` + +> **نصيحة احترافية:** إذا كنت تعمل داخل بيئة افتراضية (مستحسن جداً)، فعّلها أولاً للحفاظ على نظافة الاعتمادات. + +--- + +## ## HTML إلى PDF – إعداد البيئة + +العنوان H2 الأول يحتوي بالفعل على **الكلمة المفتاحية الأساسية** (`html to pdf tutorial`). يضمن هذا القسم أن بيئتك جاهزة. + +```python +# Verify the installed version (optional but handy) +import aspose.html as ah +print(f"Aspose.HTML version: {ah.__version__}") +``` + +تشغيل المقتطف يجب أن يطبع شيئاً مثل `Aspose.HTML version: 23.9`. إذا ظهرت لك رسالة خطأ في الاستيراد، تحقق من أن الحزمة تم تثبيتها بشكل صحيح وأنك تستخدم مفسّر بايثون المناسب. + +--- + +## ## الخطوة 1: استيراد فئة Converter (إنشاء PDF من HTML) + +الآن سنستورد الفئة التي تقوم بالعمل الشاق. هذا السطر هو قلب عملية **generate pdf from html**. + +```python +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +``` + +لماذا نستورد فقط `Converter`؟ +* يبقي مساحة الاسم نظيفة، متجنّباً التعارضات غير المقصودة. +* الفئة وحدها كافية لمهمة **create pdf from html** بسيطة، لذا لا نتحمل تكلفة تحميل وحدات غير ضرورية. + +--- + +## ## الخطوة 2: تعريف مسارات الإدخال والإخراج (تحويل ملف HTML إلى PDF) + +بعد ذلك نخبر السكريبت أين يجد ملف HTML المصدر وأين يضع ملف PDF الناتج. هذا هو الجزء الذي تقوم فيه بـ **convert html file pdf**. + +```python +# Step 2: Specify the source HTML file and the destination PDF file +input_html = "YOUR_DIRECTORY/input.html" +output_pdf = "YOUR_DIRECTORY/output.pdf" +``` + +استبدل `YOUR_DIRECTORY` بمسار مطلق أو نسبي يتوافق مع بنية مشروعك. إذا كنت تخطط لمعالجة ملفات متعددة، فكر في حلقة تكرار عبر قائمة من المسارات—فقط تأكد من أن كل اسم إخراج فريد. + +--- + +## ## الخطوة 3: تنفيذ التحويل في استدعاء واحد (إنشاء PDF من HTML) + +أخيراً، عملية التحويل نفسها هي استدعاء طريقة واحدة. هذه هي اللحظة التي تقوم فيها فعلياً بـ **create pdf from html** دون كتابة أي كود إضافي. + +```python +# Step 3: Convert the HTML document to PDF in a single call +Converter.convert(input_html, output_pdf) +print(f"✅ PDF generated at: {output_pdf}") +``` + +خلف الكواليس، `Converter.convert` يحلل HTML، يفسّر CSS، يضمّن الصور، ويكتب PDF يعكس ما ينتجه محرك عرض المتصفح. تستخدم Aspose.HTML محرك تخطيط خاص بها، لذا تحصل على نتائج متسقة بغض النظر عن نسخة المتصفح لدى العميل. + +### لماذا نستخدم Aspose.HTML لهذه المهمة؟ + +* **دقة عالية** – يتم احترام CSS المعقد (flexbox, grid). +* **بدون تبعيات خارجية** – لا حاجة لمتصفح رأسٍ مثل Chromium. +* **متعدد المنصات** – يعمل على Windows, Linux, و macOS بنفس قاعدة الشيفرة. +* **مرونة الترخيص** – نسخة تجريبية مجانية متاحة للاختبار. + +--- + +## ## التعامل مع الحالات الخاصة الشائعة + +حتى السكريبت البسيط المكوّن من ثلاث أسطر قد يواجه مشاكل عندما لا يكون HTML المصدر “منظمًا”. إليك بعض السيناريوهات التي قد تصادفها وكيفية معالجتها. + +### 1. الصور أو الموارد الخارجية + +إذا كان HTML الخاص بك يشير إلى صور مستضافة على الإنترنت، تأكد من أن الجهاز الذي يشغّل السكريبت لديه اتصال بالإنترنت. للبناء دون اتصال، قم بتحميل الأصول وتعديل مسارات `` لتشير إلى ملفات محلية. + +```python +# Example: Ensure images are local +# +``` + +### 2. Unicode واللغات من اليمين إلى اليسار + +تأتي Aspose.HTML مع مجموعة من الخطوط المدمجة، لكن للحصول على تغطية Unicode كاملة قد تحتاج إلى تضمين خطوط مخصصة. + +```python +from aspose.html import FontSettings, FontSource + +# Register a custom font folder (optional) +font_settings = FontSettings() +font_settings.add_font_source(FontSource.folder("fonts/")) +Converter.convert(input_html, output_pdf, font_settings=font_settings) +``` + +### 3. المستندات الكبيرة + +للملفات التي تتجاوز عدة ميغابايت، قد تواجه حدود الذاكرة. المكتبة توفر واجهة برمجة تطبيقات تدفقية، لكن في معظم الحالات تكفي طريقة `convert` ذات الاستدعاء الواحد. + +> **احذر:** النسخة التجريبية المجانية تضيف علامة مائية بعد الصفحتين الأوليين. احصل على ترخيص إذا كنت تحتاج PDFs نظيفة للإنتاج. + +--- + +## ## مثال كامل يعمل + +فيما يلي السكريبت الكامل الذي يمكنك وضعه في ملف باسم `html_to_pdf.py`. شغّله باستخدام `python html_to_pdf.py` بعد وضع `input.html` في نفس المجلد. + +```python +# html_to_pdf.py +# A complete, self‑contained example that converts an HTML file to PDF using Aspose.HTML. + +from aspose.html import Converter + +# ------------------------------------------------------------------ +# Configuration – adjust these paths to match your environment +# ------------------------------------------------------------------ +input_html = "input.html" # <-- your source HTML +output_pdf = "output.pdf" # <-- desired PDF output + +# ------------------------------------------------------------------ +# Conversion – this single call does the heavy lifting +# ------------------------------------------------------------------ +try: + Converter.convert(input_html, output_pdf) + print(f"✅ Successfully generated PDF: {output_pdf}") +except Exception as e: + # Provide a friendly error message – helps with debugging + print(f"❌ Conversion failed: {e}") +``` + +**الناتج المتوقع** (على وحدة التحكم): + +``` +✅ Successfully generated PDF: output.pdf +``` + +افتح `output.pdf` بأي عارض PDF؛ يجب أن ترى HTML الخاص بك مُظهرًا تمامًا كما يظهر في متصفح حديث. + +--- + +## ## التحقق من النتيجة + +للتأكد من نجاح التحويل، يمكنك إجراء فحص سريع للمنطقية: + +```python +import os + +if os.path.getsize(output_pdf) > 0: + print("File size looks good – PDF is not empty.") +else: + print("Uh‑oh, the PDF is empty. Check the input HTML and permissions.") +``` + +إذا كان حجم الملف غير صفر وكان المحتوى يبدو صحيحًا، تهانينا—لقد أتقنت **html to pdf tutorial**! + +--- + +## ## الأسئلة المتكررة + +**س: هل يعمل هذا مع ميزات HTML5 مثل ``؟** +ج: نعم. تقوم Aspose.HTML بتحويل عناصر `` إلى صور نقطية في PDF، مع الحفاظ على الدقة البصرية. + +**س: هل يمكنني تعيين بيانات تعريف PDF (المؤلف، العنوان)؟** +ج: بالتأكيد. استخدم النسخة التي تقبل `PdfSaveOptions` واضبط خصائص مثل `author`, `title`, أو `subject`. + +**س: ماذا عن حماية PDF بكلمة مرور؟** +ج: فئة `PdfSaveOptions` تشمل حقول `encrypt` و `user_password`. يمكنك دمجها مع استدعاء `convert` للحصول على PDFs مؤمنة. + +--- + +## ## الخطوات التالية والمواضيع ذات الصلة + +الآن بعد أن تعلمت كيفية **generate pdf from html** باستخدام Aspose.HTML، قد ترغب في استكشاف: + +* **تحويل دفعي** – حلقة عبر مجلد من ملفات HTML وإنتاج PDF لكل منها. +* **HTML إلى PDF مع CSS مخصص** – حقن ورقة أنماط برمجياً قبل التحويل. +* **دمج PDFs** – دمج عدة PDFs تم إنشاؤها من صفحات HTML مختلفة باستخدام Aspose.PDF. +* **نشر كخدمة مصغرة** – إتاحة منطق التحويل عبر نقطة نهاية Flask أو FastAPI لتوليد PDF عند الطلب. + +جميع هذه المواضيع تبني على المفاهيم الأساسية التي غطيناها في هذا **html to pdf tutorial**، وتبقي سير عمل **aspose html to pdf** متسقًا عبر المشاريع. + +--- + +## الخاتمة + +استعرضنا دليلًا مختصرًا لـ **html to pdf tutorial** يوضح لك كيفية **create pdf from html** باستخدام فئة `Converter` في Aspose.HTML. باستيراد الفئة الصحيحة، وتحديد مسار HTML المصدر، واستدعاء `convert`، يمكنك بثقة **convert html file pdf** في أي بيئة بايثون. + +لا تتردد في تعديل السكريبت، تجربة أنماط مختلفة، أو دمجه في تطبيقات أكبر. إذا واجهت أي صعوبة، ارجع إلى قسم الحالات الخاصة أو راجع وثائق Aspose الرسمية للحصول على خيارات تكوين أعمق. + +برمجة سعيدة، ولتكن ملفات PDF الخاصة بك دائمًا متقنة كما صفحات الويب الخاصة بك! + +## ما الذي يجب أن تتعلمه بعد ذلك؟ + +الدروس التالية تغطي مواضيع ذات صلة وثيقة تبني على التقنيات التي تم توضيحها في هذا الدليل. كل مورد يتضمن أمثلة شاملة مع شروح خطوة بخطوة لمساعدتك على إتقان ميزات API إضافية واستكشاف نهج تنفيذ بديلة في مشاريعك. + +- [كيفية تحويل HTML إلى PDF باستخدام Java – باستخدام Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) +- [إنشاء PDF من HTML باستخدام Aspose.HTML for Java – بيئة معزولة](/html/english/java/configuring-environment/implement-sandboxing/) +- [تحويل HTML إلى PDF مع Aspose.HTML – دليل شامل للتعامل](/html/english/) + +{{< /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/python/general/create-markdown-from-html-in-python-complete-guide/_index.md b/html/chinese/python/general/create-markdown-from-html-in-python-complete-guide/_index.md new file mode 100644 index 000000000..25328046d --- /dev/null +++ b/html/chinese/python/general/create-markdown-from-html-in-python-complete-guide/_index.md @@ -0,0 +1,258 @@ +--- +category: general +date: 2026-07-31 +description: 使用 Python 快速将 HTML 转换为 Markdown。了解如何通过简单脚本将 HTML 转为 Markdown,并探索 HTML + 转 Markdown 的 Python 选项。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create markdown from html +- convert html to markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: zh +lastmod: 2026-07-31 +og_description: 使用简洁的 Python 脚本将 HTML 转换为 Markdown。本教程展示如何将 HTML 转换为 Markdown,涵盖 HTML + 转 Markdown 的转换选项,并为使用 Python 的 HTML 转 Markdown 用户提供可直接运行的示例。 +og_image_alt: Screenshot of a Python script that converts an HTML file into a Markdown + document +og_title: 使用 Python 将 HTML 转换为 Markdown – 步骤指南 +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: Create markdown from HTML using Python quickly. Learn how to convert + HTML to markdown with a simple script and explore html to markdown python options. + headline: Create markdown from HTML in Python – Complete Guide + type: TechArticle +- description: Create markdown from HTML using Python quickly. Learn how to convert + HTML to markdown with a simple script and explore html to markdown python options. + name: Create markdown from HTML in Python – Complete Guide + steps: + - name: Expected Output + text: 'Running `python convert_html_to_md.py` should print something like:' + - name: 1. Embedded Images + text: 'If your HTML contains `` tags with relative paths, the converter will + embed the same relative paths in Markdown. Make sure the images are copied alongside + the `.md` file, or adjust the `options` to embed base‑64 data URLs:' + - name: 2. Special Characters & Entities + text: 'HTML entities like ` ` or `&` are automatically decoded. However, + if you need to preserve them literally, set:' + - name: 3. Large Files + text: For massive HTML documents (hundreds of megabytes), consider streaming the + input or increasing the Python recursion limit. The Aspose engine is memory‑efficient, + but a 64‑bit Python interpreter is recommended. + type: HowTo +tags: +- python +- html +- markdown +title: 在 Python 中从 HTML 创建 Markdown – 完整指南 +url: /zh/python/general/create-markdown-from-html-in-python-complete-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 在 Python 中从 HTML 创建 Markdown – 完整指南 + +有没有想过 **如何将 HTML 转换** 为干净、易读的 Markdown 而不抓狂?你并不是唯一的。无论是迁移博客、构建静态站点生成器,还是只需要一次性快速转换,**从 HTML 创建 markdown** 的能力都是任何 Python 开发者的实用技能。 + +在本教程中,我们将一步步演示一个简洁、端到端的解决方案,使用单一且文档完善的库 **将 HTML 转换为 markdown**。完成后,你将拥有可复用的脚本,了解 **html to markdown conversion** 的细微差别,并知道如何为自己的项目进行微调。 + +## 您将学习的内容 + +- 为 **html to markdown python** 任务安装合适的 Python 包。 +- 加载 HTML 文件并配置转换选项。 +- 运行转换并验证生成的 Markdown 文件。 +- 处理常见的边缘情况,如嵌入的图片或特殊字符。 + +无需任何 Markdown 解析器的先前经验——只需对 Python 和文件 I/O 有基本了解。 + +## 前置条件 + +在开始之前,请确保你具备以下条件: + +1. 在机器上安装了 Python 3.8 或更高版本。 +2. 一个你熟悉的终端或命令提示符。 +3. 一个你想要转换的 HTML 文件(我们称之为 `sample.html`)。 + +就这些。如果缺少上述任何项,请暂停片刻,从 python.org 安装 Python 并创建一个小的 HTML 测试文件——其余内容将在此覆盖。 + +## 第一步:通过 pip 安装 Aspose.HTML for Python + +在 Python 中 **从 HTML 创建 markdown** 最简单的方式是使用 `aspose.html` 包,它附带可靠的 `MarkdownSaveOptions` 类。运行以下命令: + +```bash +pip install aspose-html +``` + +> **专业提示:** 如果你在虚拟环境中工作(强烈推荐),请先激活它;否则该包会全局安装,可能与其他项目冲突。 + +## 第二步:导入所需的类 + +库安装完毕后,导入必要的对象。下面这段小代码为后续所有操作奠定基础: + +```python +# Import the core Aspose.HTML classes +from aspose.html import HTMLDocument, Converter, MarkdownSaveOptions +``` + +为什么是这三个?`HTMLDocument` 用来加载并解析源文件,`Converter` 负责转换流程,而 `MarkdownSaveOptions` 让你细调输出格式——非常适合 **html to markdown conversion** 任务。 + +## 第三步:加载要转换的 HTML 文档 + +现在我们实际读取 HTML 文件。将 `YOUR_DIRECTORY` 替换为 `sample.html` 所在的路径: + +```python +# Step 1: Load the HTML document you want to convert +doc = HTMLDocument("YOUR_DIRECTORY/sample.html") +``` + +如果文件未找到,Python 会抛出 `FileNotFoundError`。为避免这种情况,请再次确认路径或使用 `os.path.join` 以确保跨平台安全。 + +## 第四步:创建 Markdown 保存选项(可选但强大) + +`MarkdownSaveOptions` 对象让你可以控制换行、标题样式以及是否保留 HTML 实体。默认设置已经能生成干净的 Markdown,但如果需要,你可以自行定制: + +```python +# Step 2: Create Markdown save options (defaults produce standard Markdown) +options = MarkdownSaveOptions() +# Example tweak: preserve original line breaks +options.preserve_line_breaks = True +``` + +如果不想微调也没关系——我们的脚本开箱即用。此步骤仅用于演示如何根据特定 **html to markdown python** 需求调整转换行为。 + +## 第五步:执行转换 + +核心工作只需一行代码。我们将文档、选项以及目标文件名交给 `Converter`: + +```python +# Step 3: Convert the HTML document to a Markdown file +Converter.convert_html(doc, options, "YOUR_DIRECTORY/sample.md") +``` + +运行后,你会在原始 HTML 文件旁边看到 `sample.md`,其中已填充整齐的 Markdown 内容。 + +## 完整脚本 – 可直接运行 + +把所有代码组合在一起,下面是一个完整、可直接运行的脚本,你可以复制粘贴到 `convert_html_to_md.py` 中: + +```python +# convert_html_to_md.py +import os +from aspose.html import HTMLDocument, Converter, MarkdownSaveOptions + +def convert_html_to_markdown(html_path: str, md_path: str) -> None: + """ + Convert an HTML file to Markdown. + + Parameters + ---------- + html_path : str + Path to the source HTML file. + md_path : str + Desired output path for the Markdown file. + """ + # Verify that the source exists + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + # Load the HTML document + doc = HTMLDocument(html_path) + + # Set up conversion options (you can tweak these) + options = MarkdownSaveOptions() + # Example: keep original line breaks for better diffing + options.preserve_line_breaks = True + + # Perform conversion + Converter.convert_html(doc, options, md_path) + print(f"✅ Conversion complete! Markdown saved to: {md_path}") + +if __name__ == "__main__": + # Adjust these paths to match your environment + html_file = "YOUR_DIRECTORY/sample.html" + markdown_file = "YOUR_DIRECTORY/sample.md" + convert_html_to_markdown(html_file, markdown_file) +``` + +### 预期输出 + +运行 `python convert_html_to_md.py` 应该会打印类似如下内容: + +``` +✅ Conversion complete! Markdown saved to: YOUR_DIRECTORY/sample.md +``` + +打开 `sample.md`,你会看到原始 HTML 的 Markdown 表现形式——标题被转换为 `#` 符号,段落为纯文本,链接格式为 `[text](url)`,依此类推。 + +## 处理常见边缘情况 + +### 1. 嵌入的图片 + +如果你的 HTML 包含带有相对路径的 `` 标签,转换器会在 Markdown 中保留相同的相对路径。请确保图片与 `.md` 文件一起复制,或调整 `options` 以嵌入 base‑64 数据 URL: + +```python +options.embed_images = True # Converts images to inline base64 strings +``` + +### 2. 特殊字符与实体 + +` `、`&` 等 HTML 实体会自动解码。不过,如果你需要原样保留它们,请设置: + +```python +options.decode_entities = False +``` + +### 3. 大文件 + +对于体积巨大的 HTML 文档(数百兆),考虑使用流式输入或提升 Python 的递归限制。Aspose 引擎内存效率高,但建议使用 64 位 Python 解释器。 + +## 为什么这种方法胜过 DIY 正则 + +你可能会想写正则表达式把 `

` 替换成 `# `、把 `

` 替换成换行等。虽然对小片段有效,但在嵌套标签、损坏的标记或复杂表格面前很快就会失效。使用专门的库: + +- 保证 **HTML 合规性**(解析器会修复破损标签)。 +- 处理 **边缘情况**,如脚本、样式块和注释,开箱即用。 +- 生成 **一致的 Markdown**,工具如 Pandoc 或 Jekyll 可直接使用,无需额外清理。 + +简而言之,我们演示的 **convert html to markdown** 工作流稳健、易维护,且可直接用于生产环境。 + +## 快速回顾 + +- 安装 `aspose-html`(`pip install aspose-html`)。 +- 使用 `HTMLDocument` 加载你的 HTML。 +- 可选地微调 `MarkdownSaveOptions`。 +- 调用 `Converter.convert_html` 生成 `.md` 文件。 + +这就是完整的 **create markdown from html** 流程——没有隐藏步骤,没有外部服务,纯粹使用 Python。 + +## 后续步骤与相关主题 + +既然你已经掌握了基础的 **html to markdown conversion**,可以进一步探索: + +- **批量处理**:遍历整个文件夹的 HTML 文件。 +- **与静态站点生成器集成**,如 Hugo 或 MkDocs。 +- **自定义后处理**:使用 `markdown` 或 `mistune` 库进一步调整输出。 +- **替代库**:`html2text`、`markdownify` 或 `pandoc`,提供不同的功能集。 + +这些都建立在本指南的基础上,并且都受益于相同的 **html to markdown python** 思维方式。 + +*祝编码愉快!如果遇到问题或有扩展脚本的想法,欢迎在下方留言——让我们继续交流。* + +## 接下来该学习什么? + +以下教程涵盖与本指南技术紧密相关的主题,帮助你在项目中进一步掌握 API 功能并探索替代实现方式,每篇资源都提供完整可运行的代码示例和逐步解释。 + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) + +{{< /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/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md b/html/chinese/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md new file mode 100644 index 000000000..c8c77ea41 --- /dev/null +++ b/html/chinese/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md @@ -0,0 +1,208 @@ +--- +category: general +date: 2026-07-31 +description: 学习如何快速创建 SVG 文档、添加圆形并保存 SVG 文件。只需几行 Python 代码即可将图形导出为 SVG。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create svg document +- save svg file +- export graphic as svg +- add circle to svg +language: zh +lastmod: 2026-07-31 +og_description: 创建 SVG 文档,添加圆形,并在几秒内保存 SVG 文件。本指南展示了如何使用清晰、可运行的代码将图形导出为 SVG。 +og_image_alt: Screenshot of a red circle inside an SVG file named circle.svg +og_title: 创建 SVG 文档 – 添加圆形并保存为 SVG +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: Learn how to create SVG document, add a circle, and save SVG file quickly. + Export graphic as SVG with a few lines of Python code. + headline: Create SVG Document – Add a Circle and Save as SVG + type: TechArticle +- description: Learn how to create SVG document, add a circle, and save SVG file quickly. + Export graphic as SVG with a few lines of Python code. + name: Create SVG Document – Add a Circle and Save as SVG + steps: + - name: Pro tip + text: If you plan to generate many files in a loop, give each `Drawing` a unique + name or use `io.BytesIO` to keep everything in memory until you’re ready to + write. + - name: Edge case – Transparent background + text: 'If you need a transparent background (the default for SVG), you can skip + setting a `fill` on the root. For a white background, add:' + - name: 'Bonus: Export graphic as SVG programmatically' + text: 'If you need the SVG content as a string—for example, to embed it in an + HTML email—you can call `dwg.tostring()` instead of `save()`:' + type: HowTo +- questions: + - answer: Swap `dwg.circle` for `dwg.rect`, `dwg.ellipse`, or even a custom `` + string. The API is consistent across shapes. + question: What if I want a different shape? + - answer: Absolutely. The file you just created can be referenced with `Red circle` or inlined with `` tags. + question: Can I embed the SVG directly in HTML? + - answer: You could, but libraries like `svgwrite` handle namespace quirks and make + the code far more maintainable—especially when you start adding gradients or + animations. + question: Why not write raw XML? + type: FAQPage +tags: +- svg +- python +- vector-graphics +- programming-tutorial +title: 创建 SVG 文档 – 添加圆形并保存为 SVG +url: /zh/python/general/create-svg-document-add-a-circle-and-save-as-svg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 创建 SVG 文档 – 添加圆形并保存为 SVG + +是否曾经需要从代码 **create SVG document**(创建 SVG 文档),但不确定从何开始?你并不孤单;许多开发者在首次接触矢量图形时都会遇到这种障碍。在本教程中,我们将通过一个小型、独立的示例,向你展示如何 **add circle to SVG**(向 SVG 添加圆形),然后 **save SVG file**(保存 SVG 文件),以便 **export graphic as SVG**(将图形导出为 SVG)用于网页或设计工具。 + +我们保持轻量:只需几行 Python、一个流行的 SVG 辅助库,以及一点说明。完成后,你将在文件夹中得到一个可直接使用的 `circle.svg`,并且会明白每一步的意义——不再依赖模糊的“查看文档”快捷方式。 + +## 您需要的环境 + +- Python 3.8+(任何近期版本均可) +- `svgwrite` 包 – 使用 `pip install svgwrite` 安装 +- 文本编辑器或 IDE(VS Code、PyCharm,甚至记事本都可以) +- 对希望保存文件的目录拥有写入权限 + +就这些。没有笨重的依赖,也不需要外部服务。 + +## 步骤 1:设置 SVG 文档 + +创建 SVG 文档就像实例化 `svgwrite` 中的 `Drawing` 对象一样简单。把这个对象想象成所有形状所在的空白画布。 + +```python +import svgwrite + +# Step 1: Create a new SVG document (canvas) 800×800 pixels +dwg = svgwrite.Drawing(filename="circle.svg", size=("200px", "200px")) +``` + +> **Why this matters:** `Drawing` 类会为你处理所有 XML 样板——命名空间、头部以及根 `` 元素。提前指定文件名后,我们已经知道文件最终会保存到哪里,这使得后续的 **save svg file** 步骤变得轻而易举。 + +### 专业提示 +如果你计划在循环中生成大量文件,请为每个 `Drawing` 提供唯一的名称,或使用 `io.BytesIO` 将所有内容保存在内存中,直到准备写入为止。 + +## 步骤 2:向 SVG 添加圆形 + +既然文档已经存在,让我们 **add circle to SVG**。`add()` 方法接受任意形状对象;`Circle` 非常适合在中心绘制一个简单的红点。 + +```python +# Step 2: Add a red circle element to the SVG root +center = (100, 100) # x, y coordinates (half of 200px canvas) +radius = 80 # radius in pixels +circle = dwg.circle(center=center, r=radius, fill='red') +dwg.add(circle) +``` + +> **Why we use `center` and `radius` variables:** 硬编码数字会让代码难以阅读和维护。通过为数值命名,我们明确了意图——此圆形正好位于 200 × 200 画布的正中心,且足够大以便被注意到。 + +### 边缘情况 – 透明背景 +如果需要透明背景(SVG 的默认设置),可以跳过在根元素上设置 `fill`。若想要白色背景,请添加: + +```python +dwg.add(dwg.rect(insert=(0, 0), size=("200px", "200px"), fill='white')) +``` + +在添加圆形之前放置此代码,以便矩形位于下层。 + +## 步骤 3:保存 SVG 文件 + +形状就位后,最后一步是 **save SVG file**。`save()` 方法会将 XML 写入磁盘,并且因为我们已经为 `Drawing` 指定了文件名,只需一次调用即可完成。 + +```python +# Step 3: Save the SVG document to a file +dwg.save() +print("✅ circle.svg has been created in the current directory.") +``` + +> **What happens under the hood?** `svgwrite` 将元素树序列化为字符串,添加 XML 声明,并使用 UTF‑8 编码写入。如果目标目录不存在,Python 会抛出 `FileNotFoundError`;请确保路径有效,或使用 `os.makedirs()` 创建目录。 + +### 额外:以编程方式导出 SVG 图形 + +如果需要将 SVG 内容作为字符串,例如嵌入 HTML 邮件中,可以调用 `dwg.tostring()` 而不是 `save()`: + +```python +svg_content = dwg.tostring() +# Now you can send svg_content over a network, store it in a DB, etc. +``` + +## 完整工作示例 + +将所有步骤组合起来,下面是一个完整、可直接运行的脚本: + +```python +import svgwrite +import os + +def create_svg_with_circle(output_path: str): + """ + Creates an SVG file containing a single red circle. + Parameters + ---------- + output_path: str + Full path where the SVG file will be saved. + """ + # Ensure the directory exists + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + # Initialise the SVG document (800×800 canvas) + dwg = svgwrite.Drawing(filename=output_path, size=("200px", "200px")) + + # Optional: add a white background rectangle + dwg.add(dwg.rect(insert=(0, 0), size=("200px", "200px"), fill='white')) + + # Add a red circle in the centre + center = (100, 100) + radius = 80 + circle = dwg.circle(center=center, r=radius, fill='red') + dwg.add(circle) + + # Save the file – this is the key step to **save svg file** + dwg.save() + print(f"✅ SVG saved to {output_path}") + +if __name__ == "__main__": + # Change this path to wherever you want the file + output_file = os.path.join(os.getcwd(), "circle.svg") + create_svg_with_circle(output_file) +``` + +**Expected output:** 运行脚本后,你会在同一文件夹中看到 `circle.svg` 文件。用浏览器或任意矢量编辑器打开,它会显示一个位于白色方块中心的红色圆形——正是我们编写的效果。 + +## 常见问题与陷阱 + +- **What if I want a different shape?** 将 `dwg.circle` 替换为 `dwg.rect`、`dwg.ellipse`,或自定义的 `` 字符串即可。API 在各种形状之间保持一致。 +- **Can I embed the SVG directly in HTML?** 完全可以。刚创建的文件可以通过 `Red circle` 引用,或直接内联为 `` 标签。 +- **Why not write raw XML?** 当然可以,但像 `svgwrite` 这样的库会处理命名空间细节,使代码更易维护——尤其是在你开始添加渐变或动画时。 + +## 结论 + +你现在已经掌握了 **create SVG document**、**add circle to SVG** 和 **save SVG file** 的完整流程,能够仅用几行 Python 就 **export graphic as SVG**。这一模式易于扩展:用任意矢量形状替代圆形,循环数据生成图表,或批量处理设计系统的资源。 + +接下来可以尝试添加文本标签、实验渐变,或在单个脚本中生成整套图标库。如果想了解更高级的功能,请查阅 `svgwrite` 文档中关于组(``)、变换和动画支持的章节。 + +祝编码愉快,愿你的矢量图始终保持锐利! + +## 接下来您应该学习什么? + +以下教程涵盖了与本指南技术紧密相关的主题,帮助你在已有技巧的基础上进一步深入。每个资源都提供完整的可运行代码示例和逐步说明,帮助你掌握更多 API 功能,并在自己的项目中探索替代实现方式。 + +- [Save SVG Document in Aspose.HTML for Java](/html/english/java/saving-html-documents/save-svg-document/) +- [Create and Manage SVG Documents in Aspose.HTML for Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [svg to png java – Convert SVG to Image with Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /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/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md b/html/chinese/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md new file mode 100644 index 000000000..012450455 --- /dev/null +++ b/html/chinese/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md @@ -0,0 +1,257 @@ +--- +category: general +date: 2026-07-31 +description: 如何在处理 HTML 资源时限制递归。了解如何配置资源处理选项、设置最大深度,并高效保存处理后的文件。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to limit recursion +- resource handling options +- max handling depth +- HTMLDocument save settings +- prevent infinite loops +language: zh +lastmod: 2026-07-31 +og_description: 在处理 HTML 文档时如何限制递归。本指南将向您展示如何配置资源处理选项、设置安全的最大深度以及避免无限循环。 +og_image_alt: Screenshot illustrating how to limit recursion settings in an HTML processing + script +og_title: 如何在HTML处理时限制递归——一步步 +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: How to limit recursion while handling HTML resources. Learn to configure + resource handling options, set max depth, and save processed files efficiently. + headline: How to Limit Recursion in HTML Processing – Complete Guide + type: TechArticle +- description: How to limit recursion while handling HTML resources. Learn to configure + resource handling options, set max depth, and save processed files efficiently. + name: How to Limit Recursion in HTML Processing – Complete Guide + steps: + - name: Understanding `max_handling_depth` + text: '- **Depth 0** – Only the root HTML file is processed; no external resources + are followed. - **Depth 1** – The root file *and* any first‑level resources + (e.g., a CSS file referenced directly) are processed. - **Depth 3** – The root, + its direct resources, and the resources of those resources, up to th' + - name: Why a Separate `SaveOptions` Object? + text: Separating **resource handling** from **serialization** keeps your code + modular. You could later add compression, embedding preferences, or different + output formats (e.g., PDF) without touching the recursion logic. + - name: Expected Result + text: '- The output file (`big_document_processed.html`) will contain the original + markup **plus** any resources discovered within the three‑level limit. - Any + deeper‑nested resources are omitted, preventing runaway recursion. - If the + original document referenced a circular chain (e.g., page A → page B → ' + type: HowTo +tags: +- recursion +- HTML processing +- Python +- resource handling +title: 如何在 HTML 处理时限制递归——完整指南 +url: /zh/python/general/how-to-limit-recursion-in-html-processing-complete-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何限制 HTML 处理中的递归 – 完整指南 + +有没有想过在解析巨大的 HTML 文件时 **如何限制递归**?很可能你已经遇到过栈溢出错误,或者脚本因为资源不断拉取更多资源而永远卡住。简而言之,失控的递归深度会把一次简单的转换变成噩梦。 + +好消息是?你可以让处理器在安全的层数后停止深入,这样就能保持内存占用整洁。下面的动手示例展示了 **如何使用资源处理选项来限制递归**,说明了其重要性,并演示了如何毫无阻碍地保存清理后的文档。 + +> **快速收益:** 将 `max_handling_depth` 设置为 `3`,即可阻止更深层的嵌套被跟随——这对于大型自引用 HTML 包来说非常完美。 + +--- + +## 您将学习的内容 + +- 为什么在 HTML 文档处理时失控的递归是危险的。 +- 如何配置 **资源处理选项** 来强制最大深度。 +- 加载、处理并安全保存 HTML 文件的完整代码。 +- 常见陷阱(例如循环包含)以及如何规避。 +- 针对不同项目规模调整深度限制的技巧。 + +无需额外的第三方库,只需使用标准的 HTML 处理包(下面的代码片段使用了许多 SDK(如 Aspose.HTML for Python)公开的通用 `HTMLDocument` 类)。如果你使用的是其他库,概念同样适用。 + +--- + +## 前置条件 + +在开始之前,请确保你具备以下条件: + +| 要求 | 原因 | +|------|------| +| Python 3.9+ (or a comparable runtime) | 现代语法和类型提示 | +| 支持 `ResourceHandlingOptions` 的 HTML 处理库(例如 `aspose.html`) | 提供 `max_handling_depth` 属性 | +| 一个需要清理的超大 HTML 文件(`big_document.html`) | 演示递归限制的实际效果 | +| 对输出文件夹的写权限 | `doc.save(...)` 需要写入 | + +如果缺少任何项,请使用 `pip install aspose.html`(或相应的包)进行安装,即可开始。 + +--- + +## 第 1 步:加载 HTML 文档 + +首先创建一个指向源文件的 `HTMLDocument` 实例。把这个对象想象成整个 DOM 树的入口,也是文档可能引用的外部资源(图片、CSS、脚本)的网关。 + +```python +# Step 1: Load the HTML document +doc = HTMLDocument("YOUR_DIRECTORY/big_document.html") +``` + +> **为什么这很重要:** 仅仅加载文档并不会触发递归,但它会准备内部解析器,以便稍后发现链接的资源。如果文档中包含 `` paths to local files. + - name: 2. Unicode and Right‑to‑Left Languages + text: Aspose.HTML ships with a set of built‑in fonts, but for full Unicode coverage + you may need to embed custom fonts. + - name: 3. Large Documents + text: For HTML files exceeding a few megabytes, you might hit memory limits. The + library offers a streaming API, but for most use‑cases the one‑call `convert` + method suffices. + type: HowTo +- questions: + - answer: Yes. Aspose.HTML renders `` elements as raster images in the PDF, + preserving visual fidelity. + question: Does this work with HTML5 features like ``? + - answer: Absolutely. Use the overload that accepts `PdfSaveOptions` and set properties + like `author`, `title`, or `subject`. + question: Can I set PDF metadata (author, title)? + - answer: 'The `PdfSaveOptions` class includes `encrypt` and `user_password` fields. + Combine them with the `convert` call for secure PDFs. --- ## ## Next Steps and + Related Topics Now that you’ve learned how to **generate pdf from html** with + Aspose.HTML, you might want to explore: * **Batch conversion** – loop' + question: What about password‑protecting the PDF? + type: FAQPage +tags: +- Python +- Aspose.HTML +- PDF conversion +title: HTML转PDF教程 – 使用Aspose.HTML将HTML文件转换为PDF +url: /zh/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# HTML to PDF 教程 – 使用 Aspose.HTML 将 HTML 文件转换为 PDF + +是否曾想过如何在不使用浏览器打印对话框的情况下将网页转换为可打印的 PDF?这正是 **html to pdf tutorial** 所要解决的。在本指南中,您将看到如何仅用三行 Python 代码 **generate pdf from html**,并使用强大的 **Aspose.HTML** 库。 + +如果您曾需要为发票、报告或电子书 **create pdf from html**,那么您来对地方了。我们还将介绍 **convert html file pdf** 处理的细微差别——如编码、图像嵌入和字体保留——以免后续出现意外情况。 + +## 本教程涵盖内容 + +* 快速概述先决条件(Python 版本、Aspose.HTML 安装以及示例 HTML 文件)。 +* 一步步的 **html to pdf tutorial**,演示导入、配置和调用转换器的过程。 +* 为什么 Aspose.HTML 是 **aspose html to pdf** 场景的可靠选择,包括性能和保真度说明。 +* 常见边缘情况的技巧——大图像、外部 CSS 和 Unicode 字符。 +* 完整的可运行脚本,您可以直接复制粘贴并立即运行。 + +阅读完本文后,您将能够在任何支持 Python 的平台上 **generate pdf from html**,并且了解每行代码背后的“原因”。 + +--- + +## 前置条件 – 开始前需要准备的内容 + +在深入代码之前,请确保您具备以下条件: + +| Requirement | Reason | +|-------------|--------| +| Python 3.8 或更高 | Aspose.HTML 的 wheel 目标为 3.8+. | +| `pip` 访问权限以安装包 | 我们将从 PyPI 拉取 `aspose-html`。 | +| 一个简单的 HTML 文件(`input.html`) | 这是您将 **convert html file pdf** 的来源。 | +| 对输出文件夹的写入权限 | 脚本将创建 `output.pdf`。 | + +您可以使用以下单行命令安装库: + +```bash +pip install aspose-html +``` + +> **专业提示:** 如果您在虚拟环境中工作(强烈推荐),请先激活它,以保持依赖整洁。 + +## ## HTML to PDF 教程 – 环境设置 + +第一个 H2 已经包含了我们的 **primary keyword**(`html to pdf tutorial`)。本节确保您的环境已准备就绪。 + +```python +# Verify the installed version (optional but handy) +import aspose.html as ah +print(f"Aspose.HTML version: {ah.__version__}") +``` + +运行代码片段后应打印类似 `Aspose.HTML version: 23.9` 的信息。如果出现导入错误,请再次确认包已正确安装且使用了正确的 Python 解释器。 + +## ## 步骤 1:导入 Converter 类(从 HTML 生成 PDF) + +现在我们将引入执行繁重任务的类。这行代码是 **generate pdf from html** 操作的核心。 + +```python +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +``` + +为什么只导入 `Converter`? +* 它保持命名空间整洁,避免意外的名称冲突。 +* 单独使用该类即可完成直接的 **create pdf from html** 任务,无需加载不必要的模块,从而节省开销。 + +## ## 步骤 2:定义输入和输出路径(Convert HTML File PDF) + +接下来,我们告诉脚本 HTML 源文件的位置以及生成的 PDF 应保存到何处。这就是您 **convert html file pdf** 的环节。 + +```python +# Step 2: Specify the source HTML file and the destination PDF file +input_html = "YOUR_DIRECTORY/input.html" +output_pdf = "YOUR_DIRECTORY/output.pdf" +``` + +将 `YOUR_DIRECTORY` 替换为与项目结构相匹配的绝对或相对路径。如果计划处理多个文件,可考虑遍历路径列表——只需确保每个输出文件名唯一即可。 + +## ## 步骤 3:一次调用完成转换(Create PDF from HTML) + +最后,转换本身只需一次方法调用。这就是您真正 **create pdf from html** 而无需编写任何样板代码的时刻。 + +```python +# Step 3: Convert the HTML document to PDF in a single call +Converter.convert(input_html, output_pdf) +print(f"✅ PDF generated at: {output_pdf}") +``` + +在内部,`Converter.convert` 会解析 HTML、解析 CSS、嵌入图像,并生成与浏览器渲染引擎相匹配的 PDF。Aspose.HTML 使用其自有的布局引擎,因此无论客户端浏览器版本如何,都能得到一致的结果。 + +### 为什么在此任务中使用 Aspose.HTML? + +* **高保真** – 复杂的 CSS(flexbox、grid)得到完整支持。 +* **无外部依赖** – 无需使用 Chromium 等无头浏览器。 +* **跨平台** – 在 Windows、Linux 和 macOS 上使用相同代码即可运行。 +* **许可证灵活** – 提供免费评估版供测试使用。 + +## ## 处理常见边缘情况 + +即使是一个简单的三行脚本,当源 HTML 并非“规范”时也可能出现问题。以下是您可能遇到的几种情况以及对应的解决方案。 + +### 1. 外部图像或资源 + +如果您的 HTML 引用了互联网上托管的图像,请确保运行脚本的机器能够访问互联网。对于离线构建,请下载这些资源并将 `` 路径调整为本地文件。 + +```python +# Example: Ensure images are local +# +``` + +### 2. Unicode 与从右到左语言 + +Aspose.HTML 附带一套内置字体,但若需完整的 Unicode 支持,可能需要嵌入自定义字体。 + +```python +from aspose.html import FontSettings, FontSource + +# Register a custom font folder (optional) +font_settings = FontSettings() +font_settings.add_font_source(FontSource.folder("fonts/")) +Converter.convert(input_html, output_pdf, font_settings=font_settings) +``` + +### 3. 大文档 + +对于超过几兆字节的 HTML 文件,可能会触及内存限制。库提供了流式 API,但对大多数使用场景而言,一次性调用 `convert` 方法已足够。 + +> **注意:** 免费评估版在前 2 页后会添加水印。如果在生产环境中需要无水印的 PDF,请购买许可证。 + +## ## 完整工作示例 + +下面是完整脚本,您可以将其保存为 `html_to_pdf.py` 文件。将 `input.html` 放在同一文件夹后,使用 `python html_to_pdf.py` 运行。 + +```python +# html_to_pdf.py +# A complete, self‑contained example that converts an HTML file to PDF using Aspose.HTML. + +from aspose.html import Converter + +# ------------------------------------------------------------------ +# Configuration – adjust these paths to match your environment +# ------------------------------------------------------------------ +input_html = "input.html" # <-- your source HTML +output_pdf = "output.pdf" # <-- desired PDF output + +# ------------------------------------------------------------------ +# Conversion – this single call does the heavy lifting +# ------------------------------------------------------------------ +try: + Converter.convert(input_html, output_pdf) + print(f"✅ Successfully generated PDF: {output_pdf}") +except Exception as e: + # Provide a friendly error message – helps with debugging + print(f"❌ Conversion failed: {e}") +``` + +**预期输出**(在控制台): + +``` +✅ Successfully generated PDF: output.pdf +``` + +使用任意 PDF 查看器打开 `output.pdf`;您应该看到 HTML 的渲染效果与现代浏览器中完全一致。 + +## ## 验证结果 + +为确保转换成功,您可以进行快速的完整性检查: + +```python +import os + +if os.path.getsize(output_pdf) > 0: + print("File size looks good – PDF is not empty.") +else: + print("Uh‑oh, the PDF is empty. Check the input HTML and permissions.") +``` + +如果文件大小非零且内容看起来正确,恭喜您——您已经掌握了 **html to pdf tutorial**! + +## ## 常见问题 + +**问:这能支持 HTML5 的 `` 等特性吗?** +**答:** 可以。Aspose.HTML 会将 `` 元素渲染为 PDF 中的栅格图像,保持视觉保真度。 + +**问:我可以设置 PDF 元数据(作者、标题)吗?** +**答:** 当然可以。使用接受 `PdfSaveOptions` 的重载,并设置 `author`、`title` 或 `subject` 等属性。 + +**问:如何对 PDF 进行密码保护?** +**答:** `PdfSaveOptions` 类包含 `encrypt` 和 `user_password` 字段。将它们与 `convert` 调用结合即可生成受保护的 PDF。 + +## ## 后续步骤与相关主题 + +既然您已经学会使用 Aspose.HTML **generate pdf from html**,接下来可以探索以下内容: + +* **批量转换** – 遍历 HTML 文件目录,为每个文件生成 PDF。 +* **使用自定义 CSS 的 HTML 转 PDF** – 在转换前以编程方式注入样式表。 +* **合并 PDF** – 使用 Aspose.PDF 将不同 HTML 页面生成的多个 PDF 合并。 +* **部署为微服务** – 通过 Flask 或 FastAPI 接口公开转换逻辑,实现按需 PDF 生成。 + +所有这些都基于本 **html to pdf tutorial** 中的核心概念,并且在各项目中保持 **aspose html to pdf** 工作流的一致性。 + +## 结论 + +我们已经完整演示了一个简明的 **html to pdf tutorial**,展示了如何使用 Aspose.HTML 的 `Converter` 类 **create pdf from html**。只需导入正确的类、指向源 HTML 并调用 `convert`,即可在任何 Python 环境中可靠地 **convert html file pdf**。 + +欢迎随意修改脚本、尝试不同样式,或将其集成到更大的应用中。如果遇到问题,请重新查看边缘情况章节或查阅 Aspose 官方文档获取更深入的配置选项。 + +祝编码愉快,愿您的 PDF 始终如同网页一样精美! + +## 接下来该学习什么? + +以下教程涵盖与本指南技术密切相关的主题,构建在本教程演示的技巧之上。每个资源都提供完整的可运行代码示例和逐步解释,帮助您掌握更多 API 功能并在项目中探索替代实现方案。 + +- [How to Convert HTML to PDF Java – Using Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) +- [Create PDF from HTML using Aspose.HTML for Java – Sandbox](/html/english/java/configuring-environment/implement-sandboxing/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) + +{{< /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/python/general/create-markdown-from-html-in-python-complete-guide/_index.md b/html/czech/python/general/create-markdown-from-html-in-python-complete-guide/_index.md new file mode 100644 index 000000000..0beef6156 --- /dev/null +++ b/html/czech/python/general/create-markdown-from-html-in-python-complete-guide/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-07-31 +description: Rychle vytvořte markdown z HTML pomocí Pythonu. Naučte se, jak převést + HTML na markdown pomocí jednoduchého skriptu, a prozkoumejte možnosti převodu HTML + na markdown v Pythonu. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create markdown from html +- convert html to markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: cs +lastmod: 2026-07-31 +og_description: Vytvořte markdown z HTML pomocí stručného Python skriptu. Tento tutoriál + ukazuje, jak převést HTML na markdown, popisuje možnosti konverze HTML na markdown + a poskytuje připravený příklad pro uživatele Pythonu, kteří chtějí převádět HTML + na markdown. +og_image_alt: Screenshot of a Python script that converts an HTML file into a Markdown + document +og_title: Vytvořte markdown z HTML pomocí Pythonu – krok za krokem průvodce +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: Create markdown from HTML using Python quickly. Learn how to convert + HTML to markdown with a simple script and explore html to markdown python options. + headline: Create markdown from HTML in Python – Complete Guide + type: TechArticle +- description: Create markdown from HTML using Python quickly. Learn how to convert + HTML to markdown with a simple script and explore html to markdown python options. + name: Create markdown from HTML in Python – Complete Guide + steps: + - name: Expected Output + text: 'Running `python convert_html_to_md.py` should print something like:' + - name: 1. Embedded Images + text: 'If your HTML contains `` tags with relative paths, the converter will + embed the same relative paths in Markdown. Make sure the images are copied alongside + the `.md` file, or adjust the `options` to embed base‑64 data URLs:' + - name: 2. Special Characters & Entities + text: 'HTML entities like ` ` or `&` are automatically decoded. However, + if you need to preserve them literally, set:' + - name: 3. Large Files + text: For massive HTML documents (hundreds of megabytes), consider streaming the + input or increasing the Python recursion limit. The Aspose engine is memory‑efficient, + but a 64‑bit Python interpreter is recommended. + type: HowTo +tags: +- python +- html +- markdown +title: Vytvořte markdown z HTML v Pythonu – kompletní průvodce +url: /cs/python/general/create-markdown-from-html-in-python-complete-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Vytvoření Markdownu z HTML v Pythonu – Kompletní průvodce + +Už jste se někdy zamýšleli **jak převést HTML** na čistý, čitelný Markdown, aniž byste si trhali vlasy? Nejste v tom sami. Ať už migrujete blog, budujete generátor statických stránek, nebo potřebujete rychlou jednorázovou konverzi, schopnost **vytvořit markdown z HTML** je užitečná dovednost pro každého vývojáře v Pythonu. + +V tomto tutoriálu projdeme jednoduché, end‑to‑end řešení, které **převádí HTML na markdown** pomocí jediné, dobře zdokumentované knihovny. Na konci budete mít znovupoužitelný skript, pochopíte nuance **html to markdown conversion** a budete vědět, jak jej upravit pro své vlastní projekty. + +## Co se naučíte + +- Nainstalovat správný Python balíček pro úlohy **html to markdown python**. +- Načíst HTML soubor a nakonfigurovat možnosti konverze. +- Spustit konverzi a ověřit výsledný Markdown soubor. +- Zvládnout běžné okrajové případy jako vložené obrázky nebo speciální znaky. + +Předchozí zkušenost s Markdown parsery není vyžadována – stačí základní znalost Pythonu a práce se soubory. + +## Předpoklady + +Než se pustíme dál, ujistěte se, že máte: + +1. Python 3.8 nebo novější nainstalovaný na vašem počítači. +2. Terminál nebo příkazový řádek, ve kterém se dobře orientujete. +3. HTML soubor, který chcete převést (budeme ho nazývat `sample.html`). + +To je vše. Pokud vám něco chybí, na chvíli přerušte a nainstalujte Python z python.org a vytvořte malý testovací HTML soubor – vše ostatní bude pokryto zde. + +## Krok 1: Instalace Aspose.HTML pro Python pomocí pip + +Nejjednodušší způsob, jak **vytvořit markdown z HTML** v Pythonu, je použít balíček `aspose.html`, který obsahuje spolehlivou třídu `MarkdownSaveOptions`. Spusťte následující příkaz: + +```bash +pip install aspose-html +``` + +> **Tip:** Pokud pracujete ve virtuálním prostředí (vysoce doporučeno), nejprve jej aktivujte; jinak se balíček nainstaluje globálně a může kolidovat s jinými projekty. + +## Krok 2: Import požadovaných tříd + +Po instalaci knihovny importujte potřebné objekty. Tento malý úryvek připraví vše, co následuje: + +```python +# Import the core Aspose.HTML classes +from aspose.html import HTMLDocument, Converter, MarkdownSaveOptions +``` + +Proč právě tyto tři? `HTMLDocument` načte a parsuje zdrojový soubor, `Converter` řídí transformaci a `MarkdownSaveOptions` vám umožní doladit výstupní formát – ideální pro úlohy **html to markdown conversion**. + +## Krok 3: Načtení HTML dokumentu, který chcete převést + +Nyní skutečně načteme HTML soubor. Nahraďte `YOUR_DIRECTORY` cestou, kde se nachází `sample.html`: + +```python +# Step 1: Load the HTML document you want to convert +doc = HTMLDocument("YOUR_DIRECTORY/sample.html") +``` + +Pokud soubor nebude nalezen, Python vyhodí `FileNotFoundError`. Abyste tomu předešli, dvojitě zkontrolujte cestu nebo použijte `os.path.join` pro multiplatformní bezpečnost. + +## Krok 4: Vytvoření Markdown Save Options (volitelné, ale výkonné) + +Objekt `MarkdownSaveOptions` vám umožní řídit věci jako zalomení řádků, styl nadpisů a zda zachovat HTML entity. Výchozí nastavení již produkuje čistý Markdown, ale můžete je přizpůsobit podle potřeby: + +```python +# Step 2: Create Markdown save options (defaults produce standard Markdown) +options = MarkdownSaveOptions() +# Example tweak: preserve original line breaks +options.preserve_line_breaks = True +``` + +Klidně tento krok přeskočte – náš skript funguje perfektně hned po vybalení. Tento krok jen ukazuje, jak můžete konverzi přizpůsobit konkrétním požadavkům **html to markdown python**. + +## Krok 5: Provedení konverze + +Těžká část se provede jedním řádkem. Předáme dokument, možnosti a cílový název souboru do `Converter`: + +```python +# Step 3: Convert the HTML document to a Markdown file +Converter.convert_html(doc, options, "YOUR_DIRECTORY/sample.md") +``` + +Po spuštění najdete `sample.md` vedle původního HTML souboru, naplněný pěkně formátovaným Markdownem. + +## Kompletní skript – připravený ke spuštění + +Spojením všech částí získáte kompletní, spustitelný skript, který můžete zkopírovat do `convert_html_to_md.py`: + +```python +# convert_html_to_md.py +import os +from aspose.html import HTMLDocument, Converter, MarkdownSaveOptions + +def convert_html_to_markdown(html_path: str, md_path: str) -> None: + """ + Convert an HTML file to Markdown. + + Parameters + ---------- + html_path : str + Path to the source HTML file. + md_path : str + Desired output path for the Markdown file. + """ + # Verify that the source exists + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + # Load the HTML document + doc = HTMLDocument(html_path) + + # Set up conversion options (you can tweak these) + options = MarkdownSaveOptions() + # Example: keep original line breaks for better diffing + options.preserve_line_breaks = True + + # Perform conversion + Converter.convert_html(doc, options, md_path) + print(f"✅ Conversion complete! Markdown saved to: {md_path}") + +if __name__ == "__main__": + # Adjust these paths to match your environment + html_file = "YOUR_DIRECTORY/sample.html" + markdown_file = "YOUR_DIRECTORY/sample.md" + convert_html_to_markdown(html_file, markdown_file) +``` + +### Očekávaný výstup + +Spuštění `python convert_html_to_md.py` by mělo vypsat něco jako: + +``` +✅ Conversion complete! Markdown saved to: YOUR_DIRECTORY/sample.md +``` + +Otevřete `sample.md` a uvidíte Markdownovou reprezentaci původního HTML – nadpisy převedené na `#` symboly, odstavce jako prostý text, odkazy ve formátu `[text](url)` a tak dále. + +## Zvládání běžných okrajových případů + +### 1. Vložené obrázky + +Pokud vaše HTML obsahuje tagy `` s relativními cestami, konvertor vloží stejné relativní cesty do Markdownu. Ujistěte se, že obrázky jsou zkopírovány vedle souboru `.md`, nebo upravte `options` tak, aby embedovaly data‑URL ve formátu base‑64: + +```python +options.embed_images = True # Converts images to inline base64 strings +``` + +### 2. Speciální znaky a entity + +HTML entity jako ` ` nebo `&` jsou automaticky dekódovány. Pokud je však potřebujete zachovat doslovně, nastavte: + +```python +options.decode_entities = False +``` + +### 3. Velké soubory + +U masivních HTML dokumentů (stovky megabajtů) zvažte streamování vstupu nebo zvýšení limitu rekurze v Pythonu. Engine Aspose je paměťově úsporný, ale doporučuje se 64‑bitový Python interpreter. + +## Proč je tento přístup lepší než DIY regex + +Můžete být v pokušení psát regulární výrazy, které nahradí `

` za `# `, `

` za zalomení řádku atd. To funguje pro malé úryvky, ale rychle selže u vnořených tagů, poškozeného markup nebo složitých tabulek. Použití specializované knihovny: + +- Zaručuje **HTML compliance** (parser opraví poškozené tagy). +- Zvládá **edge cases** jako skripty, style bloky a komentáře bez dalšího zásahu. +- Produkuje **consistent Markdown**, který mohou bez dalšího čištění zpracovat nástroje jako Pandoc nebo Jekyll. + +Stručně řečeno, workflow **convert html to markdown**, které jsme ukázali, je robustní, udržitelné a připravené do produkce. + +## Rychlé shrnutí + +- Nainstalujte `aspose-html` (`pip install aspose-html`). +- Načtěte svůj HTML pomocí `HTMLDocument`. +- Volitelně upravte `MarkdownSaveOptions`. +- Zavolejte `Converter.convert_html` a získáte soubor `.md`. + +To je celý **create markdown from html** pipeline – žádné skryté kroky, žádné externí služby, jen čistý Python. + +## Další kroky a související témata + +Nyní, když ovládáte základní **html to markdown conversion**, můžete zkusit: + +- **Batch processing**: projít celý adresář HTML souborů. +- **Integraci se statickými generátory stránek** jako Hugo nebo MkDocs. +- **Vlastní post‑processing**: použít knihovny `markdown` nebo `mistune` k dalším úpravám výstupu. +- **Alternativní knihovny**: `html2text`, `markdownify` nebo `pandoc` pro jiné sady funkcí. + +Každý z těchto kroků staví na základech, které jsme probrali, a všechny těží ze stejného myšlenkového přístupu **html to markdown python**. + +--- + +*Šťastné kódování! Pokud narazíte na problémy nebo máte nápady, jak tento skript rozšířit, zanechte komentář níže – pojďme konverzaci udržet živou.* + +## Co byste se měli naučit dál? + +Následující tutoriály pokrývají úzce související témata, která staví na technikách předvedených v tomto průvodci. Každý zdroj obsahuje kompletní funkční ukázky kódu s krok‑za‑krokem vysvětleními, které vám pomohou zvládnout další funkce API a prozkoumat alternativní implementační přístupy ve vašich projektech. + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) + +{{< /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/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md b/html/czech/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md new file mode 100644 index 000000000..8d35f695a --- /dev/null +++ b/html/czech/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md @@ -0,0 +1,210 @@ +--- +category: general +date: 2026-07-31 +description: Naučte se, jak vytvořit SVG dokument, přidat kruh a rychle uložit SVG + soubor. Exportujte grafiku jako SVG pomocí několika řádků kódu v Pythonu. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create svg document +- save svg file +- export graphic as svg +- add circle to svg +language: cs +lastmod: 2026-07-31 +og_description: Vytvořte SVG dokument, přidejte kruh a uložte SVG soubor během několika + sekund. Tento návod vám ukáže, jak exportovat grafiku jako SVG s jasným, spustitelným + kódem. +og_image_alt: Screenshot of a red circle inside an SVG file named circle.svg +og_title: Vytvořit SVG dokument – přidat kruh a uložit jako SVG +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: Learn how to create SVG document, add a circle, and save SVG file quickly. + Export graphic as SVG with a few lines of Python code. + headline: Create SVG Document – Add a Circle and Save as SVG + type: TechArticle +- description: Learn how to create SVG document, add a circle, and save SVG file quickly. + Export graphic as SVG with a few lines of Python code. + name: Create SVG Document – Add a Circle and Save as SVG + steps: + - name: Pro tip + text: If you plan to generate many files in a loop, give each `Drawing` a unique + name or use `io.BytesIO` to keep everything in memory until you’re ready to + write. + - name: Edge case – Transparent background + text: 'If you need a transparent background (the default for SVG), you can skip + setting a `fill` on the root. For a white background, add:' + - name: 'Bonus: Export graphic as SVG programmatically' + text: 'If you need the SVG content as a string—for example, to embed it in an + HTML email—you can call `dwg.tostring()` instead of `save()`:' + type: HowTo +- questions: + - answer: Swap `dwg.circle` for `dwg.rect`, `dwg.ellipse`, or even a custom `` + string. The API is consistent across shapes. + question: What if I want a different shape? + - answer: Absolutely. The file you just created can be referenced with `Red circle` or inlined with `` tags. + question: Can I embed the SVG directly in HTML? + - answer: You could, but libraries like `svgwrite` handle namespace quirks and make + the code far more maintainable—especially when you start adding gradients or + animations. + question: Why not write raw XML? + type: FAQPage +tags: +- svg +- python +- vector-graphics +- programming-tutorial +title: Vytvořte SVG dokument – přidejte kruh a uložte jako SVG +url: /cs/python/general/create-svg-document-add-a-circle-and-save-as-svg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Vytvoření SVG dokumentu – Přidání kruhu a uložení jako SVG + +Už jste někdy potřebovali **create SVG document** z kódu, ale nevedeli ste, kde začít? Nejste v tom sami; mnoho vývojářů narazí na tuto překážku, když poprvé experimentují s vektorovou grafikou. V tomto tutoriálu projdeme malý, samostatný příklad, který vám ukáže, jak **add circle to SVG**, poté **save SVG file**, abyste mohli **export graphic as SVG** pro použití na webu nebo v designových nástrojích. + +Budeme držet věci lehké: jen několik řádků Pythonu, populární knihovnu pro SVG a špetku vysvětlení. Na konci budete mít připravený `circle.svg` ve své složce a pochopíte, proč je každý krok důležitý—žádné vágní zkratky typu „viz dokumentaci“. + +## Co budete potřebovat + +- Python 3.8+ (jakákoli recent verze funguje) +- Balíček `svgwrite` – nainstalujte jej pomocí `pip install svgwrite` +- Textový editor nebo IDE (VS Code, PyCharm nebo i Notepad stačí) +- Oprávnění k zápisu do adresáře, kam chcete soubor uložit + +To je vše. Žádné těžkopádné závislosti, žádné externí služby. + +## Krok 1: Nastavení SVG dokumentu + +Vytvoření SVG dokumentu je tak jednoduché, jako vytvořit objekt `Drawing` z `svgwrite`. Představte si tento objekt jako prázdné plátno, kde žije každý tvar. + +```python +import svgwrite + +# Step 1: Create a new SVG document (canvas) 800×800 pixels +dwg = svgwrite.Drawing(filename="circle.svg", size=("200px", "200px")) +``` + +> **Proč je to důležité:** Třída `Drawing` za vás řeší veškerý XML boilerplate—jmenné prostory, hlavičky a kořenový prvek ``. Tím, že hned na začátku zadáte název souboru, už víme, kam soubor skončí, což pozdější krok **save svg file** učiní triviálním. + +### Tip +Pokud plánujete generovat mnoho souborů ve smyčce, dejte každému `Drawing` unikátní název nebo použijte `io.BytesIO`, abyste vše drželi v paměti, dokud nebudete připraveni zapisovat. + +## Krok 2: Přidání kruhu do SVG + +Nyní, když dokument existuje, pojďme **add circle to SVG**. Metoda `add()` přijímá jakýkoli objekt tvaru; `Circle` je ideální pro jednoduchou červenou tečku uprostřed. + +```python +# Step 2: Add a red circle element to the SVG root +center = (100, 100) # x, y coordinates (half of 200px canvas) +radius = 80 # radius in pixels +circle = dwg.circle(center=center, r=radius, fill='red') +dwg.add(circle) +``` + +> **Proč používáme proměnné `center` a `radius`:** Vkládání čísel přímo do kódu ztěžuje čtení a údržbu. Pojmenováním hodnot objasňujeme záměr—tento kruh leží přesně uprostřed plátna 200 × 200 a je dostatečně velký, aby byl vidět. + +### Okrajový případ – Průhledné pozadí +Pokud potřebujete průhledné pozadí (výchozí pro SVG), můžete vynechat nastavení `fill` na kořeni. Pro bílé pozadí přidejte: + +```python +dwg.add(dwg.rect(insert=(0, 0), size=("200px", "200px"), fill='white')) +``` + +Umístěte to před přidáním kruhu, aby obdélník byl pod ním. + +## Krok 3: Uložení SVG souboru + +S tvarem na místě je posledním krokem **save SVG file**. Metoda `save()` zapíše XML na disk a protože jsme už `Drawing`u zadali název souboru, stačí jedno volání. + +```python +# Step 3: Save the SVG document to a file +dwg.save() +print("✅ circle.svg has been created in the current directory.") +``` + +> **Co se děje pod kapotou?** `svgwrite` serializuje strom elementů do řetězce, přidá XML deklaraci a zapíše ho pomocí kódování UTF‑8. Pokud cílový adresář neexistuje, Python vyvolá `FileNotFoundError`; ujistěte se, že cesta je platná nebo ji vytvořte pomocí `os.makedirs()`. + +### Bonus: Programatické exportování grafiky jako SVG +Pokud potřebujete obsah SVG jako řetězec—například pro vložení do HTML e‑mailu—můžete zavolat `dwg.tostring()` místo `save()`: + +```python +svg_content = dwg.tostring() +# Now you can send svg_content over a network, store it in a DB, etc. +``` + +## Kompletní funkční příklad + +Spojením všeho dohromady získáte kompletní, připravený ke spuštění skript: + +```python +import svgwrite +import os + +def create_svg_with_circle(output_path: str): + """ + Creates an SVG file containing a single red circle. + Parameters + ---------- + output_path: str + Full path where the SVG file will be saved. + """ + # Ensure the directory exists + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + # Initialise the SVG document (800×800 canvas) + dwg = svgwrite.Drawing(filename=output_path, size=("200px", "200px")) + + # Optional: add a white background rectangle + dwg.add(dwg.rect(insert=(0, 0), size=("200px", "200px"), fill='white')) + + # Add a red circle in the centre + center = (100, 100) + radius = 80 + circle = dwg.circle(center=center, r=radius, fill='red') + dwg.add(circle) + + # Save the file – this is the key step to **save svg file** + dwg.save() + print(f"✅ SVG saved to {output_path}") + +if __name__ == "__main__": + # Change this path to wherever you want the file + output_file = os.path.join(os.getcwd(), "circle.svg") + create_svg_with_circle(output_file) +``` + +**Očekávaný výstup:** Po spuštění skriptu uvidíte soubor `circle.svg` ve stejné složce. Otevřením v prohlížeči nebo jakémkoli vektorovém editoru se zobrazí červený kruh uprostřed bílého čtverce—přesně to, co jsme naprogramovali. + +## Časté otázky a úskalí + +- **Co když chci jiný tvar?** Vyměňte `dwg.circle` za `dwg.rect`, `dwg.ellipse` nebo dokonce za vlastní řetězec ``. API je napříč tvary konzistentní. +- **Mohu SVG vložit přímo do HTML?** Ano. Soubor, který jste právě vytvořili, můžete odkazovat pomocí `Red circle` nebo vložit přímo pomocí značek ``. +- **Proč nepíšeme čisté XML?** Můžete, ale knihovny jako `svgwrite` řeší zvláštnosti jmenných prostorů a činí kód mnohem udržitelnějším—obzvláště když začnete přidávat gradienty nebo animace. + +## Závěr + +Nyní už víte, jak **create SVG document**, **add circle to SVG** a **save SVG file**, abyste mohli **export graphic as SVG** pomocí několika řádků Pythonu. Tento vzor je škálovatelný: nahraďte kruh libovolným vektorovým tvarem, iterujte přes data pro generování grafů nebo hromadně zpracovávejte assety pro designový systém. + +Další kroky? Zkuste přidat textové popisky, experimentovat s gradienty nebo vygenerovat celou galerii ikon v jednom skriptu. Pokud vás zajímají pokročilejší funkce, podívejte se do dokumentace `svgwrite` na skupiny (``), transformace a podporu animací. + +Šťastné kódování a ať jsou vaše vektory vždy ostré! + +## Co byste se měli naučit dál? + +Následující tutoriály pokrývají úzce související témata, která staví na technikách předvedených v tomto průvodci. Každý zdroj obsahuje kompletní funkční ukázky kódu s podrobnými vysvětleními, které vám pomohou zvládnout další funkce API a prozkoumat alternativní přístupy k implementaci ve vašich projektech. + +- [Uložit SVG dokument v Aspose.HTML pro Java](/html/english/java/saving-html-documents/save-svg-document/) +- [Vytvořit a spravovat SVG dokumenty v Aspose.HTML pro Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [svg to png java – Převod SVG na obrázek s Aspose.HTML pro Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /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/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md b/html/czech/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md new file mode 100644 index 000000000..7686280f7 --- /dev/null +++ b/html/czech/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-07-31 +description: Jak omezit rekurzi při zpracování HTML zdrojů. Naučte se konfigurovat + možnosti zpracování zdrojů, nastavit maximální hloubku a efektivně ukládat zpracované + soubory. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to limit recursion +- resource handling options +- max handling depth +- HTMLDocument save settings +- prevent infinite loops +language: cs +lastmod: 2026-07-31 +og_description: Jak omezit rekurzi při práci s HTML dokumenty. Tento průvodce vám + ukáže, jak nastavit možnosti zpracování zdrojů, nastavit bezpečnou maximální hloubku + a vyhnout se nekonečným smyčkám. +og_image_alt: Screenshot illustrating how to limit recursion settings in an HTML processing + script +og_title: Jak omezit rekurzi při zpracování HTML – krok za krokem +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: How to limit recursion while handling HTML resources. Learn to configure + resource handling options, set max depth, and save processed files efficiently. + headline: How to Limit Recursion in HTML Processing – Complete Guide + type: TechArticle +- description: How to limit recursion while handling HTML resources. Learn to configure + resource handling options, set max depth, and save processed files efficiently. + name: How to Limit Recursion in HTML Processing – Complete Guide + steps: + - name: Understanding `max_handling_depth` + text: '- **Depth 0** – Only the root HTML file is processed; no external resources + are followed. - **Depth 1** – The root file *and* any first‑level resources + (e.g., a CSS file referenced directly) are processed. - **Depth 3** – The root, + its direct resources, and the resources of those resources, up to th' + - name: Why a Separate `SaveOptions` Object? + text: Separating **resource handling** from **serialization** keeps your code + modular. You could later add compression, embedding preferences, or different + output formats (e.g., PDF) without touching the recursion logic. + - name: Expected Result + text: '- The output file (`big_document_processed.html`) will contain the original + markup **plus** any resources discovered within the three‑level limit. - Any + deeper‑nested resources are omitted, preventing runaway recursion. - If the + original document referenced a circular chain (e.g., page A → page B → ' + type: HowTo +tags: +- recursion +- HTML processing +- Python +- resource handling +title: Jak omezit rekurzi při zpracování HTML – kompletní průvodce +url: /cs/python/general/how-to-limit-recursion-in-html-processing-complete-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak omezit rekurzi při zpracování HTML – Kompletní průvodce + +Už jste se někdy zamysleli **jak omezit rekurzi**, když parsujete obrovský HTML soubor? Pravděpodobně jste narazili na chybu přetečení zásobníku nebo váš skript prostě zůstal viset, protože zdroj neustále načítá další zdroje. Stručně řečeno, nekontrolovaná hloubka rekurze může proměnit jednoduchou transformaci v noční můru. + +Dobrá zpráva? Můžete procesoru říct, aby po bezpečném počtu úrovní přestal dál kopat, a tak udržet paměťový otisk pod kontrolou. Níže uvidíte praktický příklad, který ukazuje **jak omezit rekurzi** pomocí možností zpracování zdrojů, proč je to důležité a jak uložit vyčištěný dokument bez problémů. + +> **Rychlý tip:** Nastavte `max_handling_depth` na `3` a zabráníte následování jakékoli hlubší vnořenosti – ideální pro velké, samoreferenční HTML balíčky. + +--- + +## Co se naučíte + +- Proč je nekontrolovaná rekurze riziková při zpracování HTML dokumentů. +- Jak nakonfigurovat **resource handling options** pro vynucení maximální hloubky. +- Přesný kód potřebný k načtení, zpracování a bezpečnému uložení HTML souboru. +- Časté úskalí (např. kruhové zahrnutí) a jak se jim vyhnout. +- Tipy, jak upravit limit hloubky pro různé velikosti projektů. + +Žádné externí knihovny nejsou potřeba mimo standardní balíček pro práci s HTML (ukázka níže používá obecnou třídu `HTMLDocument`, kterou poskytuje mnoho SDK, např. Aspose.HTML pro Python). Pokud používáte jinou knihovnu, koncepty se přenášejí přímo. + +--- + +## Požadavky + +Než se pustíme dál, ujistěte se, že máte: + +| Požadavek | Důvod | +|-------------|--------| +| Python 3.9+ (nebo srovnatelný runtime) | Moderní syntaxe a typové nápovědy | +| Knihovnu pro zpracování HTML, která podporuje `ResourceHandlingOptions` (např. `aspose.html`) | Poskytuje vlastnost `max_handling_depth` | +| Velký HTML soubor (`big_document.html`), který chcete vyčistit | Ukazuje limit rekurze v praxi | +| Oprávnění k zápisu do výstupní složky | Potřebné pro `doc.save(...)` | + +Pokud něco chybí, nainstalujte knihovnu pomocí `pip install aspose.html` (nebo příslušného balíčku) a budete připraveni. + +--- + +## Krok 1: Načtení HTML dokumentu + +První věc, kterou uděláte, je vytvořit instanci `HTMLDocument`, která ukazuje na váš zdrojový soubor. Představte si tento objekt jako vstupní bod do celého stromu DOM a také jako bránu ke všem externím zdrojům (obrázky, CSS, skripty), na které dokument může odkazovat. + +```python +# Step 1: Load the HTML document +doc = HTMLDocument("YOUR_DIRECTORY/big_document.html") +``` + +> **Proč je to důležité:** Pouhé načtení dokumentu ještě nespouští rekurzi, ale připraví interní parser na pozdější objevování odkazovaných zdrojů. Pokud dokument obsahuje značky `` paths to local files. + - name: 2. Unicode and Right‑to‑Left Languages + text: Aspose.HTML ships with a set of built‑in fonts, but for full Unicode coverage + you may need to embed custom fonts. + - name: 3. Large Documents + text: For HTML files exceeding a few megabytes, you might hit memory limits. The + library offers a streaming API, but for most use‑cases the one‑call `convert` + method suffices. + type: HowTo +- questions: + - answer: Yes. Aspose.HTML renders `` elements as raster images in the PDF, + preserving visual fidelity. + question: Does this work with HTML5 features like ``? + - answer: Absolutely. Use the overload that accepts `PdfSaveOptions` and set properties + like `author`, `title`, or `subject`. + question: Can I set PDF metadata (author, title)? + - answer: 'The `PdfSaveOptions` class includes `encrypt` and `user_password` fields. + Combine them with the `convert` call for secure PDFs. --- ## ## Next Steps and + Related Topics Now that you’ve learned how to **generate pdf from html** with + Aspose.HTML, you might want to explore: * **Batch conversion** – loop' + question: What about password‑protecting the PDF? + type: FAQPage +tags: +- Python +- Aspose.HTML +- PDF conversion +title: Návod HTML na PDF – Převod HTML souborů do PDF pomocí Aspose.HTML +url: /cs/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# HTML do PDF tutoriál – Převod HTML souborů do PDF pomocí Aspose.HTML + +Už jste se někdy zamysleli, jak převést webovou stránku na tisknutelný PDF, aniž byste museli manipulovat s dialogy tisku v prohlížeči? Přesně to řeší **html to pdf tutorial**. V tomto průvodci uvidíte, jak **generate pdf from html** během pouhých tří řádků Pythonu, pomocí výkonné knihovny **Aspose.HTML**. + +Pokud jste někdy potřebovali **create pdf from html** pro faktury, zprávy nebo e‑knihy, jste na správném místě. Také se podíváme na nuance **convert html file pdf** – jako je kódování, vkládání obrázků a zachování fontů – abyste se později nepřekvapili. + +## Co tento tutoriál pokrývá + +* Rychlý přehled předpokladů (verze Pythonu, instalace Aspose.HTML a ukázkový HTML soubor). +* Krok‑za‑krokem **html to pdf tutorial**, který vás provede importem, konfigurací a voláním konvertoru. +* Proč je Aspose.HTML solidní volbou pro scénář **aspose html to pdf**, včetně poznámek o výkonu a věrnosti. +* Tipy pro běžné okrajové případy – velké obrázky, externí CSS a Unicode znaky. +* Kompletní spustitelný skript, který můžete dnes zkopírovat a spustit. + +Na konci tohoto článku budete schopni **generate pdf from html** na jakékoli platformě, která podporuje Python, a pochopíte „proč“ za každým řádkem kódu. + +--- + +## Předpoklady – Co potřebujete před zahájením + +Než se ponoříme do kódu, ujistěte se, že máte následující: + +| Požadavek | Důvod | +|-------------|--------| +| Python 3.8 nebo novější | Kola (wheels) Aspose.HTML cílí na 3.8+. | +| `pip` přístup k instalaci balíčků | Stáhneme `aspose-html` z PyPI. | +| Jednoduchý HTML soubor (`input.html`) | Toto je zdroj, ze kterého **convert html file pdf**. | +| Oprávnění k zápisu do výstupní složky | Skript vytvoří `output.pdf`. | + +Knihovnu můžete nainstalovat jedním příkazem: + +```bash +pip install aspose-html +``` + +> **Tip:** Pokud pracujete ve virtuálním prostředí (vysoce doporučeno), nejprve jej aktivujte, aby byly závislosti přehledné. + +--- + +## ## HTML to PDF Tutorial – Nastavení prostředí + +První H2 již obsahuje naše **primary keyword** (`html to pdf tutorial`). Tato sekce zajistí, že je vaše prostředí připravené. + +```python +# Verify the installed version (optional but handy) +import aspose.html as ah +print(f"Aspose.HTML version: {ah.__version__}") +``` + +Spuštění úryvku by mělo vypsat něco jako `Aspose.HTML version: 23.9`. Pokud vidíte chybu importu, zkontrolujte, že byl balíček správně nainstalován a že používáte správný Python interpreter. + +--- + +## ## Krok 1: Import třídy Converter (Generování PDF z HTML) + +Nyní přineseme třídu, která vykonává těžkou práci. Tento řádek je srdcem operace **generate pdf from html**. + +```python +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +``` + +Proč importujeme jen `Converter`? +* Udržuje jmenný prostor čistý a zabraňuje náhodným kolizím názvů. +* Třída samotná stačí pro jednoduchý úkol **create pdf from html**, takže neplatíme za načítání zbytečných modulů. + +--- + +## ## Krok 2: Definice vstupních a výstupních cest (Convert HTML File PDF) + +Dále řekneme skriptu, kde najít zdrojový HTML a kam umístit výsledný PDF. Toto je část, kde **convert html file pdf**. + +```python +# Step 2: Specify the source HTML file and the destination PDF file +input_html = "YOUR_DIRECTORY/input.html" +output_pdf = "YOUR_DIRECTORY/output.pdf" +``` + +Nahraďte `YOUR_DIRECTORY` absolutní nebo relativní cestou, která odpovídá struktuře vašeho projektu. Pokud plánujete zpracovávat více souborů, zvažte iteraci přes seznam cest – jen nezapomeňte, aby každé výstupní jméno bylo unikátní. + +--- + +## ## Krok 3: Provedení konverze jedním voláním (Create PDF from HTML) + +Nakonec je samotná konverze jedním voláním metody. To je okamžik, kdy skutečně **create pdf from html** bez psaní jakéhokoli boilerplate kódu. + +```python +# Step 3: Convert the HTML document to PDF in a single call +Converter.convert(input_html, output_pdf) +print(f"✅ PDF generated at: {output_pdf}") +``` + +Uvnitř `Converter.convert` parsuje HTML, řeší CSS, vkládá obrázky a zapisuje PDF, které odráží renderovací engine prohlížeče. Aspose.HTML používá vlastní layout engine, takže získáte konzistentní výsledky bez ohledu na verzi prohlížeče klienta. + +### Proč použít Aspose.HTML pro tento úkol? + +* **Vysoká věrnost** – Komplexní CSS (flexbox, grid) je respektováno. +* **Žádné externí závislosti** – Není potřeba headless prohlížeč jako Chromium. +* **Cross‑platform** – Funguje na Windows, Linuxu i macOS se stejným kódem. +* **Flexibilita licence** – K dispozici je bezplatná evaluační verze pro testování. + +--- + +## ## Řešení běžných okrajových případů + +I i jednoduchý třířádkový skript může narazit na problémy, pokud zdrojový HTML není „dobře strukturovaný“. Níže jsou některé scénáře, se kterými se můžete setkat, a jak je řešit. + +### 1. Externí obrázky nebo zdroje + +Pokud váš HTML odkazuje na obrázky hostované na internetu, ujistěte se, že stroj, který skript spouští, má přístup k internetu. Pro offline sestavení stáhněte assety a upravte cesty `` na lokální soubory. + +```python +# Example: Ensure images are local +# +``` + +### 2. Unicode a jazyky psané zprava doleva + +Aspose.HTML obsahuje sadu vestavěných fontů, ale pro úplnou Unicode podporu možná budete muset vložit vlastní fonty. + +```python +from aspose.html import FontSettings, FontSource + +# Register a custom font folder (optional) +font_settings = FontSettings() +font_settings.add_font_source(FontSource.folder("fonts/")) +Converter.convert(input_html, output_pdf, font_settings=font_settings) +``` + +### 3. Velké dokumenty + +U HTML souborů přesahujících několik megabajtů můžete narazit na limity paměti. Knihovna nabízí streaming API, ale pro většinu případů stačí jednorázová metoda `convert`. + +> **Pozor:** Bezplatná evaluační verze přidává vodoznak po prvních 2 stránkách. Pořiďte licenci, pokud potřebujete čisté PDF pro produkci. + +--- + +## ## Kompletní funkční příklad + +Níže je kompletní skript, který můžete vložit do souboru pojmenovaného `html_to_pdf.py`. Spusťte jej pomocí `python html_to_pdf.py` poté, co umístíte `input.html` do stejné složky. + +```python +# html_to_pdf.py +# A complete, self‑contained example that converts an HTML file to PDF using Aspose.HTML. + +from aspose.html import Converter + +# ------------------------------------------------------------------ +# Configuration – adjust these paths to match your environment +# ------------------------------------------------------------------ +input_html = "input.html" # <-- your source HTML +output_pdf = "output.pdf" # <-- desired PDF output + +# ------------------------------------------------------------------ +# Conversion – this single call does the heavy lifting +# ------------------------------------------------------------------ +try: + Converter.convert(input_html, output_pdf) + print(f"✅ Successfully generated PDF: {output_pdf}") +except Exception as e: + # Provide a friendly error message – helps with debugging + print(f"❌ Conversion failed: {e}") +``` + +**Očekávaný výstup** (v konzoli): + +``` +✅ Successfully generated PDF: output.pdf +``` + +Otevřete `output.pdf` v libovolném PDF prohlížeči; měli byste vidět váš HTML vykreslený přesně tak, jak se zobrazuje v moderním prohlížeči. + +--- + +## ## Ověření výsledku + +Aby jste se ujistili, že konverze proběhla úspěšně, můžete provést rychlou kontrolu: + +```python +import os + +if os.path.getsize(output_pdf) > 0: + print("File size looks good – PDF is not empty.") +else: + print("Uh‑oh, the PDF is empty. Check the input HTML and permissions.") +``` + +Pokud je velikost souboru nenulová a obsah vypadá správně, gratulujeme – zvládli jste **html to pdf tutorial**! + +--- + +## ## Často kladené otázky + +**Q: Funguje to s HTML5 funkcemi jako ``?** +A: Ano. Aspose.HTML vykresluje `` elementy jako rastrové obrázky v PDF, zachovávající vizuální věrnost. + +**Q: Mohu nastavit metadata PDF (autor, název)?** +A: Rozhodně. Použijte přetížení, které přijímá `PdfSaveOptions` a nastavte vlastnosti jako `author`, `title` nebo `subject`. + +**Q: Co s ochranou PDF heslem?** +A: Třída `PdfSaveOptions` obsahuje pole `encrypt` a `user_password`. Kombinujte je s voláním `convert` pro zabezpečené PDF. + +--- + +## ## Další kroky a související témata + +Nyní, když jste se naučili **generate pdf from html** pomocí Aspose.HTML, můžete chtít prozkoumat: + +* **Dávková konverze** – iterace přes adresář HTML souborů a vytvoření PDF pro každý. +* **HTML do PDF s vlastním CSS** – programově vložit stylopis před konverzí. +* **Sloučení PDF** – spojit více PDF vygenerovaných z různých HTML stránek pomocí Aspose.PDF. +* **Nasazení jako mikroservisu** – zpřístupnit logiku konverze přes Flask nebo FastAPI endpoint pro generování PDF na požádání. + +Všechny tyto stavějí na základních konceptech pokrytých v tomto **html to pdf tutorial**, a zachovávají konzistentní workflow **aspose html to pdf** napříč projekty. + +--- + +## Závěr + +Prošli jsme stručným **html to pdf tutorial**, který vám ukazuje, jak **create pdf from html** pomocí třídy `Converter` z Aspose.HTML. Importováním správné třídy, nastavením cesty k vašemu zdrojovému HTML a voláním `convert` můžete spolehlivě **convert html file pdf** v libovolném Python prostředí. + +Neváhejte skript upravit, experimentovat se styly nebo jej integrovat do větších aplikací. Pokud narazíte na problémy, podívejte se znovu na sekci okrajových případů nebo zkontrolujte oficiální dokumentaci Aspose pro podrobnější možnosti konfigurace. + +Šťastné kódování a ať vaše PDF vždy vypadají tak uhlazeně jako vaše webové stránky! + +## Co byste se měli naučit dál? + +Následující tutoriály pokrývají úzce související témata, která staví na technikách předvedených v tomto průvodci. Každý zdroj obsahuje kompletní funkční ukázky kódu s podrobnými vysvětleními, které vám pomohou zvládnout další funkce API a prozkoumat alternativní přístupy k implementaci ve vašich projektech. + +- [Jak převést HTML do PDF v Javě – Použití Aspose.HTML pro Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) +- [Vytvořit PDF z HTML pomocí Aspose.HTML pro Java – Sandbox](/html/english/java/configuring-environment/implement-sandboxing/) +- [Převod HTML do PDF s Aspose.HTML – Kompletní průvodce manipulací](/html/english/) + +{{< /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/python/general/create-markdown-from-html-in-python-complete-guide/_index.md b/html/dutch/python/general/create-markdown-from-html-in-python-complete-guide/_index.md new file mode 100644 index 000000000..39f418800 --- /dev/null +++ b/html/dutch/python/general/create-markdown-from-html-in-python-complete-guide/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-07-31 +description: Maak snel markdown van HTML met Python. Leer hoe je HTML naar markdown + converteert met een eenvoudig script en ontdek HTML‑naar‑markdown Python‑opties. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create markdown from html +- convert html to markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: nl +lastmod: 2026-07-31 +og_description: Maak markdown van HTML met een beknopt Python‑script. Deze tutorial + laat zien hoe je HTML naar markdown converteert, behandelt opties voor HTML‑naar‑markdown + conversie, en biedt een kant‑klaar voorbeeld voor Python‑gebruikers die HTML naar + markdown willen omzetten. +og_image_alt: Screenshot of a Python script that converts an HTML file into a Markdown + document +og_title: Maak markdown van HTML met Python – Stapsgewijze gids +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: Create markdown from HTML using Python quickly. Learn how to convert + HTML to markdown with a simple script and explore html to markdown python options. + headline: Create markdown from HTML in Python – Complete Guide + type: TechArticle +- description: Create markdown from HTML using Python quickly. Learn how to convert + HTML to markdown with a simple script and explore html to markdown python options. + name: Create markdown from HTML in Python – Complete Guide + steps: + - name: Expected Output + text: 'Running `python convert_html_to_md.py` should print something like:' + - name: 1. Embedded Images + text: 'If your HTML contains `` tags with relative paths, the converter will + embed the same relative paths in Markdown. Make sure the images are copied alongside + the `.md` file, or adjust the `options` to embed base‑64 data URLs:' + - name: 2. Special Characters & Entities + text: 'HTML entities like ` ` or `&` are automatically decoded. However, + if you need to preserve them literally, set:' + - name: 3. Large Files + text: For massive HTML documents (hundreds of megabytes), consider streaming the + input or increasing the Python recursion limit. The Aspose engine is memory‑efficient, + but a 64‑bit Python interpreter is recommended. + type: HowTo +tags: +- python +- html +- markdown +title: Maak markdown van HTML in Python – Complete gids +url: /nl/python/general/create-markdown-from-html-in-python-complete-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Markdown maken vanuit HTML in Python – Complete Gids + +Heb je je ooit afgevraagd **hoe je HTML** kunt omzetten naar nette, leesbare Markdown zonder je haar te verliezen? Je bent niet de enige. Of je nu een blog migreert, een static‑site generator bouwt, of gewoon een snelle eenmalige conversie nodig hebt, de mogelijkheid om **markdown te maken vanuit HTML** is een handige vaardigheid voor elke Python‑ontwikkelaar. + +In deze tutorial lopen we stap voor stap door een eenvoudige, end‑to‑end oplossing die **HTML naar markdown converteert** met behulp van één goed gedocumenteerde bibliotheek. Aan het einde heb je een herbruikbaar script, begrijp je de nuances van **html to markdown conversion**, en weet je hoe je het kunt aanpassen voor je eigen projecten. + +## Wat je gaat leren + +- Installeer het juiste Python‑pakket voor **html to markdown python** taken. +- Laad een HTML‑bestand en configureer de conversie‑opties. +- Voer de conversie uit en controleer het resulterende Markdown‑bestand. +- Handhaaf veelvoorkomende randgevallen zoals ingesloten afbeeldingen of speciale tekens. + +Ervaring met Markdown‑parsers is niet vereist—alleen een basiskennis van Python en bestands‑I/O. + +## Vereisten + +Voordat we beginnen, zorg dat je het volgende hebt: + +1. Python 3.8 of nieuwer geïnstalleerd op je machine. +2. Een terminal of opdrachtprompt waar je je prettig bij voelt. +3. Een HTML‑bestand dat je wilt transformeren (we noemen het `sample.html`). + +Dat is alles. Als je iets mist, pauzeer even om Python van python.org te installeren en een klein HTML‑testbestand aan te maken—de rest wordt hier behandeld. + +## Stap 1: Installeer Aspose.HTML voor Python via pip + +De makkelijkste manier om **markdown te maken vanuit HTML** in Python te doen, is het `aspose.html`‑pakket te gebruiken, dat een betrouwbare `MarkdownSaveOptions`‑klasse bevat. Voer het volgende commando uit: + +```bash +pip install aspose-html +``` + +> **Pro tip:** Als je in een virtuele omgeving werkt (sterk aanbevolen), activeer deze eerst; anders wordt het pakket globaal geïnstalleerd en kan het conflicteren met andere projecten. + +## Stap 2: Importeer de Vereiste Klassen + +Zodra de bibliotheek is geïnstalleerd, importeer je de benodigde objecten. Dit kleine fragment zet de basis voor alles wat volgt: + +```python +# Import the core Aspose.HTML classes +from aspose.html import HTMLDocument, Converter, MarkdownSaveOptions +``` + +Waarom juist deze drie? `HTMLDocument` laadt en parseert het bronbestand, `Converter` coördineert de transformatie, en `MarkdownSaveOptions` laat je de uitvoer‑indeling fijn afstemmen—perfect voor **html to markdown conversion** taken. + +## Stap 3: Laad het HTML‑Document dat je wilt Converteren + +Nu lezen we daadwerkelijk het HTML‑bestand. Vervang `YOUR_DIRECTORY` door het pad waar `sample.html` zich bevindt: + +```python +# Step 1: Load the HTML document you want to convert +doc = HTMLDocument("YOUR_DIRECTORY/sample.html") +``` + +Als het bestand niet wordt gevonden, zal Python een `FileNotFoundError` werpen. Controleer het pad of gebruik `os.path.join` voor platform‑onafhankelijke veiligheid. + +## Stap 4: Maak Markdown Save Options (Optioneel maar Krachtig) + +Het `MarkdownSaveOptions`‑object laat je zaken regelen zoals regeleinden, kopstijl, en of HTML‑entiteiten behouden blijven. De standaardinstellingen leveren al nette Markdown, maar je kunt ze aanpassen indien nodig: + +```python +# Step 2: Create Markdown save options (defaults produce standard Markdown) +options = MarkdownSaveOptions() +# Example tweak: preserve original line breaks +options.preserve_line_breaks = True +``` + +Voel je vrij om deze aanpassing over te slaan—ons script werkt direct uit de doos. Deze stap illustreert alleen hoe je de conversie kunt afstemmen op specifieke **html to markdown python** eisen. + +## Stap 5: Voer de Conversie uit + +Het zware werk gebeurt in één regel. We geven het document, de opties en de doel‑bestandsnaam door aan de `Converter`: + +```python +# Step 3: Convert the HTML document to a Markdown file +Converter.convert_html(doc, options, "YOUR_DIRECTORY/sample.md") +``` + +Na uitvoering vind je `sample.md` naast je oorspronkelijke HTML‑bestand, gevuld met netjes geformatteerde Markdown. + +## Volledig Script – Klaar om uit te voeren + +Alles bij elkaar, hier is een compleet, uitvoerbaar script dat je kunt kopiëren‑plakken naar `convert_html_to_md.py`: + +```python +# convert_html_to_md.py +import os +from aspose.html import HTMLDocument, Converter, MarkdownSaveOptions + +def convert_html_to_markdown(html_path: str, md_path: str) -> None: + """ + Convert an HTML file to Markdown. + + Parameters + ---------- + html_path : str + Path to the source HTML file. + md_path : str + Desired output path for the Markdown file. + """ + # Verify that the source exists + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + # Load the HTML document + doc = HTMLDocument(html_path) + + # Set up conversion options (you can tweak these) + options = MarkdownSaveOptions() + # Example: keep original line breaks for better diffing + options.preserve_line_breaks = True + + # Perform conversion + Converter.convert_html(doc, options, md_path) + print(f"✅ Conversion complete! Markdown saved to: {md_path}") + +if __name__ == "__main__": + # Adjust these paths to match your environment + html_file = "YOUR_DIRECTORY/sample.html" + markdown_file = "YOUR_DIRECTORY/sample.md" + convert_html_to_markdown(html_file, markdown_file) +``` + +### Verwachte Output + +Het uitvoeren van `python convert_html_to_md.py` zou iets als het volgende moeten afdrukken: + +``` +✅ Conversion complete! Markdown saved to: YOUR_DIRECTORY/sample.md +``` + +Open `sample.md` en je ziet een Markdown‑weergave van de originele HTML—koppen omgezet in `#`‑symbolen, alinea’s als platte tekst, links geformatteerd als `[text](url)`, enzovoort. + +## Veelvoorkomende Randgevallen Afhandelen + +### 1. Ingesloten Afbeeldingen + +Als je HTML ``‑tags bevat met relatieve paden, zal de converter dezelfde relatieve paden in Markdown opnemen. Zorg dat de afbeeldingen naast het `.md`‑bestand worden gekopieerd, of pas de `options` aan om base‑64 data‑URL’s in te sluiten: + +```python +options.embed_images = True # Converts images to inline base64 strings +``` + +### 2. Speciale Tekens & Entiteiten + +HTML‑entiteiten zoals ` ` of `&` worden automatisch gedecodeerd. Als je ze letterlijk wilt behouden, stel dan in: + +```python +options.decode_entities = False +``` + +### 3. Grote Bestanden + +Voor enorme HTML‑documenten (honderden megabytes) kun je overwegen de invoer te streamen of de Python‑recursielimiet te verhogen. De Aspose‑engine is geheugen‑efficiënt, maar een 64‑bit Python‑interpreter wordt aanbevolen. + +## Waarom deze Aanpak Beter is dan DIY Regex + +Je zou in de verleiding kunnen komen om reguliere expressies te schrijven die `

` vervangen door `# `, `

` door regeleinden, enz. Hoewel dat voor kleine fragmenten werkt, breekt het snel bij geneste tags, slecht gevormde markup, of complexe tabellen. Met een gespecialiseerde bibliotheek: + +- Garandeert **HTML compliance** (de parser repareert kapotte tags). +- Handhaeft **edge cases** zoals scripts, style‑blokken, en commentaren out‑of‑the‑box. +- Produceert **consistent Markdown** dat tools als Pandoc of Jekyll direct kunnen verwerken zonder extra opschoning. + +Kortom, de **convert html to markdown** workflow die we laten zien is robuust, onderhoudbaar, en productie‑klaar. + +## Snelle Samenvatting + +- Installeer `aspose-html` (`pip install aspose-html`). +- Laad je HTML met `HTMLDocument`. +- Pas eventueel `MarkdownSaveOptions` aan. +- Roep `Converter.convert_html` aan om een `.md`‑bestand te krijgen. + +Dat is de volledige **create markdown from html** pijplijn—geen verborgen stappen, geen externe services, alleen pure Python. + +## Volgende Stappen & Gerelateerde Onderwerpen + +Nu je de basis **html to markdown conversion** onder de knie hebt, kun je verder verkennen: + +- **Batch processing**: een hele map met HTML‑bestanden doorlopen. +- **Integratie met static site generators** zoals Hugo of MkDocs. +- **Aangepaste post‑processing**: gebruik `markdown` of `mistune` om de output verder aan te passen. +- **Alternatieve bibliotheken**: `html2text`, `markdownify`, of `pandoc` voor andere functionaliteiten. + +Al deze onderwerpen bouwen voort op de basis die we hebben behandeld, en ze profiteren allemaal van dezelfde **html to markdown python** mentaliteit. + +--- + +*Happy coding! Als je ergens vastloopt of ideeën hebt om dit script uit te breiden, laat dan een reactie achter—laten we het gesprek gaande houden.* + +## Wat moet je hierna leren? + + +De volgende tutorials behandelen nauw verwante onderwerpen die voortbouwen op de technieken die in deze gids worden getoond. Elke bron bevat volledige werkende code‑voorbeelden met stap‑voor‑stap uitleg om je te helpen extra API‑functies onder de knie te krijgen en alternatieve implementaties in je eigen projecten te verkennen. + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) + +{{< /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/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md b/html/dutch/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md new file mode 100644 index 000000000..438978731 --- /dev/null +++ b/html/dutch/python/general/create-svg-document-add-a-circle-and-save-as-svg/_index.md @@ -0,0 +1,211 @@ +--- +category: general +date: 2026-07-31 +description: Leer hoe je een SVG‑document maakt, een cirkel toevoegt en snel een SVG‑bestand + opslaat. Exporteer de afbeelding als SVG met een paar regels Python‑code. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create svg document +- save svg file +- export graphic as svg +- add circle to svg +language: nl +lastmod: 2026-07-31 +og_description: Maak een SVG‑document, voeg een cirkel toe en sla het SVG‑bestand + binnen enkele seconden op. Deze gids laat zien hoe je een afbeelding exporteert + als SVG met duidelijke, uitvoerbare code. +og_image_alt: Screenshot of a red circle inside an SVG file named circle.svg +og_title: Maak een SVG‑document – Voeg een cirkel toe en sla op als SVG +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: Learn how to create SVG document, add a circle, and save SVG file quickly. + Export graphic as SVG with a few lines of Python code. + headline: Create SVG Document – Add a Circle and Save as SVG + type: TechArticle +- description: Learn how to create SVG document, add a circle, and save SVG file quickly. + Export graphic as SVG with a few lines of Python code. + name: Create SVG Document – Add a Circle and Save as SVG + steps: + - name: Pro tip + text: If you plan to generate many files in a loop, give each `Drawing` a unique + name or use `io.BytesIO` to keep everything in memory until you’re ready to + write. + - name: Edge case – Transparent background + text: 'If you need a transparent background (the default for SVG), you can skip + setting a `fill` on the root. For a white background, add:' + - name: 'Bonus: Export graphic as SVG programmatically' + text: 'If you need the SVG content as a string—for example, to embed it in an + HTML email—you can call `dwg.tostring()` instead of `save()`:' + type: HowTo +- questions: + - answer: Swap `dwg.circle` for `dwg.rect`, `dwg.ellipse`, or even a custom `` + string. The API is consistent across shapes. + question: What if I want a different shape? + - answer: Absolutely. The file you just created can be referenced with `Red circle` or inlined with `` tags. + question: Can I embed the SVG directly in HTML? + - answer: You could, but libraries like `svgwrite` handle namespace quirks and make + the code far more maintainable—especially when you start adding gradients or + animations. + question: Why not write raw XML? + type: FAQPage +tags: +- svg +- python +- vector-graphics +- programming-tutorial +title: SVG-document maken – Voeg een cirkel toe en sla op als SVG +url: /nl/python/general/create-svg-document-add-a-circle-and-save-as-svg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Maak SVG-document – Voeg een cirkel toe en sla op als SVG + +Heb je ooit **create SVG document** nodig gehad vanuit code maar wist je niet waar je moest beginnen? Je bent niet alleen; veel ontwikkelaars lopen tegen die muur aan wanneer ze voor het eerst met vectorafbeeldingen spelen. In deze tutorial lopen we een klein, zelfstandig voorbeeld door dat je laat zien hoe je **add circle to SVG** kunt doen, vervolgens **save SVG file** zodat je **export graphic as SVG** kunt gebruiken op het web of in ontwerptools. + +We houden het lichtgewicht: slechts een paar regels Python, een populaire SVG‑helperbibliotheek, en een vleugje uitleg. Aan het einde heb je een kant‑klaar `circle.svg` in je map, en begrijp je waarom elke stap belangrijk is—geen vage “see docs” shortcuts. + +## Wat je nodig hebt + +- Python 3.8+ (elke recente versie werkt) +- Het `svgwrite`‑pakket – installeer het met `pip install svgwrite` +- Een teksteditor of IDE (VS Code, PyCharm, of zelfs Notepad volstaat) +- Schrijfrechten voor de map waarin je het bestand wilt opslaan + +Dat is alles. Geen zware afhankelijkheden, geen externe services. + +## Stap 1: Maak het SVG-document + +Het maken van een SVG-document is zo simpel als het instantieren van een `Drawing`‑object uit `svgwrite`. Beschouw dit object als het lege canvas waarop elke vorm leeft. + +```python +import svgwrite + +# Step 1: Create a new SVG document (canvas) 800×800 pixels +dwg = svgwrite.Drawing(filename="circle.svg", size=("200px", "200px")) +``` + +> **Waarom dit belangrijk is:** De `Drawing`‑klasse behandelt al het XML‑boilerplate voor je—namespaces, headers en het root‑element ``. Door vooraf een bestandsnaam op te geven weten we al waar het bestand terechtkomt, waardoor de latere **save svg file**‑stap triviaal wordt. + +### Pro‑tip +Als je van plan bent om veel bestanden in een lus te genereren, geef elk `Drawing` een unieke naam of gebruik `io.BytesIO` om alles in het geheugen te houden totdat je klaar bent om te schrijven. + +## Stap 2: Voeg een cirkel toe aan de SVG + +Nu het document bestaat, laten we **add circle to SVG**. De `add()`‑methode accepteert elk vormobject; een `Circle` is perfect voor een eenvoudige rode stip in het midden. + +```python +# Step 2: Add a red circle element to the SVG root +center = (100, 100) # x, y coordinates (half of 200px canvas) +radius = 80 # radius in pixels +circle = dwg.circle(center=center, r=radius, fill='red') +dwg.add(circle) +``` + +> **Waarom we `center`‑ en `radius`‑variabelen gebruiken:** Hard‑coded getallen maken de code moeilijker leesbaar en onderhoudbaar. Door de waarden een naam te geven verduidelijken we de intentie—deze cirkel zit precies in het midden van een 200 × 200 canvas en is groot genoeg om op te vallen. + +### Randgeval – Transparante achtergrond +Als je een transparante achtergrond nodig hebt (de standaard voor SVG), kun je het instellen van een `fill` op het root‑element overslaan. Voor een witte achtergrond, voeg toe: + +```python +dwg.add(dwg.rect(insert=(0, 0), size=("200px", "200px"), fill='white')) +``` + +Plaats dit vóór het toevoegen van de cirkel zodat het rechthoek eronder zit. + +## Stap 3: Sla het SVG‑bestand op + +Met de vorm op zijn plaats, is de laatste handeling om **save SVG file**. De `save()`‑methode schrijft de XML naar schijf, en omdat we het `Drawing` al een bestandsnaam hebben gegeven, doet één aanroep het werk. + +```python +# Step 3: Save the SVG document to a file +dwg.save() +print("✅ circle.svg has been created in the current directory.") +``` + +> **Wat er onder de motorkap gebeurt:** `svgwrite` serialiseert de elementboom naar een string, voegt de XML‑declaratie toe, en schrijft deze met UTF‑8‑codering. Als de doelmap niet bestaat, zal Python een `FileNotFoundError` werpen; zorg dat het pad geldig is of maak het aan met `os.makedirs()`. + +### Bonus: Exporteer grafiek als SVG programmatisch + +Als je de SVG‑inhoud als string nodig hebt—bijvoorbeeld om in een HTML‑e‑mail in te sluiten—kun je `dwg.tostring()` aanroepen in plaats van `save()`: + +```python +svg_content = dwg.tostring() +# Now you can send svg_content over a network, store it in a DB, etc. +``` + +## Volledig werkend voorbeeld + +Alles samenvoegend, hier is een compleet, kant‑klaar script: + +```python +import svgwrite +import os + +def create_svg_with_circle(output_path: str): + """ + Creates an SVG file containing a single red circle. + Parameters + ---------- + output_path: str + Full path where the SVG file will be saved. + """ + # Ensure the directory exists + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + # Initialise the SVG document (800×800 canvas) + dwg = svgwrite.Drawing(filename=output_path, size=("200px", "200px")) + + # Optional: add a white background rectangle + dwg.add(dwg.rect(insert=(0, 0), size=("200px", "200px"), fill='white')) + + # Add a red circle in the centre + center = (100, 100) + radius = 80 + circle = dwg.circle(center=center, r=radius, fill='red') + dwg.add(circle) + + # Save the file – this is the key step to **save svg file** + dwg.save() + print(f"✅ SVG saved to {output_path}") + +if __name__ == "__main__": + # Change this path to wherever you want the file + output_file = os.path.join(os.getcwd(), "circle.svg") + create_svg_with_circle(output_file) +``` + +**Verwachte output:** Na het uitvoeren van het script zie je een `circle.svg`‑bestand in dezelfde map. Het openen in een browser of een vector‑editor toont een rode cirkel gecentreerd op een wit vierkant—precies wat we geprogrammeerd hebben. + +## Veelgestelde vragen & valkuilen + +- **Wat als ik een andere vorm wil?** Vervang `dwg.circle` door `dwg.rect`, `dwg.ellipse`, of zelfs een aangepaste ``‑string. De API is consistent over vormen. +- **Kan ik de SVG direct in HTML insluiten?** Zeker. Het bestand dat je zojuist hebt gemaakt kan worden gerefereerd met `Red circle` of inline met ``‑tags. +- **Waarom geen ruwe XML schrijven?** Je zou het kunnen, maar bibliotheken zoals `svgwrite` behandelen namespace‑eigenaardigheden en maken de code veel beter onderhoudbaar—vooral wanneer je begint met het toevoegen van verlopen of animaties. + +## Conclusie + +Je weet nu hoe je **create SVG document**, **add circle to SVG**, en **save SVG file** kunt doen zodat je **export graphic as SVG** kunt uitvoeren met slechts een handvol Python‑regels. Het patroon schaalt: vervang de cirkel door elke vectorvorm, loop over data om grafieken te genereren, of batch‑verwerk assets voor een designsysteem. + +Volgende stappen? Probeer tekstlabels toe te voegen, te experimenteren met verlopen, of een hele galerij iconen te genereren in één script. Als je nieuwsgierig bent naar meer geavanceerde functies, bekijk dan de `svgwrite`‑documentatie over groepen (``), transformaties en animatie‑ondersteuning. + +Veel plezier met coderen, en moge je vectoren altijd scherp blijven! + +## Wat moet je hierna leren? + +De volgende tutorials behandelen nauw verwante onderwerpen die voortbouwen op de technieken die in deze gids worden gedemonstreerd. Elke bron bevat volledige werkende code‑voorbeelden met stap‑voor‑stap uitleg om je te helpen extra API‑functies onder de knie te krijgen en alternatieve implementatie‑benaderingen in je eigen projecten te verkennen. + +- [SVG-document opslaan in Aspose.HTML voor Java](/html/english/java/saving-html-documents/save-svg-document/) +- [SVG-documenten maken en beheren in Aspose.HTML voor Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [svg naar png java – SVG naar afbeelding converteren met Aspose.HTML voor Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /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/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md b/html/dutch/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md new file mode 100644 index 000000000..253e71480 --- /dev/null +++ b/html/dutch/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md @@ -0,0 +1,261 @@ +--- +category: general +date: 2026-07-31 +description: Hoe je recursie kunt beperken bij het verwerken van HTML‑resources. Leer + hoe je opties voor resource‑handling kunt configureren, de maximale diepte instelt + en verwerkte bestanden efficiënt opslaat. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to limit recursion +- resource handling options +- max handling depth +- HTMLDocument save settings +- prevent infinite loops +language: nl +lastmod: 2026-07-31 +og_description: Hoe je recursie kunt beperken bij het werken met HTML‑documenten. + Deze gids laat zien hoe je opties voor resource handling configureert, een veilige + maximale diepte instelt en oneindige lussen voorkomt. +og_image_alt: Screenshot illustrating how to limit recursion settings in an HTML processing + script +og_title: Hoe recursie te beperken bij HTML‑verwerking – Stap voor stap +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: How to limit recursion while handling HTML resources. Learn to configure + resource handling options, set max depth, and save processed files efficiently. + headline: How to Limit Recursion in HTML Processing – Complete Guide + type: TechArticle +- description: How to limit recursion while handling HTML resources. Learn to configure + resource handling options, set max depth, and save processed files efficiently. + name: How to Limit Recursion in HTML Processing – Complete Guide + steps: + - name: Understanding `max_handling_depth` + text: '- **Depth 0** – Only the root HTML file is processed; no external resources + are followed. - **Depth 1** – The root file *and* any first‑level resources + (e.g., a CSS file referenced directly) are processed. - **Depth 3** – The root, + its direct resources, and the resources of those resources, up to th' + - name: Why a Separate `SaveOptions` Object? + text: Separating **resource handling** from **serialization** keeps your code + modular. You could later add compression, embedding preferences, or different + output formats (e.g., PDF) without touching the recursion logic. + - name: Expected Result + text: '- The output file (`big_document_processed.html`) will contain the original + markup **plus** any resources discovered within the three‑level limit. - Any + deeper‑nested resources are omitted, preventing runaway recursion. - If the + original document referenced a circular chain (e.g., page A → page B → ' + type: HowTo +tags: +- recursion +- HTML processing +- Python +- resource handling +title: Hoe recursie in HTML-verwerking te beperken – Complete gids +url: /nl/python/general/how-to-limit-recursion-in-html-processing-complete-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hoe recursie te beperken bij HTML‑verwerking – Complete gids + +Heb je je ooit afgevraagd **hoe je recursie kunt beperken** wanneer je een enorm HTML‑bestand parseert? De kans is groot dat je een stack‑overflow‑fout hebt gekregen of dat je script voor altijd blijft hangen omdat een bron steeds weer andere bronnen binnenhaalt. Kortom, een onbeheerde recursiediepte kan van een eenvoudige transformatie een nachtmerrie maken. + +Het goede nieuws? Je kunt de processor vertellen om na een veilig aantal niveaus te stoppen met graven, en je houdt je geheugenverbruik netjes. Hieronder zie je een praktisch voorbeeld dat laat zien **hoe je recursie kunt beperken** met behulp van resource‑handling‑opties, waarom dat belangrijk is, en hoe je het opgeschoonde document zonder problemen kunt opslaan. + +> **Quick win:** Stel `max_handling_depth` in op `3` en je voorkomt dat dieper geneste resources worden gevolgd — perfect voor grote, zelf‑refererende HTML‑bundels. + +--- + +## Wat je gaat leren + +- Waarom onbeheerde recursie riskant is bij het verwerken van HTML‑documenten. +- Hoe je **resource handling‑opties** configureert om een maximale diepte op te leggen. +- De exacte code die nodig is om een HTML‑bestand veilig te laden, te verwerken en op te slaan. +- Veelvoorkomende valkuilen (bijv. circulaire includes) en hoe je ze kunt vermijden. +- Tips om de diepte‑limiet af te stemmen op verschillende projectgroottes. + +Er zijn geen externe bibliotheken nodig buiten het standaard HTML‑verwerkingspakket (de snippet hieronder gebruikt een generieke `HTMLDocument`‑klasse die veel SDK’s aanbieden, zoals Aspose.HTML voor Python). Als je een andere bibliotheek gebruikt, zijn de concepten direct toepasbaar. + +--- + +## Voorvereisten + +Voordat we beginnen, zorg dat je het volgende hebt: + +| Vereiste | Reden | +|----------|-------| +| Python 3.9+ (of een vergelijkbare runtime) | Moderne syntaxis en type‑hints | +| Een HTML‑verwerkingsbibliotheek die `ResourceHandlingOptions` ondersteunt (bijv. `aspose.html`) | Biedt de eigenschap `max_handling_depth` | +| Een groot HTML‑bestand (`big_document.html`) dat je wilt opschonen | Demonstreert de recursielimiet in actie | +| Schrijfrechten voor de doelmap | Nodig voor `doc.save(...)` | + +Als een van deze ontbreekt, installeer de bibliotheek met `pip install aspose.html` (of het juiste pakket) en je bent klaar om te gaan. + +--- + +## Stap 1: Laad het HTML‑document + +Het eerste wat je doet is een `HTMLDocument`‑instantie maken die naar je bronbestand wijst. Beschouw dit object als het toegangspunt tot de volledige DOM‑boom, en tevens als de poort naar alle externe resources (afbeeldingen, CSS, scripts) die het document kan refereren. + +```python +# Step 1: Load the HTML document +doc = HTMLDocument("YOUR_DIRECTORY/big_document.html") +``` + +> **Why this matters:** Het laden van het document triggert nog geen recursie, maar bereidt de interne parser voor om later gekoppelde resources te ontdekken. Als het document `` paths to local files. + - name: 2. Unicode and Right‑to‑Left Languages + text: Aspose.HTML ships with a set of built‑in fonts, but for full Unicode coverage + you may need to embed custom fonts. + - name: 3. Large Documents + text: For HTML files exceeding a few megabytes, you might hit memory limits. The + library offers a streaming API, but for most use‑cases the one‑call `convert` + method suffices. + type: HowTo +- questions: + - answer: Yes. Aspose.HTML renders `` elements as raster images in the PDF, + preserving visual fidelity. + question: Does this work with HTML5 features like ``? + - answer: Absolutely. Use the overload that accepts `PdfSaveOptions` and set properties + like `author`, `title`, or `subject`. + question: Can I set PDF metadata (author, title)? + - answer: 'The `PdfSaveOptions` class includes `encrypt` and `user_password` fields. + Combine them with the `convert` call for secure PDFs. --- ## ## Next Steps and + Related Topics Now that you’ve learned how to **generate pdf from html** with + Aspose.HTML, you might want to explore: * **Batch conversion** – loop' + question: What about password‑protecting the PDF? + type: FAQPage +tags: +- Python +- Aspose.HTML +- PDF conversion +title: HTML naar PDF Tutorial – Converteer HTML‑bestanden naar PDF met Aspose.HTML +url: /nl/python/general/html-to-pdf-tutorial-convert-html-files-to-pdf-with-aspose-h/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# HTML naar PDF Tutorial – Converteer HTML-bestanden naar PDF met Aspose.HTML + +Heb je je ooit afgevraagd hoe je een webpagina kunt omzetten naar een afdrukbare PDF zonder te rommelen met de afdrukdialoog van de browser? Dat is precies wat een **html to pdf tutorial** oplost. In deze gids zie je hoe je **generate pdf from html** kunt doen in slechts drie regels Python, met behulp van de krachtige **Aspose.HTML** bibliotheek. + +Als je ooit een **create pdf from html** moest maken voor facturen, rapporten of e‑books, ben je hier op het juiste adres. We behandelen ook de nuances van **convert html file pdf** handling—zoals codering, afbeelding insluiten en lettertypebehoud—zodat je later geen vervelende verrassingen tegenkomt. + +## What This Tutorial Covers + +* Een snelle opsomming van de vereisten (Python‑versie, Aspose.HTML‑installatie en een voorbeeld‑HTML‑bestand). +* Een stap‑voor‑stap **html to pdf tutorial** die uitlegt hoe je importeert, configureert en de converter aanroept. +* Waarom Aspose.HTML een solide keuze is voor het **aspose html to pdf** scenario, inclusief prestaties‑ en getrouwheidsnotities. +* Tips voor veelvoorkomende randgevallen—grote afbeeldingen, externe CSS en Unicode‑tekens. +* Een compleet, uitvoerbaar script dat je vandaag nog kunt kopiëren‑plakken en uitvoeren. + +Aan het einde van dit artikel kun je **generate pdf from html** op elk platform dat Python ondersteunt, en begrijp je het “waarom” achter elke regel code. + +--- + +## Prerequisites – What You Need Before Starting + +Before we dive into the code, make sure you have the following: + +| Requirement | Reason | +|-------------|--------| +| Python 3.8 or newer | Aspose.HTML’s wheels target 3.8+. | +| `pip` access to install packages | We'll pull `aspose-html` from PyPI. | +| A simple HTML file (`input.html`) | This is the source you’ll **convert html file pdf** from. | +| Write permission to the output folder | The script will create `output.pdf`. | + +You can install the library with a single command: + +```bash +pip install aspose-html +``` + +> **Pro tip:** If you work inside a virtual environment (highly recommended), activate it first to keep dependencies tidy. + +--- + +## ## HTML to PDF Tutorial – Set Up the Environment + +The first H2 already contains our **primary keyword** (`html to pdf tutorial`). This section ensures your environment is ready. + +```python +# Verify the installed version (optional but handy) +import aspose.html as ah +print(f"Aspose.HTML version: {ah.__version__}") +``` + +Running the snippet should print something like `Aspose.HTML version: 23.9`. If you see an import error, double‑check that the package installed correctly and that you’re using the right Python interpreter. + +--- + +## ## Step 1: Import the Converter Class (Generate PDF from HTML) + +Now we’ll bring in the class that does the heavy lifting. This line is the heart of the **generate pdf from html** operation. + +```python +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +``` + +Why do we import only `Converter`? +* It keeps the namespace clean, avoiding accidental name clashes. +* The class alone is sufficient for a straightforward **create pdf from html** task, so we don’t pay the cost of loading unnecessary modules. + +--- + +## ## Step 2: Define Input and Output Paths (Convert HTML File PDF) + +Next, we tell the script where to find the source HTML and where to place the resulting PDF. This is the part where you **convert html file pdf**. + +```python +# Step 2: Specify the source HTML file and the destination PDF file +input_html = "YOUR_DIRECTORY/input.html" +output_pdf = "YOUR_DIRECTORY/output.pdf" +``` + +Replace `YOUR_DIRECTORY` with an absolute or relative path that matches your project layout. If you plan to process multiple files, consider looping over a list of paths—just remember to keep each output name unique. + +--- + +## ## Step 3: Perform the Conversion in One Call (Create PDF from HTML) + +Finally, the conversion itself is a single method call. This is the moment you truly **create pdf from html** without writing any boilerplate. + +```python +# Step 3: Convert the HTML document to PDF in a single call +Converter.convert(input_html, output_pdf) +print(f"✅ PDF generated at: {output_pdf}") +``` + +Under the hood, `Converter.convert` parses the HTML, resolves CSS, embeds images, and writes a PDF that mirrors the browser rendering engine. Aspose.HTML uses its own layout engine, so you get consistent results regardless of the client’s browser version. + +### Why Use Aspose.HTML for This Task? + +* **High fidelity** – Complex CSS (flexbox, grid) is respected. +* **No external dependencies** – No need for a headless browser like Chromium. +* **Cross‑platform** – Works on Windows, Linux, and macOS with the same codebase. +* **License flexibility** – A free evaluation version is available for testing. + +--- + +## ## Handling Common Edge Cases + +Even a simple three‑line script can run into hiccups when the source HTML isn’t “well‑behaved.” Below are a few scenarios you might encounter and how to address them. + +### 1. External Images or Resources + +If your HTML references images hosted on the internet, make sure the machine running the script has internet access. For offline builds, download the assets and adjust the `` paths to local files. + +```python +# Example: Ensure images are local +# +``` + +### 2. Unicode and Right‑to‑Left Languages + +Aspose.HTML ships with a set of built‑in fonts, but for full Unicode coverage you may need to embed custom fonts. + +```python +from aspose.html import FontSettings, FontSource + +# Register a custom font folder (optional) +font_settings = FontSettings() +font_settings.add_font_source(FontSource.folder("fonts/")) +Converter.convert(input_html, output_pdf, font_settings=font_settings) +``` + +### 3. Large Documents + +For HTML files exceeding a few megabytes, you might hit memory limits. The library offers a streaming API, but for most use‑cases the one‑call `convert` method suffices. + +> **Watch out:** The free evaluation version adds a watermark after the first 2 pages. Purchase a license if you need clean PDFs for production. + +--- + +## ## Full Working Example + +Below is the complete script you can drop into a file named `html_to_pdf.py`. Run it with `python html_to_pdf.py` after you’ve placed `input.html` in the same folder. + +```python +# html_to_pdf.py +# A complete, self‑contained example that converts an HTML file to PDF using Aspose.HTML. + +from aspose.html import Converter + +# ------------------------------------------------------------------ +# Configuration – adjust these paths to match your environment +# ------------------------------------------------------------------ +input_html = "input.html" # <-- your source HTML +output_pdf = "output.pdf" # <-- desired PDF output + +# ------------------------------------------------------------------ +# Conversion – this single call does the heavy lifting +# ------------------------------------------------------------------ +try: + Converter.convert(input_html, output_pdf) + print(f"✅ Successfully generated PDF: {output_pdf}") +except Exception as e: + # Provide a friendly error message – helps with debugging + print(f"❌ Conversion failed: {e}") +``` + +**Expected output** (on the console): + +``` +✅ Successfully generated PDF: output.pdf +``` + +Open `output.pdf` with any PDF viewer; you should see your HTML rendered exactly as it appears in a modern browser. + +--- + +## ## Verifying the Result + +To make sure the conversion succeeded, you can perform a quick sanity check: + +```python +import os + +if os.path.getsize(output_pdf) > 0: + print("File size looks good – PDF is not empty.") +else: + print("Uh‑oh, the PDF is empty. Check the input HTML and permissions.") +``` + +If the file size is non‑zero and the content looks right, congratulations—you’ve mastered the **html to pdf tutorial**! + +--- + +## ## Frequently Asked Questions + +**Q: Does this work with HTML5 features like ``?** +A: Yes. Aspose.HTML renders `` elements as raster images in the PDF, preserving visual fidelity. + +**Q: Can I set PDF metadata (author, title)?** +A: Absolutely. Use the overload that accepts `PdfSaveOptions` and set properties like `author`, `title`, or `subject`. + +**Q: What about password‑protecting the PDF?** +A: The `PdfSaveOptions` class includes `encrypt` and `user_password` fields. Combine them with the `convert` call for secure PDFs. + +--- + +## ## Next Steps and Related Topics + +Now that you’ve learned how to **generate pdf from html** with Aspose.HTML, you might want to explore: + +* **Batch conversion** – loop over a directory of HTML files and produce a PDF for each. +* **HTML to PDF with custom CSS** – inject a stylesheet programmatically before conversion. +* **Merging PDFs** – combine multiple PDFs generated from different HTML pages using Aspose.PDF. +* **Deploying as a microservice** – expose the conversion logic via a Flask or FastAPI endpoint for on‑demand PDF generation. + +All of these build on the core concepts covered in this **html to pdf tutorial**, and they keep the **aspose html to pdf** workflow consistent across projects. + +--- + +## Conclusion + +We’ve walked through a concise **html to pdf tutorial** that shows you how to **create pdf from html** using Aspose.HTML’s `Converter` class. By importing the right class, pointing to your source HTML, and calling `convert`, you can reliably **convert html file pdf** in any Python environment. + +Feel free to tweak the script, experiment with styling, or integrate it into larger applications. If you hit any snags, revisit the edge‑case section or check Aspose’s official documentation for deeper configuration options. + +Happy coding, and may your PDFs always look as polished as your web pages! + + +## What Should You Learn Next? + + +The following tutorials cover closely related topics that build on the techniques demonstrated in this guide. Each resource includes complete working code examples with step-by-step explanations to help you master additional API features and explore alternative implementation approaches in your own projects. + +- [How to Convert HTML to PDF Java – Using Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) +- [Create PDF from HTML using Aspose.HTML for Java – Sandbox](/html/english/java/configuring-environment/implement-sandboxing/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) + +{{< /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/python/general/create-markdown-from-html-in-python-complete-guide/_index.md b/html/english/python/general/create-markdown-from-html-in-python-complete-guide/_index.md new file mode 100644 index 000000000..e2b5baedd --- /dev/null +++ b/html/english/python/general/create-markdown-from-html-in-python-complete-guide/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-07-31 +description: Create markdown from HTML using Python quickly. Learn how to convert + HTML to markdown with a simple script and explore html to markdown python options. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- create markdown from html +- convert html to markdown +- how to convert html +- html to markdown conversion +- html to markdown python +language: en +lastmod: 2026-07-31 +og_description: Create markdown from HTML with a concise Python script. This tutorial + shows how to convert HTML to markdown, covers html to markdown conversion options, + and provides a ready‑to‑run example for html to markdown python users. +og_image_alt: Screenshot of a Python script that converts an HTML file into a Markdown + document +og_title: Create markdown from HTML using Python – Step-by-Step Guide +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: Create markdown from HTML using Python quickly. Learn how to convert + HTML to markdown with a simple script and explore html to markdown python options. + headline: Create markdown from HTML in Python – Complete Guide + type: TechArticle +- description: Create markdown from HTML using Python quickly. Learn how to convert + HTML to markdown with a simple script and explore html to markdown python options. + name: Create markdown from HTML in Python – Complete Guide + steps: + - name: Expected Output + text: 'Running `python convert_html_to_md.py` should print something like:' + - name: 1. Embedded Images + text: 'If your HTML contains `` tags with relative paths, the converter will + embed the same relative paths in Markdown. Make sure the images are copied alongside + the `.md` file, or adjust the `options` to embed base‑64 data URLs:' + - name: 2. Special Characters & Entities + text: 'HTML entities like ` ` or `&` are automatically decoded. However, + if you need to preserve them literally, set:' + - name: 3. Large Files + text: For massive HTML documents (hundreds of megabytes), consider streaming the + input or increasing the Python recursion limit. The Aspose engine is memory‑efficient, + but a 64‑bit Python interpreter is recommended. + type: HowTo +tags: +- python +- html +- markdown +title: Create markdown from HTML in Python – Complete Guide +url: /python/general/create-markdown-from-html-in-python-complete-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Create markdown from HTML in Python – Complete Guide + +Ever wondered **how to convert HTML** into clean, readable Markdown without pulling your hair out? You're not the only one. Whether you're migrating a blog, building a static‑site generator, or just need a quick one‑off conversion, the ability to **create markdown from HTML** is a handy skill for any Python developer. + +In this tutorial we’ll walk through a straightforward, end‑to‑end solution that **converts HTML to markdown** using a single, well‑documented library. By the end you’ll have a reusable script, understand the nuances of **html to markdown conversion**, and know how to tweak it for your own projects. + +## What You’ll Learn + +- Install the right Python package for **html to markdown python** tasks. +- Load an HTML file and configure conversion options. +- Run the conversion and verify the resulting Markdown file. +- Handle common edge cases like embedded images or special characters. + +No prior experience with Markdown parsers is required—just a basic familiarity with Python and file I/O. + +## Prerequisites + +Before we dive in, make sure you have: + +1. Python 3.8 or newer installed on your machine. +2. A terminal or command prompt you’re comfortable with. +3. An HTML file you’d like to transform (we’ll call it `sample.html`). + +That’s it. If you’re missing any of the above, pause a moment to install Python from python.org and create a tiny HTML test file—everything else will be covered here. + +## Step 1: Install the Aspose.HTML for Python via pip + +The easiest way to **create markdown from HTML** in Python is to use the `aspose.html` package, which ships with a reliable `MarkdownSaveOptions` class. Run the following command: + +```bash +pip install aspose-html +``` + +> **Pro tip:** If you’re working inside a virtual environment (highly recommended), activate it first; otherwise the package lands globally and could clash with other projects. + +## Step 2: Import the Required Classes + +Once the library is installed, import the necessary objects. This tiny snippet sets the stage for everything that follows: + +```python +# Import the core Aspose.HTML classes +from aspose.html import HTMLDocument, Converter, MarkdownSaveOptions +``` + +Why these three? `HTMLDocument` loads and parses the source file, `Converter` orchestrates the transformation, and `MarkdownSaveOptions` lets you fine‑tune the output format—perfect for **html to markdown conversion** tasks. + +## Step 3: Load the HTML Document You Want to Convert + +Now we actually read the HTML file. Replace `YOUR_DIRECTORY` with the path where `sample.html` lives: + +```python +# Step 1: Load the HTML document you want to convert +doc = HTMLDocument("YOUR_DIRECTORY/sample.html") +``` + +If the file isn’t found, Python will raise a `FileNotFoundError`. To avoid that, double‑check the path or use `os.path.join` for cross‑platform safety. + +## Step 4: Create Markdown Save Options (Optional but Powerful) + +The `MarkdownSaveOptions` object lets you control things like line breaks, heading styles, and whether to keep HTML entities. The defaults already produce clean Markdown, but you can customize them if needed: + +```python +# Step 2: Create Markdown save options (defaults produce standard Markdown) +options = MarkdownSaveOptions() +# Example tweak: preserve original line breaks +options.preserve_line_breaks = True +``` + +Feel free to skip the tweak—our script works perfectly out of the box. This step simply illustrates how you can adapt the conversion to fit specific **html to markdown python** requirements. + +## Step 5: Perform the Conversion + +The heavy lifting happens in a single line. We hand the document, the options, and the target filename to the `Converter`: + +```python +# Step 3: Convert the HTML document to a Markdown file +Converter.convert_html(doc, options, "YOUR_DIRECTORY/sample.md") +``` + +After this runs, you’ll find `sample.md` beside your original HTML file, populated with neatly formatted Markdown. + +## Full Script – Ready to Run + +Putting it all together, here’s a complete, runnable script you can copy‑paste into `convert_html_to_md.py`: + +```python +# convert_html_to_md.py +import os +from aspose.html import HTMLDocument, Converter, MarkdownSaveOptions + +def convert_html_to_markdown(html_path: str, md_path: str) -> None: + """ + Convert an HTML file to Markdown. + + Parameters + ---------- + html_path : str + Path to the source HTML file. + md_path : str + Desired output path for the Markdown file. + """ + # Verify that the source exists + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + # Load the HTML document + doc = HTMLDocument(html_path) + + # Set up conversion options (you can tweak these) + options = MarkdownSaveOptions() + # Example: keep original line breaks for better diffing + options.preserve_line_breaks = True + + # Perform conversion + Converter.convert_html(doc, options, md_path) + print(f"✅ Conversion complete! Markdown saved to: {md_path}") + +if __name__ == "__main__": + # Adjust these paths to match your environment + html_file = "YOUR_DIRECTORY/sample.html" + markdown_file = "YOUR_DIRECTORY/sample.md" + convert_html_to_markdown(html_file, markdown_file) +``` + +### Expected Output + +Running `python convert_html_to_md.py` should print something like: + +``` +✅ Conversion complete! Markdown saved to: YOUR_DIRECTORY/sample.md +``` + +Open `sample.md` and you’ll see a Markdown representation of the original HTML—headings turned into `#` symbols, paragraphs as plain text, links formatted as `[text](url)`, and so on. + +## Handling Common Edge Cases + +### 1. Embedded Images + +If your HTML contains `` tags with relative paths, the converter will embed the same relative paths in Markdown. Make sure the images are copied alongside the `.md` file, or adjust the `options` to embed base‑64 data URLs: + +```python +options.embed_images = True # Converts images to inline base64 strings +``` + +### 2. Special Characters & Entities + +HTML entities like ` ` or `&` are automatically decoded. However, if you need to preserve them literally, set: + +```python +options.decode_entities = False +``` + +### 3. Large Files + +For massive HTML documents (hundreds of megabytes), consider streaming the input or increasing the Python recursion limit. The Aspose engine is memory‑efficient, but a 64‑bit Python interpreter is recommended. + +## Why This Approach Beats DIY Regex + +You might be tempted to write regular expressions that replace `

` with `# `, `

` with line breaks, etc. While that works for tiny snippets, it quickly breaks on nested tags, malformed markup, or complex tables. Using a dedicated library: + +- Guarantees **HTML compliance** (the parser fixes broken tags). +- Handles **edge cases** like scripts, style blocks, and comments out‑of‑the‑box. +- Produces **consistent Markdown** that tools like Pandoc or Jekyll can ingest without further cleaning. + +In short, the **convert html to markdown** workflow we demonstrated is robust, maintainable, and production‑ready. + +## Quick Recap + +- Install `aspose-html` (`pip install aspose-html`). +- Load your HTML with `HTMLDocument`. +- Optionally tweak `MarkdownSaveOptions`. +- Call `Converter.convert_html` to get a `.md` file. + +That’s the entire **create markdown from html** pipeline—no hidden steps, no external services, just pure Python. + +## Next Steps & Related Topics + +Now that you’ve mastered the basic **html to markdown conversion**, you might want to explore: + +- **Batch processing**: loop over an entire folder of HTML files. +- **Integrating with static site generators** like Hugo or MkDocs. +- **Custom post‑processing**: use `markdown` or `mistune` libraries to further adjust the output. +- **Alternative libraries**: `html2text`, `markdownify`, or `pandoc` for different feature sets. + +Each of these builds on the foundation we covered, and they all benefit from the same **html to markdown python** mindset. + +--- + +*Happy coding! If you hit any snags or have ideas for extending this script, drop a comment below—let’s keep the conversation going.* + + +## What Should You Learn Next? + + +The following tutorials cover closely related topics that build on the techniques demonstrated in this guide. Each resource includes complete working code examples with step-by-step explanations to help you master additional API features and explore alternative implementation approaches in your own projects. + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) + +{{< /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/python/general/create-markdown-from-html-in-python-complete-guide/og-image.png b/html/english/python/general/create-markdown-from-html-in-python-complete-guide/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2f90e4f2bfe6e18cc7f18d09228d54c29a9556 GIT binary patch literal 48868 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 + string. The API is consistent across shapes. + question: What if I want a different shape? + - answer: Absolutely. The file you just created can be referenced with `Red circle` or inlined with `` tags. + question: Can I embed the SVG directly in HTML? + - answer: You could, but libraries like `svgwrite` handle namespace quirks and make + the code far more maintainable—especially when you start adding gradients or + animations. + question: Why not write raw XML? + type: FAQPage +tags: +- svg +- python +- vector-graphics +- programming-tutorial +title: Create SVG Document – Add a Circle and Save as SVG +url: /python/general/create-svg-document-add-a-circle-and-save-as-svg/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Create SVG Document – Add a Circle and Save as SVG + +Ever needed to **create SVG document** from code but weren’t sure where to start? You’re not alone; many developers hit that wall when they first dabble with vector graphics. In this tutorial we’ll walk through a tiny, self‑contained example that shows you how to **add circle to SVG**, then **save SVG file** so you can **export graphic as SVG** for use on the web or in design tools. + +We’ll keep things lightweight: just a few lines of Python, a popular SVG helper library, and a dash of explanation. By the end you’ll have a ready‑to‑use `circle.svg` sitting in your folder, and you’ll understand why each step matters—no vague “see docs” shortcuts. + +## What You’ll Need + +- Python 3.8+ (any recent version works) +- The `svgwrite` package – install it with `pip install svgwrite` +- A text editor or IDE (VS Code, PyCharm, or even Notepad will do) +- Write permission to the directory where you want the file saved + +That’s it. No heavyweight dependencies, no external services. + +## Step 1: Set Up the SVG Document + +Creating an SVG document is as simple as instantiating a `Drawing` object from `svgwrite`. Think of this object as the blank canvas where every shape lives. + +```python +import svgwrite + +# Step 1: Create a new SVG document (canvas) 800×800 pixels +dwg = svgwrite.Drawing(filename="circle.svg", size=("200px", "200px")) +``` + +> **Why this matters:** The `Drawing` class handles all the XML boilerplate for you—namespaces, headers, and the root `` element. By specifying a filename up front we already know where the file will end up, which makes the later **save svg file** step trivial. + +### Pro tip +If you plan to generate many files in a loop, give each `Drawing` a unique name or use `io.BytesIO` to keep everything in memory until you’re ready to write. + +## Step 2: Add a Circle to the SVG + +Now that the document exists, let’s **add circle to SVG**. The `add()` method accepts any shape object; a `Circle` is perfect for a simple red dot in the center. + +```python +# Step 2: Add a red circle element to the SVG root +center = (100, 100) # x, y coordinates (half of 200px canvas) +radius = 80 # radius in pixels +circle = dwg.circle(center=center, r=radius, fill='red') +dwg.add(circle) +``` + +> **Why we use `center` and `radius` variables:** Hard‑coding numbers makes the code harder to read and maintain. By naming the values we clarify intent—this circle sits smack‑in‑the‑middle of a 200 × 200 canvas and is large enough to be noticeable. + +### Edge case – Transparent background +If you need a transparent background (the default for SVG), you can skip setting a `fill` on the root. For a white background, add: + +```python +dwg.add(dwg.rect(insert=(0, 0), size=("200px", "200px"), fill='white')) +``` + +Place this before adding the circle so the rectangle sits underneath. + +## Step 3: Save the SVG File + +With the shape in place, the final act is to **save SVG file**. The `save()` method writes the XML to disk, and because we already gave the `Drawing` a filename, a single call does the job. + +```python +# Step 3: Save the SVG document to a file +dwg.save() +print("✅ circle.svg has been created in the current directory.") +``` + +> **What happens under the hood?** `svgwrite` serializes the element tree to a string, adds the XML declaration, and writes it using UTF‑8 encoding. If the target directory doesn’t exist, Python will raise a `FileNotFoundError`; make sure the path is valid or create it with `os.makedirs()`. + +### Bonus: Export graphic as SVG programmatically + +If you need the SVG content as a string—for example, to embed it in an HTML email—you can call `dwg.tostring()` instead of `save()`: + +```python +svg_content = dwg.tostring() +# Now you can send svg_content over a network, store it in a DB, etc. +``` + +## Full Working Example + +Putting it all together, here’s a complete, ready‑to‑run script: + +```python +import svgwrite +import os + +def create_svg_with_circle(output_path: str): + """ + Creates an SVG file containing a single red circle. + Parameters + ---------- + output_path: str + Full path where the SVG file will be saved. + """ + # Ensure the directory exists + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + # Initialise the SVG document (800×800 canvas) + dwg = svgwrite.Drawing(filename=output_path, size=("200px", "200px")) + + # Optional: add a white background rectangle + dwg.add(dwg.rect(insert=(0, 0), size=("200px", "200px"), fill='white')) + + # Add a red circle in the centre + center = (100, 100) + radius = 80 + circle = dwg.circle(center=center, r=radius, fill='red') + dwg.add(circle) + + # Save the file – this is the key step to **save svg file** + dwg.save() + print(f"✅ SVG saved to {output_path}") + +if __name__ == "__main__": + # Change this path to wherever you want the file + output_file = os.path.join(os.getcwd(), "circle.svg") + create_svg_with_circle(output_file) +``` + +**Expected output:** After running the script, you’ll see a `circle.svg` file in the same folder. Opening it in a browser or any vector editor shows a red circle centered on a white square—exactly what we programmed. + +## Common Questions & Gotchas + +- **What if I want a different shape?** Swap `dwg.circle` for `dwg.rect`, `dwg.ellipse`, or even a custom `` string. The API is consistent across shapes. +- **Can I embed the SVG directly in HTML?** Absolutely. The file you just created can be referenced with `Red circle` or inlined with `` tags. +- **Why not write raw XML?** You could, but libraries like `svgwrite` handle namespace quirks and make the code far more maintainable—especially when you start adding gradients or animations. + +## Conclusion + +You now know how to **create SVG document**, **add circle to SVG**, and **save SVG file** so you can **export graphic as SVG** with just a handful of Python lines. The pattern scales: replace the circle with any vector shape, loop over data to generate charts, or batch‑process assets for a design system. + +Next steps? Try adding text labels, experimenting with gradients, or generating a whole gallery of icons in a single script. If you’re curious about more advanced features, check out the `svgwrite` documentation on groups (``), transforms, and animation support. + +Happy coding, and may your vectors always stay crisp! + + +## What Should You Learn Next? + + +The following tutorials cover closely related topics that build on the techniques demonstrated in this guide. Each resource includes complete working code examples with step-by-step explanations to help you master additional API features and explore alternative implementation approaches in your own projects. + +- [Save SVG Document in Aspose.HTML for Java](/html/english/java/saving-html-documents/save-svg-document/) +- [Create and Manage SVG Documents in Aspose.HTML for Java](/html/english/java/creating-managing-html-documents/create-manage-svg-documents/) +- [svg to png java – Convert SVG to Image with Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-svg-to-image/) + +{{< /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/python/general/create-svg-document-add-a-circle-and-save-as-svg/og-image.png b/html/english/python/general/create-svg-document-add-a-circle-and-save-as-svg/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3462726924282fed06907c19d23c7a045eacb8 GIT binary patch literal 54606 zcmbTebx<7Lw>3-z2@)V^AUJ^l!QBG{2<{L(xI=Jf5;Qmj3+^t1%U}sGKyY^n4ucG? z1M_yC=XdWPx9a`sd+$_N(be>v)4k6=d#}Crf^b!3SsY9Ri z_P}@yT=_|RfQ5oGO(geTLep#EVA;ZtP?ie)xMgs8>$}0yvf)>Or-5jmv+H^Vj`f8y z`g-zA6YJ1tPd%IPKEz=-)6pm|!D+AB1kxDkTSR|DL8~f8KM#)%jt+*75S~_6Hm|uW z=CS0z7v8mVLH~hf04=v@zQUA`> z;}Aa3C>oIn+

ai2r|?7bh+D6HPfMYuw)vDbl(AeXO_&QRc%W6T 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 literal 0 HcmV?d00001 diff --git a/html/english/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md b/html/english/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md new file mode 100644 index 000000000..242ccb934 --- /dev/null +++ b/html/english/python/general/how-to-limit-recursion-in-html-processing-complete-guide/_index.md @@ -0,0 +1,262 @@ +--- +category: general +date: 2026-07-31 +description: How to limit recursion while handling HTML resources. Learn to configure + resource handling options, set max depth, and save processed files efficiently. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to limit recursion +- resource handling options +- max handling depth +- HTMLDocument save settings +- prevent infinite loops +language: en +lastmod: 2026-07-31 +og_description: How to limit recursion when working with HTML documents. This guide + shows you how to configure resource handling options, set a safe max depth, and + avoid infinite loops. +og_image_alt: Screenshot illustrating how to limit recursion settings in an HTML processing + script +og_title: How to Limit Recursion in HTML Processing – Step‑by‑Step +schemas: +- author: Aspose + dateModified: '2026-07-31' + description: How to limit recursion while handling HTML resources. Learn to configure + resource handling options, set max depth, and save processed files efficiently. + headline: How to Limit Recursion in HTML Processing – Complete Guide + type: TechArticle +- description: How to limit recursion while handling HTML resources. Learn to configure + resource handling options, set max depth, and save processed files efficiently. + name: How to Limit Recursion in HTML Processing – Complete Guide + steps: + - name: Understanding `max_handling_depth` + text: '- **Depth 0** – Only the root HTML file is processed; no external resources + are followed. - **Depth 1** – The root file *and* any first‑level resources + (e.g., a CSS file referenced directly) are processed. - **Depth 3** – The root, + its direct resources, and the resources of those resources, up to th' + - name: Why a Separate `SaveOptions` Object? + text: Separating **resource handling** from **serialization** keeps your code + modular. You could later add compression, embedding preferences, or different + output formats (e.g., PDF) without touching the recursion logic. + - name: Expected Result + text: '- The output file (`big_document_processed.html`) will contain the original + markup **plus** any resources discovered within the three‑level limit. - Any + deeper‑nested resources are omitted, preventing runaway recursion. - If the + original document referenced a circular chain (e.g., page A → page B → ' + type: HowTo +tags: +- recursion +- HTML processing +- Python +- resource handling +title: How to Limit Recursion in HTML Processing – Complete Guide +url: /python/general/how-to-limit-recursion-in-html-processing-complete-guide/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to Limit Recursion in HTML Processing – Complete Guide + +Ever wondered **how to limit recursion** when you’re parsing a massive HTML file? Chances are you’ve hit a stack‑overflow error or your script just stalls forever because a resource keeps pulling in more resources. In short, an uncontrolled recursion depth can turn a simple transformation into a nightmare. + +The good news? You can tell the processor to stop digging after a safe number of levels, and you’ll keep your memory footprint tidy. Below you’ll see a hands‑on example that shows **how to limit recursion** using resource‑handling options, why that matters, and how to save the cleaned‑up document without a hitch. + +> **Quick win:** Set `max_handling_depth` to `3` and you’ll prevent any deeper nesting from being followed—perfect for large, self‑referencing HTML bundles. + +--- + +## What You’ll Learn + +- Why uncontrolled recursion is risky in HTML document processing. +- How to configure **resource handling options** to impose a maximum depth. +- The exact code needed to load, process, and save an HTML file safely. +- Common pitfalls (e.g., circular includes) and how to avoid them. +- Tips for tweaking the depth limit for different project sizes. + +No external libraries are required beyond the standard HTML handling package (the snippet below uses a generic `HTMLDocument` class that many SDKs expose, such as Aspose.HTML for Python). If you’re using a different library, the concepts translate directly. + +--- + +## Prerequisites + +Before we dive in, make sure you have: + +| Requirement | Reason | +|-------------|--------| +| Python 3.9+ (or a comparable runtime) | Modern syntax and type hints | +| An HTML processing library that supports `ResourceHandlingOptions` (e.g., `aspose.html`) | Provides the `max_handling_depth` property | +| A large HTML file (`big_document.html`) you want to clean | Demonstrates the recursion limit in action | +| Write permissions to the output folder | Needed for `doc.save(...)` | + +If any of these are missing, install the library with `pip install aspose.html` (or the appropriate package) and you’ll be good to go. + +--- + +## Step 1: Load the HTML Document + +The first thing you do is create an `HTMLDocument` instance that points at your source file. Think of this object as the entry point to the whole DOM tree, and also the gateway to any external resources (images, CSS, scripts) that the document may reference. + +```python +# Step 1: Load the HTML document +doc = HTMLDocument("YOUR_DIRECTORY/big_document.html") +``` + +> **Why this matters:** Loading the document alone doesn’t trigger recursion yet, but it prepares the internal parser to discover linked resources later on. If the document contains `