From cbaef08f206e84ae53282a5b93259c665cdbee90 Mon Sep 17 00:00:00 2001 From: Muhammad Adil Date: Sun, 20 Sep 2026 06:30:37 +0000 Subject: [PATCH] Add 6 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: - How to perform an html to pdf tutorial using Python - How to change title in an HTML file using Python - How to limit nested resources when processing HTML with Aspose.HTML for Python - How to convert a local HTML file to PDF with Python - How to convert HTML to Markdown with Python – step‑by‑step guide - How to enable features while converting HTML to Markdown Auto-generated by Professionalize.Tutorials Agent --- .../_index.md | 262 ++++++++++++++++ .../_index.md | 203 ++++++++++++ .../_index.md | 219 +++++++++++++ .../_index.md | 218 +++++++++++++ .../_index.md | 242 +++++++++++++++ .../_index.md | 258 ++++++++++++++++ .../_index.md | 258 ++++++++++++++++ .../_index.md | 202 ++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 217 +++++++++++++ .../_index.md | 240 ++++++++++++++ .../_index.md | 257 +++++++++++++++ .../_index.md | 265 ++++++++++++++++ .../_index.md | 204 ++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 209 +++++++++++++ .../_index.md | 244 +++++++++++++++ .../_index.md | 260 ++++++++++++++++ .../_index.md | 262 ++++++++++++++++ .../_index.md | 203 ++++++++++++ .../_index.md | 218 +++++++++++++ .../_index.md | 222 +++++++++++++ .../_index.md | 246 +++++++++++++++ .../_index.md | 259 ++++++++++++++++ .../_index.md | 264 ++++++++++++++++ .../og-image.png | Bin 0 -> 43859 bytes .../_index.md | 205 ++++++++++++ .../og-image.png | Bin 0 -> 43951 bytes .../_index.md | 221 +++++++++++++ .../og-image.png | Bin 0 -> 44156 bytes .../_index.md | 221 +++++++++++++ .../og-image.png | Bin 0 -> 48045 bytes .../_index.md | 244 +++++++++++++++ .../og-image.png | Bin 0 -> 49334 bytes .../_index.md | 262 ++++++++++++++++ .../og-image.png | Bin 0 -> 45064 bytes .../_index.md | 263 ++++++++++++++++ .../_index.md | 206 ++++++++++++ .../_index.md | 219 +++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 246 +++++++++++++++ .../_index.md | 260 ++++++++++++++++ .../_index.md | 266 ++++++++++++++++ .../_index.md | 206 ++++++++++++ .../_index.md | 218 +++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 247 +++++++++++++++ .../_index.md | 259 ++++++++++++++++ .../_index.md | 265 ++++++++++++++++ .../_index.md | 202 ++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 246 +++++++++++++++ .../_index.md | 261 ++++++++++++++++ .../_index.md | 261 ++++++++++++++++ .../_index.md | 206 ++++++++++++ .../_index.md | 221 +++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 246 +++++++++++++++ .../_index.md | 259 ++++++++++++++++ .../_index.md | 258 ++++++++++++++++ .../_index.md | 200 ++++++++++++ .../_index.md | 217 +++++++++++++ .../_index.md | 217 +++++++++++++ .../_index.md | 240 ++++++++++++++ .../_index.md | 260 ++++++++++++++++ .../_index.md | 265 ++++++++++++++++ .../_index.md | 206 ++++++++++++ .../_index.md | 217 +++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 246 +++++++++++++++ .../_index.md | 258 ++++++++++++++++ .../_index.md | 266 ++++++++++++++++ .../_index.md | 205 ++++++++++++ .../_index.md | 219 +++++++++++++ .../_index.md | 222 +++++++++++++ .../_index.md | 246 +++++++++++++++ .../_index.md | 262 ++++++++++++++++ .../_index.md | 263 ++++++++++++++++ .../_index.md | 202 ++++++++++++ .../_index.md | 217 +++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 246 +++++++++++++++ .../_index.md | 261 ++++++++++++++++ .../_index.md | 258 ++++++++++++++++ .../_index.md | 203 ++++++++++++ .../_index.md | 205 ++++++++++++ .../_index.md | 218 +++++++++++++ .../_index.md | 240 ++++++++++++++ .../_index.md | 259 ++++++++++++++++ .../_index.md | 262 ++++++++++++++++ .../_index.md | 204 ++++++++++++ .../_index.md | 217 +++++++++++++ .../_index.md | 216 +++++++++++++ .../_index.md | 242 +++++++++++++++ .../_index.md | 292 ++++++++++++++++++ .../_index.md | 265 ++++++++++++++++ .../_index.md | 202 ++++++++++++ .../_index.md | 221 +++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 246 +++++++++++++++ .../_index.md | 263 ++++++++++++++++ .../_index.md | 260 ++++++++++++++++ .../_index.md | 205 ++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 245 +++++++++++++++ .../_index.md | 259 ++++++++++++++++ .../_index.md | 263 ++++++++++++++++ .../_index.md | 206 ++++++++++++ .../_index.md | 218 +++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 245 +++++++++++++++ .../_index.md | 260 ++++++++++++++++ .../_index.md | 264 ++++++++++++++++ .../_index.md | 206 ++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 222 +++++++++++++ .../_index.md | 245 +++++++++++++++ .../_index.md | 259 ++++++++++++++++ .../_index.md | 262 ++++++++++++++++ .../_index.md | 204 ++++++++++++ .../_index.md | 217 +++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 245 +++++++++++++++ .../_index.md | 259 ++++++++++++++++ .../_index.md | 260 ++++++++++++++++ .../_index.md | 203 ++++++++++++ .../_index.md | 217 +++++++++++++ .../_index.md | 218 +++++++++++++ .../_index.md | 242 +++++++++++++++ .../_index.md | 258 ++++++++++++++++ .../_index.md | 263 ++++++++++++++++ .../_index.md | 202 ++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 221 +++++++++++++ .../_index.md | 246 +++++++++++++++ .../_index.md | 263 ++++++++++++++++ .../_index.md | 260 ++++++++++++++++ .../_index.md | 204 ++++++++++++ .../_index.md | 218 +++++++++++++ .../_index.md | 220 +++++++++++++ .../_index.md | 245 +++++++++++++++ .../_index.md | 261 ++++++++++++++++ 144 files changed, 32413 insertions(+) create mode 100644 html/arabic/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/arabic/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/arabic/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/arabic/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/arabic/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/arabic/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/chinese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/chinese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/chinese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/chinese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/chinese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/chinese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/czech/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/czech/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/czech/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/czech/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/czech/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/czech/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/dutch/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/dutch/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/dutch/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/dutch/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/dutch/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/dutch/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/english/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/english/python/general/how-to-change-title-in-an-html-file-using-python/og-image.png create mode 100644 html/english/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/english/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/og-image.png create mode 100644 html/english/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/english/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/og-image.png create mode 100644 html/english/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/english/python/general/how-to-enable-features-while-converting-html-to-markdown/og-image.png create mode 100644 html/english/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/english/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/og-image.png create mode 100644 html/english/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/english/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/og-image.png create mode 100644 html/french/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/french/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/french/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/french/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/french/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/french/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/german/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/german/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/german/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/german/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/german/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/german/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/greek/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/greek/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/greek/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/greek/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/greek/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/greek/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/hindi/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/hindi/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/hindi/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/hindi/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/hindi/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/hindi/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/hongkong/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/hongkong/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/hongkong/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/hongkong/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/hongkong/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/hongkong/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/hungarian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/hungarian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/hungarian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/hungarian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/hungarian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/hungarian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/indonesian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/indonesian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/indonesian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/indonesian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/indonesian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/indonesian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/italian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/italian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/italian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/italian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/italian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/italian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/japanese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/japanese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/japanese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/japanese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/japanese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/japanese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/korean/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/korean/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/korean/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/korean/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/korean/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/korean/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/polish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/polish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/polish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/polish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/polish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/polish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/portuguese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/portuguese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/portuguese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/portuguese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/portuguese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/portuguese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/russian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/russian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/russian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/russian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/russian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/russian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/spanish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/spanish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/spanish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/spanish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/spanish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/spanish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/swedish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/swedish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/swedish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/swedish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/swedish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/swedish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/thai/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/thai/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/thai/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/thai/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/thai/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/thai/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/turkish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/turkish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/turkish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/turkish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/turkish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/turkish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md create mode 100644 html/vietnamese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md create mode 100644 html/vietnamese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md create mode 100644 html/vietnamese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md create mode 100644 html/vietnamese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md create mode 100644 html/vietnamese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md create mode 100644 html/vietnamese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md diff --git a/html/arabic/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/arabic/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..95b08e73e2 --- /dev/null +++ b/html/arabic/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,262 @@ +--- +category: general +date: 2026-09-19 +description: تعلم كيفية تغيير العنوان في ملف HTML باستخدام بايثون. يغطي هذا الدليل + قراءة HTML، وتحديث وسم العنوان، وحفظ HTML المعدل. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: ar +lastmod: 2026-09-19 +og_description: كيفية تغيير العنوان في ملف HTML باستخدام بايثون. اتبع هذا المثال الكامل + لقراءة HTML، وتحديث وسم العنوان، وحفظ المستند المعدل. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: كيفية تغيير العنوان في ملف HTML باستخدام بايثون – دليل خطوة بخطوة +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: كيفية تغيير العنوان في ملف HTML باستخدام بايثون +url: /ar/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# كيفية تغيير العنوان في ملف HTML باستخدام بايثون + +إذا كنت بحاجة إلى **how to change title** في مستند HTML برمجياً، فإن بايثون يجعل المهمة سهلة. في هذا الدرس ستقرأ ملف HTML، تُحدّث عنصر ``، وتحفظ الـ HTML المعدل مرة أخرى على القرص—كل ذلك باستخدام كود واضح وقابل للتنفيذ. + +تغيير عنوان الصفحة خطوة شائعة عندما تُنشئ مواقع ثابتة، أو تُخصص صفحات تم استخراجها، أو تُ automatisé تحديثات SEO. بنهاية هذا الدليل ستعرف كيف تُـ **update html title**، وكيف تُـ **read html with python**، وكيف تُـ **save modified html** بأمان. + +## المتطلبات المسبقة + +قبل أن تبدأ، تأكد من وجود: + +- Python 3.8 أو أحدث مثبت +- حزمة `beautifulsoup4` (`pip install beautifulsoup4`) +- ملف HTML تريد تحريره (المثال يستخدم `index.html` في مجلد تختاره) + +لا توجد خدمات خارجية مطلوبة؛ كل شيء يُنفّذ محليًا. + +## الخطوة 1: تحميل ملف HTML باستخدام بايثون + +المهمة الأولى هي **load html file python**‑style. استخدام `BeautifulSoup` يمنحك محللًا متسامحًا يعمل مع علامات غير مكتملة. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*لماذا هذه الخطوة مهمة:* +`BeautifulSoup` يبني تمثيلًا شجريًا، مما يتيح لك الاستعلام وتعديل العناصر دون التعامل اليدوي مع السلاسل النصية. الـ `html.parser` المدمج سريع ولا يتطلب ملفات تنفيذية إضافية. + +## الخطوة 2: تحديد عنصر `<title>` + +عادةً ما تحتوي مستندات HTML على وسم `<title>` واحد داخل `<head>`. نستخرج أول ظهور، وهو ما يفي بمتطلب **update html title**. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*لماذا نتحقق من `None`*: +بعض أجزاء HTML قد تُغفل عن العنوان. إضافته تلقائيًا يمنع الأخطاء لاحقًا ويحافظ على صلابة السكريبت. + +## الخطوة 3: تغيير نص العنوان + +الآن نقوم بـ **update html title** عن طريق إسناد نص جديد إلى خاصية السلسلة للوسم. هذه هي جوهر عملية **how to change title**. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +خاصية `string` تمثل عقدة النص داخل `<title>`. استبدالها يحدّث الـ DOM في الذاكرة. + +## الخطوة 4: حفظ الـ HTML المعدل + +أخيرًا، اكتب المستند المعدل إلى ملف جديد. هذا يُنفّذ خطوة **save modified html** ويترك الأصلي دون تغيير. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` ينسق الناتج مع مسافات بادئة، مما يجعل الملف سهل القراءة بعد التعديل. + +### النتيجة المتوقعة + +تشغيل السكريبت على مثال `index.html` يحتوي أصلاً على: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +ينتج مخرجات في الطرفية مشابهة لـ: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +الملف `index_modified.html` المحفوظ سيبدأ الآن بـ: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## البرنامج الكامل للنسخ واللصق السريع + +فيما يلي البرنامج الكامل الجاهز للتنفيذ الذي يجمع جميع الخطوات الأربع. احفظه باسم `change_title.py` وعدّل `YOUR_DIRECTORY` حسب الحاجة. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +تشغيل السكريبت: + +```bash +python change_title.py +``` + +ستظهر لك رسائل الطرفية وملف `index_modified.html` الجديد مع العنوان المحدث. + +## نصائح إضافية وحالات خاصة + +| الحالة | ما الذي يجب فعله | +|-----------|------------| +| **وجود وسوم `<title>` متعددة** | `soup.find_all("title")` تُعيد قائمة؛ حدّث العنصر الأول أو كرّر إذا كنت بحاجة لتغيير جميعها. | +| **مشكلات الترميز** | افتح الملفات باستخدام `encoding="utf-8-sig"` إذا كان هناك BOM، أو اكتشف الترميز باستخدام `chardet`. | +| **ملفات HTML كبيرة** | استخدم محلل `lxml` (`BeautifulSoup(html_content, "lxml")`) لأداء أفضل. | +| **الحفاظ على التنسيق الأصلي** | إذا كان عليك الحفاظ على المسافات الدقيقة، اكتب `str(soup)` بدلاً من `prettify()`. | +| **الأتمتة عبر ملفات متعددة** | غلف المنطق داخل دالة وكرّر عبر `Path.rglob("*.html")`. | + +هذه التغييرات تحافظ على منطق **how to change title** الأساسي مع التكيف مع مشاريع العالم الحقيقي. + +## الخلاصة + +أنت الآن تعرف كيف تُـ **how to change title** في أي مستند HTML باستخدام بايثون. غطّى الدرس قراءة HTML، تحديد وسم `<title>`، تحديث نصه، و**saving modified html** بأمان. باستخدام البرنامج الكامل يمكنك دمج هذا النمط في مولّدات المواقع الثابتة، خطوط أنابيب SEO، أو أي أتمتة تتطلب تغييرات ديناميكية في العناوين. + +بعد ذلك، استكشف مواضيع ذات صلة مثل **read html with python** لاستخراج وسوم meta، أو تقنيات **load html file python** للتعامل مع علامات غير صحيحة. جرّب المعالجة الدفعية لتحديث العناوين عبر موقع كامل—مهارتك الجديدة هي الأساس للعديد من مهام أتمتة الويب. Happy coding! + +## ما الذي ينبغي أن تتعلمه لاحقًا؟ + +الدروس التالية تغطي مواضيع ذات صلة وثيقة تبني على التقنيات التي تم توضيحها في هذا الدليل. كل مصدر يتضمن أمثلة كود كاملة مع شروحات خطوة بخطوة لمساعدتك على إتقان ميزات API إضافية واستكشاف نهج تنفيذية بديلة في مشاريعك. + +- [كيفية حفظ HTML باستخدام Aspose.Html – دليل C# كامل](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [كيفية حفظ HTML في C# – دليل كامل باستخدام معالج موارد مخصص](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [كيفية تحويل HTML إلى PNG – دليل خطوة بخطوة كامل](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /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-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/arabic/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..c688b07380 --- /dev/null +++ b/html/arabic/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,203 @@ +--- +category: general +date: 2026-09-19 +description: تحويل ملف HTML محلي إلى PDF باستخدام Python و Aspose.HTML – دليل كامل + خطوة بخطوة يغطي أيضًا خيارات تحويل HTML إلى PDF باستخدام Python. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: ar +lastmod: 2026-09-19 +og_description: تحويل ملف HTML محلي إلى PDF باستخدام بايثون. تعلم أفضل طريقة لتحويل + HTML إلى PDF بايثون مع Aspose.HTML، بما في ذلك تضمين الخطوط ومعالجة الأخطاء. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: تحويل ملف HTML محلي إلى PDF باستخدام بايثون – دليل كامل +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: كيفية تحويل ملف HTML محلي إلى PDF باستخدام بايثون +url: /ar/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to convert a local HTML file to PDF with Python + +إذا كنت بحاجة إلى **تحويل ملف HTML محلي إلى PDF** في مشروع بايثون، فإن هذا الدرس يوضح لك حلاً جاهزًا للتنفيذ. ستتعرف على كيفية إعداد مكتبة Aspose.HTML، وتكوين خيارات PDF، وتنفيذ التحويل في بضع أسطر من الشيفرة فقط. يشرح الدليل أيضًا أفضل الممارسات لـ **convert html to pdf python**، حتى تتمكن من تعديل الشيفرة لتناسب سير عملك. + +الخطوات أدناه تغطي كل ما تحتاج معرفته: تثبيت الـ SDK، إعداد خيارات الحفظ، التعامل مع المشكلات الشائعة، والتحقق من النتيجة. في نهاية المقال ستحصل على دالة قابلة لإعادة الاستخدام يمكنك إدراجها في أي تطبيق بايثون. + +## Prerequisites + +قبل أن تبدأ، تأكد من وجود ما يلي: + +* Python 3.8 أو أحدث مثبت على جهازك. +* ترخيص فعال لـ Aspose.HTML for Python (الإصدار التجريبي المجاني يكفي للتقييم). +* ملف HTML محلي تريد تحويله إلى PDF (مثال: `page.html`). + +لا تحتاج إلى أي تبعيات نظام إضافية؛ الـ SDK يحتوي على كل ما يلزم لتوليد PDF. + +## Install the Aspose.HTML package + +يتم توزيع Aspose.HTML SDK عبر PyPI. قم بتثبيته باستخدام `pip` داخل بيئة العمل الافتراضية الخاصة بك: + +```bash +pip install aspose-html +``` + +يعرض تنفيذ الأمر نسخة الحزمة المثبتة، مما يؤكد أن الحزمة جاهزة للاستيراد. + +## Step 1: Import the required classes + +تستند عملية التحويل إلى فئتين رئيسيتين: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` توفر الطريقة الساكنة `convert_html` التي تقوم بالتحويل الفعلي. +* `PDFSaveOptions` تتيح لك ضبط مخرجات PDF بدقة، مثل تضمين الخطوط القياسية. + +## Step 2: Create PDF save options and enable embedding of standard fonts + +تضمن عملية تضمين الخطوط أن يظهر ملف PDF الناتج بنفس الشكل على جميع الأجهزة، حتى إذا لم يكن لدى القارئ الخطوط مثبتة محليًا. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +يوصى بتعيين `embed_standard_fonts` إلى `True` في معظم سيناريوهات الإنتاج لأنه يزيل تحذيرات استبدال الخطوط في قارئات PDF. + +## Step 3: Convert the HTML file to PDF using the configured options + +الآن استدعِ `Converter.convert_html`، مع تمرير مسار ملف HTML المصدر، ومسار ملف PDF الوجهة، وكائن الخيارات الذي أعددته: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +إذا نجح التحويل، تُعيد الطريقة `None` ويظهر ملف PDF في الموقع الذي حددته. + +## Full example in a reusable function + +تغليف المنطق داخل دالة يجعل من السهل إعادة استخدامها عبر مشاريع متعددة: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Why the function helps + +* **التحقق من صحة الإدخال** – استثناء `FileNotFoundError` يسهل عملية تصحيح الأخطاء عندما يكون مسار HTML غير صحيح. +* **إنشاء المجلدات تلقائيًا** – `os.makedirs(..., exist_ok=True)` يمنع حدوث أخطاء “المجلد غير موجود”. +* **تكوين تضمين الخطوط** – يمكنك إيقاف تضمين الخطوط للحصول على ملفات أصغر إذا كنت تعلم أن البيئة المستهدفة تحتوي بالفعل على الخطوط المطلوبة. + +## Common edge cases and how to handle them + +| Situation | Recommended handling | +|-----------|----------------------| +| **HTML contains external CSS or images** | استخدم عناوين URL مطلقة أو انسخ الموارد بجوار ملف HTML؛ Aspose.HTML يتبع نفس قواعد المتصفح. | +| **Large HTML files (>10 MB)** | زد الحد الافتراضي للذاكرة بتعيين `pdf_options.memory_limit` إذا صادفت `OutOfMemoryException`. | +| **You need password‑protected PDFs** | عيّن `pdf_options.encryption_details` مع كلمة مرور للمستخدم قبل استدعاء `convert_html`. | +| **Running in a headless server** | لا تحتاج إلى أي إعداد إضافي؛ الـ SDK لا يعتمد على واجهة رسومية. | + +معالجة هذه السيناريوهات مسبقًا تحميك من أخطاء وقت التشغيل غير المتوقعة. + +## Verifying the conversion result + +بعد انتهاء السكربت، افتح ملف PDF الناتج بأي قارئ (Adobe Reader، Chrome، إلخ). يجب أن يتطابق التخطيط البصري مع HTML الأصلي، وتظهر جميع الخطوط بشكل صحيح لأنها مُضمَّنة. + +يمكنك أيضًا التأكد برمجياً من وجود الملف وأن حجمه غير صفر: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Pro tips for production use + +* **Batch processing** – كرّر العملية على قائمة من ملفات HTML واستدعِ `html_to_pdf` لكل ملف؛ أعد استخدام كائن `PDFSaveOptions` واحد لتقليل تكلفة إنشاء الكائنات. +* **Logging** – دمج وحدة `logging` في بايثون لتسجيل أوقات التحويل وأي استثناءات. +* **Performance** – عند تحويل عدد كبير من الملفات، فكر في تشغيل التحويلات بالتوازي باستخدام `concurrent.futures.ThreadPoolExecutor`، مع مراعاة أن الـ SDK آمن للخيوط فقط عند استدعاءات `Converter` منفصلة. + +## Conclusion + +أصبح لديك الآن طريقة كاملة وجاهزة للإنتاج **لتحويل ملف HTML محلي إلى PDF** باستخدام بايثون. يغطي الحل الخطوات الأساسية—تثبيت Aspose.HTML، تكوين خيارات PDF، التعامل مع الحالات الطرفية الشائعة، والتحقق من النتيجة—مع توضيح سير عمل **convert html to pdf python** بشكل عام. + +من هنا يمكنك استكشاف ميزات متقدمة مثل تشفير PDF، أحجام صفحات مخصصة، أو إضافة علامات مائية، جميعها مدعومة من نفس الـ SDK. جرّب الخيارات التي تناسب مشروعك، وستتمكن من أتمتة تحويل HTML إلى PDF بثقة في أي بيئة بايثون. + +--- + + +## What Should You Learn Next? + +الدروس التالية تغطي مواضيع ذات صلة وثيقة تبني على التقنيات التي تم توضيحها في هذا الدليل. كل مورد يتضمن أمثلة شيفرة كاملة مع شرح خطوة بخطوة لمساعدتك على إتقان ميزات API إضافية واستكشاف أساليب تنفيذ بديلة في مشاريعك. + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [Convert HTML to PDF in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /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-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/arabic/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..49dc9ce82a --- /dev/null +++ b/html/arabic/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,219 @@ +--- +category: general +date: 2026-09-19 +description: تعلم تحويل HTML إلى Markdown باستخدام بايثون. يوضح هذا الدرس كيفية حفظ + HTML كـ Markdown وتوليد Markdown من HTML بسرعة. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: ar +lastmod: 2026-09-19 +og_description: حوّل HTML إلى Markdown باستخدام بايثون. اتبع هذا الدليل لحفظ HTML + كـ Markdown، وإنشاء Markdown من HTML، وإنشاء ملف تحويل HTML إلى Markdown. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: تحويل HTML إلى Markdown في بايثون – دليل برمجي كامل +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: كيفية تحويل HTML إلى Markdown باستخدام Python – دليل خطوة بخطوة +url: /ar/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# كيفية تحويل HTML إلى Markdown باستخدام Python – دليل خطوة بخطوة + +إذا كنت بحاجة إلى **تحويل HTML إلى Markdown**، فإن هذا الدليل يشرح لك العملية بالكامل. ستتعرف على كيفية **حفظ HTML كـ Markdown**، وتوليد Markdown من HTML، وإنشاء *ملف html إلى markdown* يمكن استخدامه في مولدات المواقع الثابتة، أو خطوط توثيق، أو أي سير عمل يفضّل النص العادي. + +يغطي الشرح كل شيء بدءًا من تثبيت المكتبة المطلوبة وحتى معالجة الحالات الخاصة مثل الصور المدمجة والتنسيق المخصص. في النهاية، ستحصل على سكربت جاهز للتنفيذ وفهم واضح لأسباب أهمية كل خطوة. + +## المتطلبات المسبقة + +قبل أن تبدأ، تأكد من وجود ما يلي: + +- Python 3.8 أو أحدث مثبت على جهازك. +- إلمام أساسي ببرمجة Python. +- إمكانية الوصول إلى الطرفية أو موجه الأوامر. +- مكتبة `aspose.html` (أو أي حزمة متوافقة لتحويل HTML إلى Markdown). يستخدم هذا الشرح **Aspose.HTML for Python via .NET**، التي توفر الفئات `HTMLDocument`، `MarkdownSaveOptions`، و `Converter` كما هو موضح في مثال الكود. + +> **نصيحة احترافية:** إذا كنت تفضّل حلاً بحتًا للـ Python، يمكنك استبدال `aspose.html` بحزمة `html2text`. سيظل التدفق العام نفسه. + +## الخطوة 1: تثبيت مكتبة التحويل + +أولاً، قم بتثبيت المكتبة التي توفر `HTMLDocument`، `MarkdownSaveOptions`، و `Converter`. نفّذ الأمر التالي: + +```bash +pip install aspose-html +``` + +تحتوي الحزمة على المحرك الأصلي اللازم **لإنشاء markdown من html** بسرعة وبدقة عالية. عادةً ما تكتمل عملية التثبيت في أقل من دقيقة على اتصال إنترنت عادي. + +## الخطوة 2: تحميل مستند HTML المصدر + +تحميل ملف HTML هو الإجراء الأول الملموس في خط أنابيب التحويل. تقوم فئة `HTMLDocument` بتحليل الملف وبناء DOM في الذاكرة، والذي يتجول فيه المحول لاحقًا لإنتاج Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **لماذا هذا مهم:** بإنشاء كائن `HTMLDocument`، تضمن أن البُنى المعقدة—مثل الجداول والقوائم والأنماط المضمنة—تُفسَّر بشكل صحيح قبل التحويل. تخطي هذه الخطوة سيجبر المحول على قراءة النص الخام، مما يؤدي إلى فقدان التنسيق. + +## الخطوة 3: ضبط خيارات حفظ Markdown + +كائن `MarkdownSaveOptions` يتيح لك ضبط تنسيق المخرجات بدقة. لإنتاج **Git‑flavored Markdown**، عيّن خاصية `formatter` إلى `"GIT"`. هذا يتطابق مع الصياغة المستخدمة في منصات مثل GitHub وGitLab وBitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +يمكنك أيضًا تعديل إعدادات أخرى، مثل `preserve_links` أو `code_block_style`، حسب ما تخطط لـ **حفظ html كـ markdown** في الأدوات اللاحقة. + +## الخطوة 4: تحويل HTML إلى Markdown وحفظ النتيجة + +بعد تحميل المستند وضبط الخيارات، استدعِ الطريقة الساكنة `convert_html`. تقوم هذه الطريقة بقراءة الـ DOM، وتطبيق المنسق المختار، وكتابة ملف الإخراج. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +بعد تشغيل السكربت، ستجد ملفًا جديدًا باسم `output.md` في الدليل المحدد. فتحه سيظهر لك Markdown نظيف ومتوافق مع Git جاهز للتحكم في الإصدارات أو النشر. + +## الخطوة 5: التحقق من ملف الـ markdown المُولَّد + +فحص سريع يساعدك على التأكد من نجاح التحويل وأن **ملف html إلى markdown** يحتوي على المحتوى المتوقع. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +الناتج النموذجي لصفحة HTML بسيطة يكون كالتالي: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +إذا لاحظت فقدان عناوين أو قوائم مشوهة، عُد إلى **الخطوة 3** وجرب قيمًا مختلفة لـ `formatter` (`"COMMONMARK"`، `"MARKDOWN_EXTRA"`). + +## متقدم: معالجة الصور والمسارات النسبية + +عند احتواء HTML المصدر على صور، يمكن للمحول إما تضمينها كـ data URIs أو الحفاظ على سمات `src` الأصلية. لجعل عملية **توليد markdown من html** خفيفة، قد ترغب في نسخ ملفات الصور إلى مجلد موازٍ وتعديل المسارات. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +بعد التحويل، سيشير الـ Markdown إلى الصور مثل `![Alt text](images/picture.png)`. هذا النهج يعمل جيدًا عندما تقوم لاحقًا بـ **حفظ html كـ markdown** في مولد موقع ثابت يتوقع وجود الأصول في مجلد مخصص. + +## السكربت الكامل يمكنك نسخه‑ولصقه + +فيما يلي السكربت الكامل القابل للتنفيذ والذي يدمج جميع الخطوات التي تم مناقشتها. احفظه باسم `convert_html_to_md.py` وشغّله باستخدام `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### النتيجة المتوقعة + +تشغيل السكربت يطبع رسالة تأكيد متبوعة بأول عشر أسطر من ملف الـ Markdown، كما هو موضح سابقًا. يمكن فتح `output.md` في أي محرر نصوص، أو معاينته في VS Code، أو رفعه إلى مستودع Git. + +## أسئلة شائعة ومعالجة الحالات الخاصة + +| السؤال | الجواب | +|----------|--------| +| **ماذا لو كان ملف HTML كبيرًا (> 10 ميغابايت؟** | فئة `HTMLDocument` تقوم ببث الإدخال، لذا يبقى استهلاك الذاكرة معتدلًا. مع ذلك، قد تحتاج إلى زيادة حد الذاكرة لعملية Python إذا واجهت `MemoryError`. | +| **هل يمكنني تحويل سلسلة HTML بدلاً من ملف؟** | نعم. استخدم `HTMLDocument.from_string(html_string)` (أو المُنشئ المكافئ) قبل استدعاء `Converter.convert_html`. | +| **كيف أحافظ على تعليقات HTML الأصلية؟** | عيّن `md_options.preserve_comments = True`. ستظهر التعليقات كتعليقات HTML (`<!-- … -->`) داخل ملف الـ Markdown. | +| **هل يمكن استهداف لهجة Markdown مختلفة؟** | غيّر `md_options.formatter` إلى `"COMMONMARK"` أو `"MARKDOWN_EXTRA"` حسب المنصة المستهدفة. | +| **هل أحتاج لتثبيت .NET runtime بشكل منفصل؟** | حزمة `aspose-html` تتضمن الـ runtime المطلوب لمعظم الأنظمة. على Linux، تأكد من تثبيت `libgdiplus` (`sudo apt-get install libgdiplus`). | + +## الخلاصة + +أصبحت الآن تعرف كيف **تحول HTML إلى Markdown** باستخدام Python، وكيف **تحفظ html كـ markdown**، وكيف **تولد markdown من html** مع تحكم دقيق في التنسيق والأصول. يوضح السكربت كامل سير العمل—from تحميل الملف المصدر إلى إنتاج ملف *html إلى markdown* نظيف جاهز للتحكم في الإصدارات أو النشر. + +بعد ذلك، استكشف مواضيع ذات صلة مثل **تحويل دفعات متعددة من ملفات HTML**، دمج خطوة التحويل في خط أنابيب CI/CD، أو تخصيص مخرجات الـ Markdown لمولدات مواقع ثابتة معينة مثل Hugo أو Jekyll. جرّب إعدادات `MarkdownSaveOptions` المتنوعة لتكييف النتيجة مع دليل أسلوب مشروعك. + +تحويل سعيد! + +## ما الذي يجب أن تتعلمه بعد ذلك؟ + +الدروس التالية تغطي مواضيع ذات صلة وثيقة تبني على التقنيات التي تم توضيحها في هذا الدليل. كل مورد يتضمن أمثلة شفرة كاملة مع شروحات خطوة‑ب‑خطوة لمساعدتك على إتقان ميزات API إضافية واستكشاف أساليب تنفيذ بديلة في مشاريعك. + +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/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/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/arabic/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..13827b543f --- /dev/null +++ b/html/arabic/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,218 @@ +--- +category: general +date: 2026-09-19 +description: كيفية تفعيل الميزات أثناء تحويل HTML إلى Markdown باستخدام بايثون. تعلم + تحويل مستند HTML وحفظه كـ Markdown مع تحكم دقيق في الميزات. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: ar +lastmod: 2026-09-19 +og_description: كيفية تمكين الميزات أثناء تحويل HTML إلى Markdown. يوضح لك هذا الدليل + خطوة بخطوة كيفية تحويل مستند HTML وحفظه كـ Markdown مع تحكم دقيق. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: كيفية تمكين الميزات أثناء تحويل HTML إلى Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: كيفية تمكين الميزات أثناء تحويل HTML إلى Markdown +url: /ar/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# كيفية تمكين الميزات أثناء تحويل HTML إلى Markdown + +إذا كنت بحاجة إلى **how to enable features** أثناء التحويل، فإن هذا الدليل يقدم لك حلاً كاملاً قابلاً للتنفيذ. سترى بالضبط كيفية تحويل HTML إلى Markdown، والتحكم في الميزات التي يتم إنتاجها في Markdown، وحفظ HTML كـ Markdown في خطوة واحدة. + +يستخدم المثال **GroupDocs.Conversion** Python SDK الشهير، لكن المفاهيم تنطبق على أي مكتبة تسمح لك بتكوين مجموعات الميزات. بحلول نهاية هذا الدرس يمكنك تحويل مستند HTML، والاحتفاظ فقط بالروابط والفقرات، وتجنب الجداول أو الصور أو كتل الشيفرة غير المرغوبة. + +## ما ستحقه + +* **how to enable features** في خيارات حفظ Markdown +* سير عمل واضح لـ **convert html to markdown** +* القدرة على **how to convert html** مع إخراج انتقائي +* سكريبت جاهز للتنفيذ يقوم بـ **convert html document** و **save html as markdown** + +### المتطلبات المسبقة + +* Python 3.8+ مثبت +* حزمة `groupdocs-conversion` (تثبيت باستخدام `pip install groupdocs-conversion`) +* ملف HTML تجريبي (`sample.html`) في دليل معروف + +--- + +## كيفية تمكين الميزات في تحويل Markdown + +الخطوة الأولى هي إنشاء كائن `MarkdownSaveOptions` وإخبار المحول بالعناصر التي تريد الاحتفاظ بها. في هذا الدرس نُمكّن فقط **links** و **paragraphs**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**لماذا يعمل هذا:** +* `HTMLDocument` يلف ملف المصدر بحيث يمكن للمحول قراءته. +* `MarkdownSaveOptions` يحتوي على جميع إعدادات التحويل؛ قائمة `features` هي الخاصية الأساسية التي **how to enable features**. +* عن طريق تعيين `["Link", "Paragraph"]` تخبر المحرك بإنتاج روابط Markdown فقط (`[text](url)`) وفقرات عادية، مع تجاهل الصور والجداول وغيرها من العلامات. +* `Converter.convert_html` ينفّذ عملية **convert html to markdown** الفعلية ويكتب النتيجة إلى `sample.md`. + +--- + +## كيفية تحويل مستند HTML بخيارات مخصصة + +إذا احتجت لاحقًا لإضافة المزيد من علامات الميزات—مثل `"Header"` أو `"Bold"`—فقط قم بتمديد القائمة: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +ستشمل نفس الاستدعاء لـ `Converter.convert_html` الآن تلك العناصر الإضافية. يتيح لك هذا النمط **how to convert html** بطريقة قابلة للتكوين بشكل كبير دون كتابة محللات مخصصة. + +--- + +## كيفية حفظ HTML كـ Markdown في مجلد محدد + +طريقة `convert_html` تقبل مسار إخراج مطلق أو نسبي. لـ **save html as markdown** في مجلد فرعي يُدعى `output`، عدّل الوسيط الثالث: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +تشغيل السكريبت ينشئ دليل `output` (إذا لم يكن موجودًا) ويكتب ملف Markdown هناك. هذا النهج يحافظ على تنظيم ملفات HTML المصدر وMarkdown المُولدة بشكل مرتب. + +--- + +## السكريبت الكامل الذي يمكنك نسخه‑ولصقه + +فيما يلي البرنامج الكامل، جاهز للتنفيذ. استبدل `YOUR_DIRECTORY` بالمسار الذي يحتوي على `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**المخرجات المتوقعة** (مطبوعة على وحدة التحكم): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +افتح `sample.md` وسترى فقط روابط Markdown وفقرات عادية، على سبيل المثال: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +تم حذف جميع عناصر HTML الأخرى لأن **how to enable features** حدّ من المخرجات إلى النوعين المحددين. + +--- + +## الأسئلة الشائعة والحالات الخاصة + +| السؤال | الجواب | +|----------|--------| +| *ماذا لو كان ملف HTML لا يحتوي على روابط؟* | المحول لا يزال يكتب الفقرات؛ سيحتوي الناتج على نص عادي دون صيغة الروابط. | +| *هل يمكنني تعطيل جميع الميزات؟* | ضبط `markdown_options.features = []` ينتج ملف Markdown فارغ. استخدم ذلك فقط للاختبار. | +| *كيف يتعامل SDK مع HTML غير صالح؟* | المحلل يحاول تنظيف العلامات المشوهة قبل تطبيق مرشح الميزات. يتم تسجيل الأخطاء ولكنها لا توقف التحويل. | +| *هل من الممكن الاحتفاظ بالصور مع حذف الجداول؟* | نعم. اضبط `markdown_options.features = ["Link", "Paragraph", "Image"]`. قائمة الميزات إضافية، ليست حصرية. | +| *ماذا لو احتجت لتحويل العديد من الملفات في مجلد؟* | غلف منطق التحويل في حلقة تتكرر على `Path.glob("*.html")`. يمكن إعادة استخدام نفس إعداد **how to enable features** لكل ملف. | + +**نصيحة احترافية:** عند معالجة دفعات كبيرة، أنشئ كائن `MarkdownSaveOptions` مرة واحدة وأعد استخدامه. هذا يقلل من عبء إنشاء الكائنات ويحافظ على سرعة خط أنابيب **convert html to markdown**. + +--- + +## الخلاصة + +أنت الآن تعرف **how to enable features** عندما **convert html to markdown**، وكيفية **how to convert html** بإخراج انتقائي، وكيفية **convert html document** و **save html as markdown** باستخدام سكريبت Python مختصر. من خلال تكوين `MarkdownSaveOptions.features`، تحصل على تحكم كامل في عناصر Markdown التي تظهر في الملف النهائي. + +### الخطوات التالية + +* استكشف علامات ميزات إضافية مثل `"Header"`، `"Bold"`، و `"Italic"` لإثراء مخرجات Markdown الخاصة بك. +* دمج هذا السكريبت مع مراقب ملفات (مثل `watchdog`) لتحويل ملفات HTML الجديدة تلقائيًا عند وصولها. +* راجع [GroupDocs.Conversion Python SDK documentation](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) للحصول على سيناريوهات متقدمة مثل تحويل PDF إلى Markdown أو DOCX إلى HTML. + +لا تتردد في تجربة مجموعات ميزات مختلفة ومشاركة نتائجك مع المجتمع. تحويل سعيد! + +## ما الذي يجب أن تتعلمه بعد ذلك؟ + +الدروس التالية تغطي مواضيع ذات صلة وثيقة تبني على التقنيات الموضحة في هذا الدليل. كل مورد يتضمن أمثلة شيفرة كاملة مع شروحات خطوة بخطوة لمساعدتك على إتقان ميزات API إضافية واستكشاف أساليب تنفيذ بديلة في مشاريعك. + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /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-nested-resources-when-processing-html-with-aspo/_index.md b/html/arabic/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..3f6352aa86 --- /dev/null +++ b/html/arabic/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,242 @@ +--- +category: general +date: 2026-09-19 +description: تعلم كيفية تحديد حد للموارد المتداخلة في Aspose.HTML للبايثون باستخدام + ResourceHandlingOptions. سيطر على أقصى عمق للمعالجة وتجنّب الحلقات اللانهائية. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: ar +lastmod: 2026-09-19 +og_description: قصر الموارد المتداخلة في Aspose.HTML للبايثون باستخدام ResourceHandlingOptions. + اضبط أقصى عمق للمعالجة لمنع التكرار العميق وتحسين الأداء. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: كيفية تحديد حدود الموارد المتداخلة في Aspose.HTML للبايثون – دليل خطوة بخطوة +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: كيفية تحديد حدود الموارد المتداخلة عند معالجة HTML باستخدام Aspose.HTML للبايثون +url: /ar/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# كيفية تحديد حد للموارد المتداخلة عند معالجة HTML باستخدام Aspose.HTML للغة بايثون + +إذا كنت بحاجة إلى **تحديد حد للموارد المتداخلة** أثناء عرض أو تحويل HTML، يوضح لك هذا الدليل الخطوات الدقيقة لتكوين Aspose.HTML للغة بايثون. التحكم في عمق معالجة الموارد يمنع التكرار غير المنضبط عندما تتضمن الصفحة عدة طبقات من مراجع CSS أو JavaScript أو الصور. + +يعد تحديد حد للموارد المتداخلة أمرًا مهمًا بشكل خاص للزواحف (crawlers) واسعة النطاق، وسلاسل معالجة عرض البريد الإلكتروني، أو أي سير عمل آلي يجب أن يبقى ضمن حدود الذاكرة والوقت. في الأقسام التالية ستتعرف على سبب ضرورة ضبط حد العمق، وكيفية استخدام الفئة `ResourceHandlingOptions`، وكيفية التحقق من أن الحد يعمل كما هو متوقع. + +## لماذا يجب عليك تحديد حد للموارد المتداخلة + +غالبًا ما تشير مستندات HTML إلى موارد أخرى—أوراق الأنماط، السكريبتات، الصور، الخطوط، أو حتى ملفات HTML أخرى. كل من هذه الموارد يمكن أن يشير بدوره إلى ملفات إضافية، مكوّنًا شجرة من الاعتمادات. بدون حارس، يمكن أن تصبح الشجرة عميقة بلا حدود: + +* صفحة تُحمِّل ملف CSS يستورد ملف CSS آخر، والذي يستورد آخر، وهكذا. +* قد يقوم JavaScript بتحميل سكريبتات إضافية بشكل ديناميكي. +* قد يتضمن قالب بريد إلكتروني صورًا تشير إلى عناوين URL خارجية تُعيد توجيهها إلى أصول أخرى. + +عندما ينمو عمق التكرار دون مراقبة، تواجه المخاطر التالية: + +* **استهلاك مفرط للذاكرة** – كل مورد يتم جلبه يشغل مخازن مؤقتة. +* **زيادة زمن المعالجة** – يضاعف تأخير الشبكة مع كل مستوى. +* **احتمال حدوث حلقات لا نهائية** – يمكن أن تتسبب المراجع الدائرية في عدم عودة المحرك. + +ضبط **الحد الأقصى لعمق المعالجة** يخبر Aspose.HTML بالتوقف عن متابعة روابط الموارد بعد عدد محدد من المستويات، مما يضمن أداءً متوقعًا. + +## كيفية تحديد حد للموارد المتداخلة في Aspose.HTML للغة بايثون + +توفر Aspose.HTML الفئة `ResourceHandlingOptions` التي تحتوي على خاصية `max_handling_depth`. من خلال تعيين قيمة عددية (مثلاً `3`)، تُخبر المحرك بالتوقف بعد ثلاثة مستويات متداخلة. + +فيما يلي مثال كامل وقابل للتنفيذ يوضح سير العمل بالكامل: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### شرح كل خطوة + +1. **تثبيت الحزمة** – عجلة `aspose-html` مطلوبة. يُظهر أمر `pip install` كتعليق للاكتمال. +2. **استيراد الفئات** – `HtmlDocument` يحمل الصفحة، `ResourceHandlingOptions` يحمل الحد، و`HtmlLoadOptions` يربط الاثنين معًا. +3. **إنشاء كائن الخيارات** – إنشاء مثيل من `ResourceHandlingOptions` يمنحك حاوية قابلة للتعديل. +4. **ضبط `max_handling_depth`** – عيّن `3` (أو أي عدد صحيح) لتقييد المحرك بثلاث مستويات من الموارد المتداخلة. هذا هو جوهر **تحديد حد للموارد المتداخلة**. +5. **إرفاق الخيارات بتكوين التحميل** – `HtmlLoadOptions` يسمح بتمرير `resource_options` إلى المحمل. +6. **تحميل HTML** – يقبل مُنشئ `HtmlDocument` عنوان URL أو مسار ملف مع `load_options`. الآن يحترم المحرك حد العمق. +7. **التحقق** – عبر التكرار على `document.resources`، يمكنك رؤية عدد الموارد التي تم جلبها فعليًا وأعمق مستوى تم الوصول إليه. إذا كان أعمق مستوى هو `3` أو أقل، فإن الحد نجح. +8. **الحفظ** – احفظ المستند المعالج. يحتوي الملف المحفوظ فقط على الموارد حتى العمق المسموح به. + +#### النتيجة المتوقعة + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +ستختلف الأرقام حسب الصفحة المصدر، لكن أعمق مستوى لا يجب أن يتجاوز `3` لأننا ضبطنا `max_handling_depth = 3`. + +## الاختلافات الشائعة والحالات الطرفية + +### تغيير حد العمق + +قد تحتاج إلى حد أعمق أو أضيق بناءً على بيئتك: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### إلغاء الحد تمامًا + +ضبط الخاصية إلى `0` يخبر Aspose.HTML **بإزالة أي قيود على العمق**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +افعل ذلك فقط عندما تكون متأكدًا من أن HTML المصدر سليم. + +### التعامل مع المراجع الدائرية + +حتى مع وجود حد للعمق، قد تظهر مراجع دائرية على نفس المستوى. يكتشف Aspose.HTML الدورات ويتوقف عن تحميل مورد تمت معالجته مسبقًا، بغض النظر عن إعداد العمق. ومع ذلك، يقلل ضبط `max_handling_depth` الأقل من احتمال مواجهة دورة في المقام الأول. + +### استخدام الحد مع الملفات المحلية + +تنطبق نفس الطريقة على ملفات HTML المحلية: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +يتعامل المحرك مع سمات `href` أو `src` النسبية بنفس طريقة عناوين URL البعيدة، مطبقًا حد العمق على موارد نظام الملفات أيضًا. + +### دمج الحد مع ميزات Aspose.HTML أخرى + +إذا كنت بحاجة أيضًا إلى التحكم في **مهلة تحميل الموارد**، يمكنك دمج `ResourceHandlingOptions` مع `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +كلا الخيارين مستقلان، لذا يمكنك ضبط الأداء والأمان في آنٍ واحد. + +## نصائح احترافية للاستخدام في بيئات الإنتاج + +* **سجّل شجرة الموارد** – عند استكشاف الأخطاء، كرر على `document.resources` وسجّل عنوان URL وعمق كل مورد. يساعدك ذلك على فهم سبب تجاوز صفحة معينة لتوقعاتك. +* **خزن الموارد التي تم جلبها مؤقتًا** – إذا كنت تعالج نفس الأصول الخارجية بشكل متكرر، فعّل التخزين المؤقت لتجنب طلبات الشبكة المتكررة. +* **استخدم القائمة البيضاء** – إذا كانت هناك نطاقات موثوقة فقط، صفي `document.resources` بعد التحميل وتخلص من أي موارد خارج القائمة البيضاء. +* **اختبر مع صفحات ذات حالات طرفية** – أنشئ ملف HTML اصطناعي يستورد سلسلة من 10 ملفات CSS. تحقق من أن الحد يقطع السلسلة كما هو مقصود. + +## الخلاصة + +أنت الآن تعرف كيفية **تحديد حد للموارد المتداخلة** في Aspose.HTML للغة بايثون عبر ضبط `ResourceHandlingOptions.max_handling_depth`. ضبط حد العمق يحمي تطبيقك من استهلاك مفرط للذاكرة، وزمن معالجة طويل، وحلقات لا نهائية محتملة ناتجة عن مراجع موارد عميقة أو دائرية. + +من هذه النقطة يمكنك: + +* تعديل العمق ليتناسب مع ميزانيتك الأداءية (`resource_handling_options.max_handling_depth`). +* دمج الحد مع مهلات الشبكة، التخزين المؤقت، أو قوائم النطاقات الموثوقة لإنشاء خطوط أنابيب قوية. +* استكشاف المواضيع ذات الصلة مثل **خيارات معالجة الموارد**، **الحد الأقصى لعمق المعالجة**، و**معالجة الموارد المتداخلة** لتضييق التحكم في معالجة HTML بشكل أكبر. + +جرّب قيم عمق مختلفة ولاحظ كيف يتغير عدد الموارد التي تم تحميلها. عندما تكون جاهزًا، دمج هذا النمط في خدمة تحويل أو عرض HTML الأكبر لضمان تنفيذ متوقع، آمن، وفعّال. + +## ما الذي يجب أن تتعلمه بعد ذلك؟ + +الدروس التالية تغطي مواضيع ذات صلة وثيقة تبني على التقنيات الموضحة في هذا الدليل. كل مورد يتضمن أمثلة شفرة كاملة مع شروحات خطوة بخطوة لمساعدتك على إتقان ميزات API إضافية واستكشاف أساليب تنفيذ بديلة في مشاريعك. + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /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-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/arabic/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..38448e2be7 --- /dev/null +++ b/html/arabic/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,258 @@ +--- +category: general +date: 2026-09-19 +description: تعلم درسًا حول تحويل HTML إلى PDF في بايثون يوضح كيفية إنشاء PDF من HTML + بسرعة باستخدام Aspose.HTML. اتبع الدليل خطوة بخطوة الآن. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: ar +lastmod: 2026-09-19 +og_description: 'دروس تحويل HTML إلى PDF: تحويل أي صفحة HTML إلى ملف PDF باستخدام + بايثون و Aspose.HTML. يوضح هذا الدليل كيفية إنشاء PDF من HTML في دقائق.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: دورة تحويل HTML إلى PDF في بايثون – دليل كامل خطوة بخطوة +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: كيفية إجراء دليل تحويل HTML إلى PDF باستخدام بايثون +url: /ar/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# كيفية إجراء دليل html إلى pdf باستخدام Python + +إذا كنت بحاجة إلى **دليل html إلى pdf**، يوضح لك هذا الدليل بالضبط كيفية إنشاء ملف PDF من HTML ببضع أسطر فقط من كود Python. سواء كنت تقوم بأتمتة إنشاء التقارير أو تصدير محتوى الويب للقراءة دون اتصال، تجعل مكتبة Aspose.HTML عملية التحويل سهلة. + +في هذا الدليل ستتعلم كيفية إعداد البيئة، كتابة سكريبت التحويل، ومعالجة الحالات الشائعة مثل الملفات المفقودة أو إعدادات الصفحة المخصصة. في النهاية يمكنك **how to generate pdf** من أي مصدر HTML دون مغادرة بيئة Python. + +## ما ستحتاجه + +* Python 3.8 أو أحدث مثبت +* رخصة Aspose.HTML for Python سارية (إصدار تجريبي مجاني يعمل للتقييم) +* `pip` للوصول إلى تثبيت حزمة `aspose-html` +* ملف HTML بسيط تريد تحويله (مثال، `input.html`) + +> **نصيحة احترافية:** احتفظ بملفات HTML والموارد (الصور، CSS) في نفس الدليل لتجنب مشاكل حل المسارات أثناء التحويل. + +## الخطوة 1: تثبيت حزمة Aspose.HTML + +افتح الطرفية (Terminal) وشغّل الأمر التالي: + +```bash +pip install aspose-html +``` + +حزمة `aspose-html` wheel تتضمن المكتبات الأصلية اللازمة للتصيير عالي الجودة، لذا لا توجد تبعيات نظام إضافية مطلوبة. + +## الخطوة 2: إنشاء سكريبت Python بسيط + +أنشئ ملفًا جديدًا باسم `convert_html_to_pdf.py` والصق الكود أدناه. يتبع هذا السكريبت نمط **html to pdf tutorial** لعملية من ثلاث خطوات: الاستيراد، تعريف المسارات، واستدعاء التحويل. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### لماذا يعمل هذا + +* **استيراد `Converter`** يمنحك الوصول إلى API عالي المستوى يخفِّي محرك التصيير. +* **تعريف المسارات المطلقة** يمنع الأخطاء الناتجة عن المسارات النسبية عندما يُشغّل السكريبت من دليل عمل مختلف. +* **`Converter.convert_html`** ينفّذ كامل خط أنابيب التصيير — تحليل HTML، تخطيط CSS، وتسلسل PDF — في استدعاء واحد، وهو الطريقة الموصى بها **how to generate pdf** بسرعة. + +## الخطوة 3: تشغيل السكريبت والتحقق من الناتج + +نفّذ السكريبت من الطرفية: + +```bash +python convert_html_to_pdf.py +``` + +إذا تم الإعداد بشكل صحيح، ستظهر لك: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +افتح `output.pdf` بأي عارض PDF. يجب أن يبدو المستند مطابقًا للصفحة الأصلية HTML، بما في ذلك الخطوط، الصور، وتنسيق CSS الأساسي. + +![معاينة PDF المُنشأ](https://example.com/images/pdf-preview.png "لقطة شاشة لملف PDF تم إنشاؤه من ملف HTML باستخدام Python"){: .center-image alt="لقطة شاشة لملف PDF تم إنشاؤه من ملف HTML باستخدام Python"} + +## الخطوة 4: تخصيص التحويل (اختياري) + +الدليل الأساسي **html to pdf tutorial** يغطي تحويلًا من نوع واحد إلى واحد، لكن السيناريوهات الواقعية غالبًا ما تتطلب تعديلات: + +| المتطلب | كيفية تحقيقه باستخدام Aspose.HTML | +|-------------|------------------------------------| +| تحديد حجم الصفحة (A4, Letter) | تمرير كائن `PdfSaveOptions` إلى `convert_html` | +| إضافة هوامش أو رؤوس/تذييلات | استخدام `PdfPageSettings` داخل الخيارات | +| تضمين خطوط مخصصة | التأكد من إمكانية الوصول إلى ملفات الخط وتعيين `FontSettings` | + +فيما يلي مثال يحدد حجم الصفحة إلى A4 ويضيف هامشًا بمقدار 1 بوصة: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **ملاحظة:** استخدام الخيارات المخصصة هو التقنية المفضلة **generate pdf from html** عندما تحتاج إلى تحكم دقيق في التخطيط. + +## الخطوة 5: معالجة ملفات HTML متعددة (تحويل دفعي) + +إذا كان لديك مجلد يحتوي على تقارير HTML كثيرة، يمكنك التكرار عبرها: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +هذا المقتطف يوضح سير عمل **python convert html pdf** قابل للتوسع يتناسب مع خطوط أنابيب CI أو الوظائف المجدولة. + +## المشكلات الشائعة وكيفية تجنّبها + +| المشكلة | السبب | الحل | +|-------|-------|-----| +| الصور مفقودة في PDF | مسارات الصور النسبية التي تنكسر عندما يُشغّل السكريبت من مجلد مختلف | استخدام مسارات مطلقة أو تعيين `base_uri` في خيارات `Converter` | +| عدم تطبيق CSS | ورقة الأنماط الخارجية المشار إليها بعنوان URL يتطلب اتصال إنترنت | تحميل ورقة الأنماط محليًا والإشارة إليها بمسار نسبي | +| استبدال الخط | الخط غير مثبت على الجهاز المضيف | إدراج ملف الخط في المشروع وتكوين `FontSettings` | + +معالجة هذه الحالات الطرفية يضمن أن عملية **export html as pdf** تكون قوية عبر البيئات. + +## مثال كامل وقابل للتنفيذ + +فيما يلي السكريبت الكامل الذي يتضمن إعدادات اختيارية، معالجة الأخطاء، ومنطق المعالجة الدفعية. انسخه إلى `full_html_to_pdf.py` وشغّله كما هو موضح سابقًا. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +تشغيل هذا السكريبت ينتج ملف PDF لكل ملف HTML في الدليل المستهدف، مع تطبيق إعدادات صفحة متسقة — حل **python convert html pdf** كامل جاهز للإنتاج. + +## الخاتمة + +أصبح لديك الآن **html to pdf tutorial** عملي يوضح كيفية إنشاء ملفات PDF من HTML باستخدام Python ومكتبة Aspose.HTML. يغطي الدليل إعداد البيئة، سكريبت التحويل البسيط، التخصيص الاختياري، المعالجة الدفعية، ونصائح استكشاف الأخطاء. + +من هنا يمكنك استكشاف مواضيع ذات صلة مثل **how to generate pdf** مع العلامات المائية، دمج ملفات PDF متعددة، أو تحويل HTML إلى صيغ أخرى مثل DOCX. جرّب API `PdfSaveOptions` لضبط المخرجات بدقة، ودمج السكريبت في خدمات الويب أو خطوط أنابيب التقارير الآلية. + +برمجة سعيدة، واستمتع بتحويل محتوى HTML إلى ملفات PDF مصقولة! + +## ما الذي يجب أن تتعلمه لاحقًا؟ + +الدروس التالية تغطي مواضيع ذات صلة وثيقة تبني على التقنيات التي تم عرضها في هذا الدليل. كل مصدر يتضمن أمثلة كود كاملة مع شروحات خطوة بخطوة لمساعدتك على إتقان ميزات API إضافية واستكشاف أساليب تنفيذ بديلة في مشاريعك. + +- [تحويل HTML إلى PDF باستخدام Aspose.HTML – دليل كامل خطوة بخطوة](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [تحويل HTML إلى PDF باستخدام Aspose.HTML – دليل التلاعب الكامل](/html/english/) +- [كيفية تحويل HTML إلى PDF باستخدام Java – باستخدام Aspose.HTML للـ Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /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-change-title-in-an-html-file-using-python/_index.md b/html/chinese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..8b8a5b1864 --- /dev/null +++ b/html/chinese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,258 @@ +--- +category: general +date: 2026-09-19 +description: 学习如何使用 Python 更改 HTML 文件中的标题。本指南涵盖读取 HTML、更新标题标签以及保存修改后的 HTML。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: zh +lastmod: 2026-09-19 +og_description: 如何使用 Python 更改 HTML 文件中的标题。请参考完整示例,读取 HTML,更新 title 标签,并保存修改后的文档。 +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: 如何使用 Python 更改 HTML 文件的标题 – 步骤指南 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: 如何使用 Python 更改 HTML 文件中的标题 +url: /zh/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 使用 Python 更改 HTML 文件中的标题 + +如果您需要在 HTML 文档中以编程方式 **how to change title**,Python 可以轻松完成此任务。在本教程中,您将读取一个 HTML 文件,更新 `<title>` 元素,并将修改后的 HTML 保存回磁盘——全部使用清晰、可运行的代码。 + +更改页面标题是生成静态站点、定制抓取页面或自动化 SEO 更新时的常见步骤。阅读完本指南后,您将了解如何 **update html title**,如何 **read html with python**,以及如何安全地 **save modified html**。 + +## 前置条件 + +- 已安装 Python 3.8 或更高版本 +- `beautifulsoup4` 包(`pip install beautifulsoup4`) +- 您想要编辑的 HTML 文件(示例使用您选择的文件夹中的 `index.html`) + +无需外部服务;所有操作均在本地运行。 + +## 步骤 1:使用 Python 加载 HTML 文件 + +第一步是以 **load html file python**‑style 加载 HTML 文件。使用 `BeautifulSoup` 可以获得一个宽容的解析器,能够处理不完美的标记。 + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*此步骤的重要性:* +`BeautifulSoup` 构建树形结构,使您能够在无需手动字符串处理的情况下查询和修改元素。内置的 `html.parser` 速度快且不需要额外的二进制文件。 + +## 步骤 2:定位 `<title>` 元素 + +HTML 文档通常在 `<head>` 中包含唯一的 `<title>` 标签。我们检索第一次出现的该标签,以满足 **update html title** 的需求。 + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*为什么要检查 `None`*: +某些 HTML 片段可能没有标题。自动添加标题可以防止后续错误并保持脚本的健壮性。 + +## 步骤 3:更改标题文本 + +现在我们通过为标签的 string 赋予新文本来 **update html title**。这就是 **how to change title** 操作的核心。 + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +`string` 属性表示 `<title>` 内的文本节点。覆盖它即可在内存中更新 DOM。 + +## 步骤 4:保存修改后的 HTML + +最后,将修改后的文档写入新文件。这完成了 **save modified html** 步骤,并保持原文件不变。 + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` 使用缩进格式化输出,使更改后的文件更易阅读。 + +### 预期输出 + +在原始包含以下内容的示例 `index.html` 上运行脚本: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +将在控制台产生类似以下的输出: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +保存的 `index_modified.html` 将以以下内容开头: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## 完整脚本,快速复制‑粘贴 + +下面是完整的、可直接运行的程序,结合了所有四个步骤。将其保存为 `change_title.py` 并根据需要调整 `YOUR_DIRECTORY`。 + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +运行脚本: + +```bash +python change_title.py +``` + +您将看到控制台消息以及包含更新后标题的新 `index_modified.html` 文件。 + +## 其他提示和边缘情况 + +| 情况 | 处理方法 | +|-----------|------------| +| **多个 `<title>` 标签** | `soup.find_all("title")` 返回一个列表;更新第一个元素,或在需要更改全部时遍历。 | +| **编码问题** | 如果存在 BOM,请使用 `encoding="utf-8-sig"` 打开文件,或使用 `chardet` 检测编码。 | +| **大型 HTML 文件** | 使用 `lxml` 解析器(`BeautifulSoup(html_content, "lxml")`)以获得更好性能。 | +| **保留原始格式** | 如果必须保留精确的空白,请使用 `str(soup)` 而不是 `prettify()`。 | +| **跨多个文件自动化** | 将逻辑封装在函数中,并遍历 `Path.rglob("*.html")`。 | + +这些变体在保持核心 **how to change title** 逻辑不变的同时,适应了实际项目的需求。 + +## 结论 + +您现在了解如何使用 Python 在任何 HTML 文档中 **how to change title**。本教程涵盖了读取 HTML、定位 `<title>` 标签、更新其文本以及安全地 **save modified html**。通过完整脚本,您可以将此模式集成到静态站点生成器、SEO 流程或任何需要动态更改标题的自动化任务中。 + +接下来,探索相关主题,例如用于提取 meta 标签的 **read html with python**,或用于处理错误标记的 **load html file python** 技术。尝试批量处理以在整个网站中更新标题——您新掌握的技能是众多网页自动化任务的基础。祝编码愉快! + +## 接下来您应该学习什么? + +以下教程涵盖与本指南技术密切相关的主题。每个资源都包含完整的可运行代码示例和逐步说明,帮助您掌握更多 API 功能并在项目中探索替代实现方式。 + +- [如何使用 Aspose.Html 保存 HTML – 完整 C# 指南](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [如何在 C# 中保存 HTML – 使用自定义资源处理器的完整指南](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [如何将 HTML 渲染为 PNG – 完整分步指南](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /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-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/chinese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..393073fdb8 --- /dev/null +++ b/html/chinese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,202 @@ +--- +category: general +date: 2026-09-19 +description: 使用 Python 和 Aspose.HTML 将本地 HTML 文件转换为 PDF —— 完整的分步指南,还涵盖了 Python 将 HTML + 转换为 PDF 的选项。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: zh +lastmod: 2026-09-19 +og_description: 使用 Python 将本地 HTML 文件转换为 PDF。了解使用 Aspose.HTML 将 HTML 转换为 PDF 的最佳方法,包括字体嵌入和错误处理。 +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: 使用 Python 将本地 HTML 文件转换为 PDF – 完整指南 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: 如何使用 Python 将本地 HTML 文件转换为 PDF +url: /zh/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何使用 Python 将本地 HTML 文件转换为 PDF + +如果您需要在 Python 项目中 **将本地 HTML 文件转换为 PDF**,本教程提供了一个可直接运行的解决方案。您将看到如何设置 Aspose.HTML 库、配置 PDF 选项,并仅用几行代码完成转换。指南还解释了 **convert html to pdf python** 的最佳实践,帮助您将代码适配到自己的工作流中。 + +下面的步骤涵盖了您需要了解的全部内容:安装 SDK、准备保存选项、处理常见陷阱以及验证输出。阅读完本文后,您将拥有一个可在任何 Python 应用中直接使用的可复用函数。 + +## 前置条件 + +在开始之前,请确保您具备以下条件: + +* 已在机器上安装 Python 3.8 或更高版本。 +* 拥有有效的 Aspose.HTML for Python 许可证(免费试用可用于评估)。 +* 已有要转换为 PDF 的本地 HTML 文件(例如 `page.html`)。 + +您无需额外的系统级依赖;SDK 已将生成 PDF 所需的一切打包。 + +## 安装 Aspose.HTML 包 + +Aspose.HTML SDK 通过 PyPI 分发。请在虚拟环境中使用 `pip` 安装: + +```bash +pip install aspose-html +``` + +运行该命令后会打印已安装的版本,确认该包可以被导入。 + +## 第一步:导入所需类 + +转换工作流依赖两个主要类: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` 提供执行实际转换的静态 `convert_html` 方法。 +* `PDFSaveOptions` 让您微调 PDF 输出,例如嵌入标准字体。 + +## 第二步:创建 PDF 保存选项并启用标准字体嵌入 + +嵌入字体可确保生成的 PDF 在任何设备上都保持相同外观,即使查看器本地未安装这些字体。 + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +建议在大多数生产场景下将 `embed_standard_fonts` 设置为 `True`,因为它可以消除 PDF 阅读器中的字体替换警告。 + +## 第三步:使用配置好的选项将 HTML 文件转换为 PDF + +现在调用 `Converter.convert_html`,传入源 HTML 路径、目标 PDF 路径以及您准备好的选项对象: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +如果转换成功,方法返回 `None`,并在您指定的位置生成 PDF 文件。 + +## 可复用函数的完整示例 + +将逻辑封装在函数中,可方便在多个项目中复用: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### 为什么使用函数 + +* **输入验证** – 当 HTML 路径错误时,`FileNotFoundError` 能让调试更轻松。 +* **自动创建目录** – `os.makedirs(..., exist_ok=True)` 可防止 “目录不存在” 错误。 +* **可配置的字体嵌入** – 若目标环境已具备所需字体,可关闭字体嵌入以生成更小的文件。 + +## 常见边缘情况及处理方式 + +| 情况 | 推荐处理方式 | +|-----------|----------------------| +| **HTML 包含外部 CSS 或图片** | 使用绝对 URL,或将资源复制到 HTML 文件旁边;Aspose.HTML 的行为与浏览器相同。 | +| **大型 HTML 文件(>10 MB)** | 如遇 `OutOfMemoryException`,通过设置 `pdf_options.memory_limit` 提升默认内存上限。 | +| **需要密码保护的 PDF** | 在调用 `convert_html` 前,使用 `pdf_options.encryption_details` 设置用户密码。 | +| **在无头服务器上运行** | 无需额外配置;SDK 不依赖 GUI。 | + +提前处理这些场景可避免运行时意外错误。 + +## 验证转换结果 + +脚本执行完毕后,使用任意阅读器(Adobe Reader、Chrome 等)打开生成的 PDF。视觉布局应与原始 HTML 保持一致,且所有字体均已正确嵌入。 + +您也可以通过代码确认文件是否存在且大小非零: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## 生产环境使用的专业技巧 + +* **批量处理** – 对 HTML 文件列表循环调用 `html_to_pdf`;复用同一个 `PDFSaveOptions` 实例以降低对象创建开销。 +* **日志记录** – 集成 Python 的 `logging` 模块,捕获转换时间戳和异常信息。 +* **性能优化** – 当需要转换大量文件时,可使用 `concurrent.futures.ThreadPoolExecutor` 并行执行,但请注意 SDK 仅对独立的 `Converter` 调用提供线程安全保障。 + +## 结论 + +现在,您已经掌握了一套完整、可投入生产的 **将本地 HTML 文件转换为 PDF** 的 Python 方法。该方案涵盖了关键步骤——安装 Aspose.HTML、配置 PDF 选项、处理常见边缘情况以及验证输出——并展示了更广泛的 **convert html to pdf python** 工作流。 + +接下来,您可以探索高级功能,如 PDF 加密、自定义页面尺寸或添加水印,这些均由同一 SDK 支持。尝试适合您项目的选项,您即可在任何 Python 环境中可靠地实现 HTML‑to‑PDF 自动化。 + +--- + + +## 接下来该学习什么? + +以下教程涵盖与本指南技术紧密相关的主题,帮助您在已有技巧的基础上进一步深化。每个资源都提供完整可运行的代码示例和逐步解释,帮助您掌握更多 API 功能并在项目中尝试不同实现方式。 + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [Convert HTML to PDF in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /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-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/chinese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..86be792a4c --- /dev/null +++ b/html/chinese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: 学习在 Python 中将 HTML 转换为 Markdown。本教程展示如何快速将 HTML 保存为 Markdown,以及如何从 HTML + 生成 Markdown。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: zh +lastmod: 2026-09-19 +og_description: 使用 Python 将 HTML 转换为 Markdown。请按照本指南将 HTML 保存为 Markdown、从 HTML 生成 + Markdown,并创建 HTML 到 Markdown 的文件。 +og_image_alt: Screenshot showing convert html to markdown script output +og_title: 在 Python 中将 HTML 转换为 Markdown – 完整编程指南 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: 如何使用 Python 将 HTML 转换为 Markdown——一步步指南 +url: /zh/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何使用 Python 将 HTML 转换为 Markdown – 步骤指南 + +如果您需要 **将 HTML 转换为 Markdown**,本指南将带您完整了解整个过程。您将看到如何 **将 HTML 保存为 Markdown**、从 HTML 生成 Markdown,以及生成可用于静态站点生成器、文档流水线或任何偏好纯文本标记的工作流的 *html to markdown file*。 + +本教程涵盖了从安装所需库到处理嵌入图像和自定义格式等边缘情况的所有内容。完成后,您将拥有一个可直接运行的脚本,并清晰了解每一步的意义。 + +## 前置条件 + +在开始之前,请确保您具备: + +- 已在机器上安装 Python 3.8 或更高版本。 +- 对 Python 脚本有基本了解。 +- 能够使用终端或命令提示符。 +- 已安装 `aspose.html` 库(或任何兼容的 HTML‑to‑Markdown 包)。本教程使用 **Aspose.HTML for Python via .NET**,其中提供了代码示例中使用的 `HTMLDocument`、`MarkdownSaveOptions` 和 `Converter` 类。 + +> **专业提示:** 如果您更倾向于纯 Python 方案,可以将 `aspose.html` 替换为 `html2text` 包。整体流程保持不变。 + +## 第 1 步:安装转换库 + +首先,安装提供 `HTMLDocument`、`MarkdownSaveOptions` 和 `Converter` 的库。运行以下命令: + +```bash +pip install aspose-html +``` + +该包捆绑了生成 **markdown from html** 所需的本地引擎,能够快速且高保真地完成转换。通常在标准宽带连接下,安装时间不超过一分钟。 + +## 第 2 步:加载源 HTML 文档 + +加载 HTML 文件是转换流水线中的第一个具体操作。`HTMLDocument` 类会解析文件并在内存中构建 DOM,随后转换器会遍历该 DOM 生成 Markdown。 + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **为何重要:** 通过创建 `HTMLDocument` 对象,您确保表格、列表和内联样式等复杂结构在转换前被正确解释。跳过此步骤会导致转换器直接读取原始文本,从而丢失格式。 + +## 第 3 步:配置 Markdown 保存选项 + +`MarkdownSaveOptions` 对象允许您微调输出格式。要生成 **Git‑flavored Markdown**,将 `formatter` 属性设为 `"GIT"`。这与 GitHub、GitLab、Bitbucket 等平台使用的语法相匹配。 + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +您还可以根据下游工具中 **save html as markdown** 的需求,调整 `preserve_links`、`code_block_style` 等其他设置。 + +## 第 4 步:将 HTML 转换为 Markdown 并保存结果 + +在文档已加载且选项已配置的情况下,调用静态 `convert_html` 方法。该方法读取 DOM、应用选定的格式化器,并写入输出文件。 + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +运行脚本后,您将在指定目录中看到一个名为 `output.md` 的新文件。打开它即可看到干净、兼容 Git 的 Markdown,准备好进行版本控制或发布。 + +## 第 5 步:验证生成的 markdown 文件 + +快速的完整性检查可以帮助您确认转换成功,并且 **html to markdown file** 包含预期内容。 + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +一个简单 HTML 页面典型的输出如下: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +如果发现标题缺失或列表格式错误,请返回 **第 3 步**,尝试不同的 `formatter` 值(如 `"COMMONMARK"`、`"MARKDOWN_EXTRA"`)。 + +## 高级:处理图像和相对路径 + +当源 HTML 包含图像时,转换器可以将其嵌入为 data URI,或保留原始 `src` 属性。为保持 **generate markdown from html** 过程的轻量化,您可能希望将图像文件复制到平行文件夹并相应调整路径。 + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +转换完成后,Markdown 将以 `![Alt text](images/picture.png)` 的形式引用图像。此做法在后续 **save html as markdown** 于需要将资源放在专用文件夹的静态站点生成器中时表现良好。 + +## 完整脚本(可直接复制粘贴) + +下面是完整、可运行的脚本,已整合所有讨论的步骤。将其保存为 `convert_html_to_md.py`,并使用 `python convert_html_to_md.py` 执行。 + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### 预期输出 + +运行脚本后会打印确认信息,并显示 Markdown 文件的前十行,如前文所示。生成的 `output.md` 可在任意文本编辑器中打开,在 VS Code 中预览,或提交到 Git 仓库。 + +## 常见问题与边缘情况处理 + +| Question | Answer | +|----------|--------| +| **如果 HTML 文件很大(> 10 MB)怎么办?** | `HTMLDocument` 类会流式读取输入,保持内存使用在适度范围。但如果出现 `MemoryError`,请考虑提升 Python 进程的内存限制。 | +| **能否转换 HTML 字符串而不是文件?** | 可以。使用 `HTMLDocument.from_string(html_string)`(或等价构造函数)在调用 `Converter.convert_html` 之前加载字符串。 | +| **如何保留原始 HTML 注释?** | 设置 `md_options.preserve_comments = True`。注释会以 HTML 注释形式(`<!-- … -->`)出现在 Markdown 文件中。 | +| **能否针对不同的 Markdown 方言?** | 将 `md_options.formatter` 改为 `"COMMONMARK"` 或 `"MARKDOWN_EXTRA"`,具体取决于目标平台。 | +| **需要单独安装 .NET 运行时吗?** | `aspose-html` 包已为大多数平台捆绑所需运行时。在 Linux 上,请确保已安装 `libgdiplus`(`sudo apt-get install libgdiplus`)。 | + +## 结论 + +现在,您已经掌握了使用 Python **convert HTML to Markdown** 的方法,了解了如何 **save html as markdown**,以及如何通过细粒度的选项 **generate markdown from html**,并对格式和资源进行控制。该脚本展示了完整工作流——从加载源文件到生成干净的 *html to markdown file*,可用于版本控制或发布。 + +接下来,您可以探索诸如 **批量转换多个 HTML 文件**、将转换步骤集成到 CI/CD 流水线,或为 Hugo、Jekyll 等特定静态站点生成器自定义 Markdown 输出等相关主题。尝试不同的 `MarkdownSaveOptions` 设置,以使结果符合项目的风格指南。 + +祝您转换愉快! + + +## 接下来您可以学习什么? + +以下教程涵盖与本指南技术紧密相关的主题,帮助您进一步掌握 API 功能并在项目中探索替代实现方案。每个资源都提供完整的可运行代码示例和逐步解释。 + +- [在 .NET 中使用 Aspose.HTML 将 HTML 转换为 Markdown](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [在 Aspose.HTML for Java 中将 HTML 转换为 Markdown](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown 转 HTML(Java) – 使用 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/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/chinese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..cf6c95f393 --- /dev/null +++ b/html/chinese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,217 @@ +--- +category: general +date: 2026-09-19 +description: 如何在使用 Python 将 HTML 转换为 Markdown 时启用功能。学习将 HTML 文档转换并将其保存为 Markdown,精确控制功能。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: zh +lastmod: 2026-09-19 +og_description: 如何在将 HTML 转换为 Markdown 时启用功能。本指南将逐步演示如何转换 HTML 文档并以细粒度控制将 HTML 保存为 + Markdown。 +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: 在将HTML转换为Markdown时如何启用功能 +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: 在将HTML转换为Markdown时如何启用功能 +url: /zh/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 在将 HTML 转换为 Markdown 时如何启用功能 + +如果您在转换过程中需要**如何启用功能**,本指南提供了完整且可运行的解决方案。您将确切看到如何将 HTML 转换为 Markdown,控制生成的 Markdown 功能,并在一次操作中将 HTML 保存为 Markdown。 + +示例使用流行的 **GroupDocs.Conversion** Python SDK,但这些概念同样适用于任何允许您配置功能集的库。完成本教程后,您可以转换 HTML 文档,仅保留链接和段落,避免不需要的表格、图像或代码块。 + +## 您将实现的目标 + +* **如何启用功能** 在 Markdown 保存选项中 +* 一个清晰的 **将 HTML 转换为 Markdown** 工作流 +* 能够 **如何转换 HTML** 并选择性输出 +* 一个可直接运行的脚本,**转换 HTML 文档** 并 **将 HTML 保存为 Markdown** + +### 前置条件 + +* 已安装 Python 3.8+ +* `groupdocs-conversion` 包(使用 `pip install groupdocs-conversion` 安装) +* 已知目录中的示例 HTML 文件(`sample.html`) + +--- + +## 在 Markdown 转换中如何启用功能 + +第一步是创建一个 `MarkdownSaveOptions` 对象,并告诉转换器您想保留哪些元素。在本教程中,我们仅启用 **链接** 和 **段落**。 + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**为什么这样有效:** +* `HTMLDocument` 包装源文件,以便转换器读取。 +* `MarkdownSaveOptions` 保存所有转换设置;`features` 列表是 **如何启用功能** 的关键属性。 +* 通过分配 `["Link", "Paragraph"]`,您告诉引擎仅生成 Markdown 链接(`[text](url)`)和普通段落,丢弃图像、表格和其他标记。 +* `Converter.convert_html` 执行实际的 **将 HTML 转换为 Markdown** 操作,并将结果写入 `sample.md`。 + +--- + +## 使用自定义选项转换 HTML 文档 + +如果您稍后需要添加更多功能标志——例如 `"Header"` 或 `"Bold"`——只需扩展列表: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +对 `Converter.convert_html` 的相同调用现在将包含这些额外元素。这种模式让您 **如何转换 HTML** 以高度可配置的方式进行,而无需编写自定义解析器。 + +--- + +## 在特定文件夹中将 HTML 保存为 Markdown + +`convert_html` 方法接受绝对或相对的输出路径。要在名为 `output` 的子文件夹中 **将 HTML 保存为 Markdown**,请调整第三个参数: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +运行脚本会创建 `output` 目录(如果不存在),并将 Markdown 文件写入其中。这种做法可让您的源 HTML 与生成的 Markdown 整齐地组织在一起。 + +--- + +## 完整脚本,复制粘贴即可 + +下面是完整的程序,已准备好运行。将 `YOUR_DIRECTORY` 替换为包含 `sample.html` 的路径。 + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**预期输出**(打印到控制台): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +打开 `sample.md`,您将仅看到 Markdown 链接和普通段落,例如: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +所有其他 HTML 元素已被省略,因为 **如何启用功能** 将输出限制为这两种选定类型。 + +--- + +## 常见问题与边缘情况 + +| Question | Answer | +|----------|--------| +| *如果 HTML 文件不包含链接怎么办?* | 转换器仍会写入段落;输出将只包含没有链接语法的纯文本。 | +| *我可以禁用所有功能吗?* | 将 `markdown_options.features = []` 设置为一个空列表会生成空的 Markdown 文件。仅在测试时使用此设置。 | +| *SDK 如何处理无效的 HTML?* | 解析器会尝试在应用功能过滤器之前清理错误的标记。错误会被记录,但不会中止转换。 | +| *是否可以保留图像而删除表格?* | 可以。将 `markdown_options.features = ["Link", "Paragraph", "Image"]`。功能列表是累加的,而非排他的。 | +| *如果需要转换文件夹中的多个文件怎么办?* | 将转换逻辑包装在遍历 `Path.glob("*.html")` 的循环中。相同的 **如何启用功能** 配置可以在每个文件中重复使用。 | + +**专业提示:** 在处理大批量时,只实例化一次 `MarkdownSaveOptions` 并重复使用。这可以减少对象创建开销,并保持 **将 HTML 转换为 Markdown** 流程的高速。 + +--- + +## 结论 + +现在您已经了解了在 **将 HTML 转换为 Markdown** 时 **如何启用功能**,以及如何使用选择性输出 **如何转换 HTML**,并使用简洁的 Python 脚本 **转换 HTML 文档** 并 **将 HTML 保存为 Markdown**。通过配置 `MarkdownSaveOptions.features`,您可以完全控制最终文件中出现的 Markdown 元素。 + +### 下一步 + +* 探索额外的功能标志,如 `"Header"`、`"Bold"` 和 `"Italic"`,以丰富您的 Markdown 输出。 +* 将此脚本与文件监视器(例如 `watchdog`)结合,以在新 HTML 文件到达时自动转换。 +* 查看 [GroupDocs.Conversion Python SDK 文档](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples),了解 PDF 转 Markdown 或 DOCX 转 HTML 等高级场景。 + +随意尝试不同的功能集,并与社区分享您的发现。祝您转换愉快! + +## 接下来您应该学习什么? + +以下教程涵盖与本指南技术紧密相关的主题,每个资源都包含完整的可运行代码示例和逐步解释,帮助您掌握更多 API 功能并在自己的项目中探索替代实现方式。 + +- [在 Aspose.HTML for Java 中将 HTML 转换为 Markdown](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown 转 HTML Java - 使用 Aspose.HTML 转换](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [如何在 Aspose HTML 中启用 JavaScript – 加载 HTML 并获取文本](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /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-nested-resources-when-processing-html-with-aspo/_index.md b/html/chinese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..83a470b898 --- /dev/null +++ b/html/chinese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,240 @@ +--- +category: general +date: 2026-09-19 +description: 学习如何使用 ResourceHandlingOptions 限制 Aspose.HTML for Python 中的嵌套资源。控制最大处理深度,避免无限循环。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: zh +lastmod: 2026-09-19 +og_description: 使用 ResourceHandlingOptions 限制 Aspose.HTML for Python 中的嵌套资源。设置最大处理深度以防止深度递归并提升性能。 +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: 如何在 Aspose.HTML for Python 中限制嵌套资源 – 步骤指南 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: 在使用 Aspose.HTML for Python 处理 HTML 时,如何限制嵌套资源 +url: /zh/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何在使用 Aspose.HTML for Python 处理 HTML 时限制嵌套资源 + +如果您需要在渲染或转换 HTML 时 **限制嵌套资源**,本指南将展示如何配置 Aspose.HTML for Python。控制资源处理的深度可以防止页面包含大量 CSS、JavaScript 或图像引用时出现递归失控的情况。 + +在大规模爬虫、邮件渲染流水线或任何需要在内存和时间预算内运行的自动化工作流中,限制嵌套资源尤为重要。接下来的章节将说明为何需要设置深度限制、如何使用 `ResourceHandlingOptions` 类以及如何验证限制是否按预期工作。 + +## 为什么要限制嵌套资源 + +HTML 文档经常引用其他资源——样式表、脚本、图像、字体,甚至其他 HTML 文件。每个资源又可能引用更多文件,形成一棵依赖树。如果没有防护,这棵树的深度可能会无限增长: + +* 页面加载一个 CSS 文件,该文件又 `@import` 另一个 CSS 文件,依此类推。 +* JavaScript 可能动态加载额外的脚本。 +* 邮件模板可能嵌入图像,这些图像的 URL 会重定向到更多资产。 + +当递归深度失控时,您面临的风险包括: + +* **内存消耗过大**——每获取一个资源都需要缓冲区。 +* **处理时间延长**——网络延迟会随层级增加而叠加。 +* **可能出现无限循环**——循环引用会导致引擎永不返回。 + +设置 **最大处理深度** 可让 Aspose.HTML 在达到指定层级后停止跟随资源链接,从而保证性能可预期。 + +## 在 Aspose.HTML for Python 中限制嵌套资源的方法 + +Aspose.HTML 提供了 `ResourceHandlingOptions` 类,其中包含 `max_handling_depth` 属性。通过为其赋予数值(例如 `3`),您可以指示引擎在三层嵌套后停止。 + +下面是一个完整、可运行的示例,演示整个工作流: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### 各步骤说明 + +1. **安装包**——需要 `aspose-html` wheel。出于完整性考虑,示例中以注释形式给出 `pip install` 命令。 +2. **导入类**——`HtmlDocument` 用于加载页面,`ResourceHandlingOptions` 保存深度限制,`HtmlLoadOptions` 将两者关联。 +3. **创建选项对象**——实例化 `ResourceHandlingOptions` 可得到一个可变容器。 +4. **设置 `max_handling_depth`**——将 `3`(或任意整数)赋给该属性,以限制引擎仅处理三层嵌套资源。这是 **限制嵌套资源** 的核心。 +5. **将选项附加到加载配置**——`HtmlLoadOptions` 允许您把 `resource_options` 传递给加载器。 +6. **加载 HTML**——`HtmlDocument` 的构造函数接受 URL 或文件路径以及 `load_options`。此时引擎会遵守深度限制。 +7. **验证**——遍历 `document.resources`,即可查看实际获取了多少资源以及遇到的最深层级。如果最深层级不超过 `3`,说明限制生效。 +8. **保存**——持久化处理后的文档。保存的文件仅包含符合深度限制的资源。 + +#### 预期输出 + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +具体数字会随源页面不同而变化,但最深层级永远不应超过 `3`,因为我们将 `max_handling_depth = 3`。 + +## 常见变体和边缘情况 + +### 更改深度限制 + +根据实际环境,您可能需要更深或更浅的限制: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### 完全禁用限制 + +将属性设为 `0` 表示 Aspose.HTML **取消任何深度限制**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +仅在确信源 HTML 行为良好时才这样做。 + +### 处理循环引用 + +即使设置了深度限制,循环引用仍可能在同一层级出现。Aspose.HTML 会检测循环并在已处理过的资源再次出现时停止加载,独立于深度设置。不过,降低 `max_handling_depth` 能在根本上减少触发循环的机会。 + +### 在本地文件中使用限制 + +相同的做法同样适用于本地 HTML 文件: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +引擎会把相对 `href` 或 `src` 属性视作远程 URL,仍然对文件系统资源应用深度限制。 + +### 与其他 Aspose.HTML 功能结合使用 + +如果您还需要控制 **资源下载超时**,可以将 `ResourceHandlingOptions` 与 `NetworkOptions` 组合: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +两个选项相互独立,您可以同时微调性能和安全性。 + +## 生产环境的实用技巧 + +* **记录资源树**——调试时,遍历 `document.resources` 并记录每个资源的 URL 与深度,有助于了解为何某些页面超出预期。 +* **缓存已获取的资源**——如果重复处理相同的外部资产,启用缓存可避免冗余网络请求。 +* **结合白名单**——如果只信任特定域名,加载后过滤 `document.resources`,剔除不在白名单内的资源。 +* **使用边缘案例页面进行测试**——创建一个合成 HTML 文件,链式导入 10 个 CSS 文件。验证您的深度限制能够如预期截断链条。 + +## 结论 + +现在,您已经掌握了通过配置 `ResourceHandlingOptions.max_handling_depth` 在 Aspose.HTML for Python 中 **限制嵌套资源** 的方法。设置深度限制可以保护应用免受过度内存使用、处理时间过长以及深度嵌套或循环资源引用导致的潜在无限循环。 + +接下来您可以: + +* 根据性能预算调整深度(`resource_handling_options.max_handling_depth`)。 +* 将该限制与网络超时、缓存或域名白名单结合,构建更稳健的流水线。 +* 进一步研究 **resource handling options**、**max handling depth**、**nested resource handling** 等相关主题,以更细致地控制 HTML 处理。 + +尝试不同的深度值,观察加载的资源数量如何变化。当您准备好后,将此模式集成到更大的 HTML 转换或渲染服务中,以确保执行过程可预测、安全且高效。 + +## 接下来您应该学习什么? + +以下教程涵盖与本指南技术紧密相关的主题,帮助您在项目中进一步掌握 API 功能并探索替代实现方案: + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /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-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/chinese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..40050d435d --- /dev/null +++ b/html/chinese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,257 @@ +--- +category: general +date: 2026-09-19 +description: 学习 Python 中的 HTML 转 PDF 教程,快速使用 Aspose.HTML 将 HTML 生成 PDF。立即按照分步指南操作。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: zh +lastmod: 2026-09-19 +og_description: HTML 转 PDF 教程:使用 Python 和 Aspose.HTML 将任何 HTML 页面转换为 PDF 文件。本指南展示如何在几分钟内从 + HTML 生成 PDF。 +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Python 中的 HTML 转 PDF 教程 – 完整的逐步指南 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: 如何使用 Python 完成 HTML 转 PDF 教程 +url: /zh/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何使用 Python 执行 html to pdf 教程 + +如果您需要 **html to pdf 教程**,本指南将准确展示如何仅使用几行 Python 代码就能将 HTML 生成 PDF。无论是自动化报告生成,还是将网页内容导出以供离线阅读,Aspose.HTML 库都能让转换变得轻而易举。 + +在本教程中,您将学习如何设置环境、编写转换脚本,并处理常见的边缘情况,如文件缺失或自定义页面设置。完成后,您即可 **how to generate pdf** 文件,直接在 Python 生态系统中完成任意 HTML 源的转换。 + +## 您需要的条件 + +* 已安装 Python 3.8 或更高版本 +* 有效的 Aspose.HTML for Python 许可证(免费试用可用于评估) +* `pip` 可用于安装 `aspose-html` 包 +* 要转换的简单 HTML 文件(例如 `input.html`) + +> **专业提示:** 将您的 HTML 与资源(图片、CSS)放在同一目录下,以避免转换过程中出现路径解析问题。 + +## 步骤 1:安装 Aspose.HTML 包 + +打开终端并运行以下命令: + +```bash +pip install aspose-html +``` + +`aspose-html` wheel 包含高质量渲染所需的本机库,因此无需额外的系统依赖。 + +## 步骤 2:创建一个最小的 Python 脚本 + +新建一个名为 `convert_html_to_pdf.py` 的文件并粘贴以下代码。该脚本遵循 **html to pdf tutorial** 的三步模式:导入、定义路径、调用转换。 + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### 为什么这样有效 + +* **导入 `Converter`** 让您能够使用抽象渲染引擎的高级 API。 +* **定义绝对路径** 可防止脚本在不同工作目录运行时出现相对路径错误。 +* **`Converter.convert_html`** 在一次调用中完成整个渲染管道——HTML 解析、CSS 布局和 PDF 序列化,这是快速实现 **how to generate pdf** 的推荐方式。 + +## 步骤 3:运行脚本并验证输出 + +在终端中执行脚本: + +```bash +python convert_html_to_pdf.py +``` + +如果一切配置正确,您将看到: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +使用任意 PDF 查看器打开 `output.pdf`。文档应与原始 HTML 页面完全相同,包括字体、图片和基本的 CSS 样式。 + +![生成的 PDF 预览](https://example.com/images/pdf-preview.png "使用 Python 从 HTML 生成的 PDF 截图"){: .center-image alt="使用 Python 从 HTML 生成的 PDF 截图"} + +## 步骤 4:自定义转换(可选) + +基础的 **html to pdf tutorial** 只涵盖一对一转换,但实际场景常常需要微调: + +| Requirement | How to achieve it with Aspose.HTML | +|-------------|------------------------------------| +| 设置页面大小(A4、Letter) | Pass a `PdfSaveOptions` object to `convert_html` | +| 添加页边距或页眉/页脚 | Use `PdfPageSettings` inside the options | +| 嵌入自定义字体 | Ensure the font files are reachable and set `FontSettings` | + +下面的示例将页面大小设置为 A4 并添加 1 英寸的边距: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **注意:** 当您需要对布局进行精确控制时,使用自定义选项是首选的 **generate pdf from html** 技术。 + +## 步骤 5:处理多个 HTML 文件(批量转换) + +如果您有一个包含大量 HTML 报告的文件夹,可以遍历它们: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +此代码片段演示了可扩展的 **python convert html pdf** 工作流,适用于 CI 流水线或计划任务。 + +## 常见陷阱及避免方法 + +| 问题 | 原因 | 解决方案 | +|-------|-------|-----| +| PDF 中缺失图片 | 脚本在不同文件夹运行时导致相对图片路径失效 | 使用绝对路径或在 `Converter` 选项中设置 `base_uri` | +| CSS 未应用 | 外部样式表使用需要联网的 URL 引用 | 将样式表下载到本地并使用相对路径引用 | +| 字体替换 | 主机机器未安装相应字体 | 将字体文件包含在项目中并配置 `FontSettings` | + +处理这些边缘情况可确保您的 **export html as pdf** 过程在各种环境中都稳健。 + +## 完整、可运行的示例 + +下面是完整的脚本,包含可选设置、错误处理和批处理逻辑。将其复制到 `full_html_to_pdf.py` 并按前述方式运行。 + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +运行此脚本会为目标目录中的每个 HTML 文件生成 PDF,并应用一致的页面设置——这是一个完整的 **python convert html pdf** 生产就绪解决方案。 + +## 结论 + +您现在拥有一个实用的 **html to pdf tutorial**,展示了如何使用 Python 和 Aspose.HTML 将 HTML 生成 PDF 文件。指南涵盖了环境搭建、最小转换脚本、可选自定义、批量处理以及故障排除技巧。 + +接下来,您可以探索相关主题,例如使用 **how to generate pdf** 添加水印、合并多个 PDF,或将 HTML 转换为 DOCX 等其他格式。尝试 `PdfSaveOptions` API 以微调输出,并将脚本集成到 Web 服务或自动化报告流水线中。 + +祝编码愉快,尽情将您的 HTML 内容转换为精美的 PDF! + +## 接下来您应该学习什么? + +以下教程涵盖与本指南技术密切相关的主题。每个资源都提供完整的可运行代码示例和逐步说明,帮助您掌握更多 API 功能,并在项目中探索替代实现方案。 + +- [使用 Aspose.HTML 将 HTML 转换为 PDF – 完整分步指南](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [使用 Aspose.HTML 将 HTML 转换为 PDF – 完整操作指南](/html/english/) +- [如何使用 Aspose.HTML for Java 将 HTML 转换为 PDF](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /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-change-title-in-an-html-file-using-python/_index.md b/html/czech/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..8309b8e346 --- /dev/null +++ b/html/czech/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,265 @@ +--- +category: general +date: 2026-09-19 +description: Naučte se, jak změnit titulek v HTML souboru pomocí Pythonu. Tento průvodce + zahrnuje čtení HTML, aktualizaci tagu <title> a uložení upraveného HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: cs +lastmod: 2026-09-19 +og_description: Jak změnit titulek v HTML souboru pomocí Pythonu. Postupujte podle + tohoto kompletního příkladu, který načte HTML, aktualizuje element title a uloží + upravený dokument. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Jak změnit název v HTML souboru pomocí Pythonu – krok za krokem +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Jak změnit titulek v HTML souboru pomocí Pythonu +url: /cs/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak změnit název v HTML souboru pomocí Pythonu + +Pokud potřebujete **jak změnit název** v HTML dokumentu programově, Python to udělá jednoduchým způsobem. V tomto tutoriálu si přečtete HTML soubor, aktualizujete element `<title>` a uložíte upravený HTML soubor zpět na disk – vše s přehledným, spustitelným kódem. + +Změna názvu stránky je běžný krok při generování statických webů, úpravě stažených stránek nebo automatizaci SEO aktualizací. Na konci tohoto průvodce budete vědět, jak **aktualizovat html title**, jak **číst html pomocí pythonu** a jak **uložit upravený html** bezpečně. + +## Požadavky + +Než začnete, ujistěte se, že máte: + +- Python 3.8 nebo novější nainstalovaný +- Balíček `beautifulsoup4` (`pip install beautifulsoup4`) +- HTML soubor, který chcete upravit (v příkladu se používá `index.html` ve vámi zvoleném adresáři) + +Žádné externí služby nejsou potřeba; vše běží lokálně. + +## Krok 1: Načtěte HTML soubor pomocí Pythonu + +Prvním úkolem je **načíst html soubor python**‑style. Použití `BeautifulSoup` vám poskytne tolerantní parser, který funguje i s neúplným markupem. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Proč je tento krok důležitý:* +`BeautifulSoup` vytvoří stromovou reprezentaci, která vám umožní dotazovat se na elementy a měnit je bez ručního zpracování řetězců. Vestavěný `html.parser` je rychlý a nevyžaduje žádné další binární soubory. + +## Krok 2: Najděte element `<title>` + +HTML dokumenty obvykle obsahují jediný tag `<title>` uvnitř `<head>`. Získáme první výskyt, což splňuje požadavek **aktualizovat html title**. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Proč kontrolujeme `None`*: +Některé HTML fragmenty titul neobsahují. Automatické přidání titulu zabrání pozdějším chybám a udrží skript robustní. + +## Krok 3: Změňte text titulu + +Nyní **aktualizujeme html title** přiřazením nového textu k řetězci tagu. Toto je jádro operace **jak změnit název**. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +Atribut `string` představuje textový uzel uvnitř `<title>`. Přepsáním ho aktualizujete DOM v paměti. + +## Krok 4: Uložte upravený HTML + +Nakonec zapíšeme změněný dokument do nového souboru. Tím splníme krok **uložit upravený html** a ponecháme originál nedotčený. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` formátuje výstup s odsazením, takže soubor bude po změně snadno čitelný. + +### Očekávaný výstup + +Spuštěním skriptu na ukázkovém `index.html`, který původně obsahuje: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +se zobrazí výstup v konzoli podobný: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +Uložený soubor `index_modified.html` nyní začne takto: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Kompletní skript pro rychlé zkopírování + +Níže je kompletní, připravený ke spuštění program, který kombinuje všechny čtyři kroky. Uložte jej jako `change_title.py` a podle potřeby upravte `YOUR_DIRECTORY`. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Spusťte skript: + +```bash +python change_title.py +``` + +Uvidíte zprávy v konzoli a nový soubor `index_modified.html` s aktualizovaným názvem. + +## Další tipy a okrajové případy + +| Situace | Co dělat | +|-----------|------------| +| **Více `<title>` tagů** | `soup.find_all("title")` vrátí seznam; aktualizujte první prvek nebo iterujte, pokud potřebujete změnit všechny. | +| **Problémy s kódováním** | Otevírejte soubory s `encoding="utf-8-sig"` pokud je přítomen BOM, nebo detekujte kódování pomocí `chardet`. | +| **Velké HTML soubory** | Použijte parser `lxml` (`BeautifulSoup(html_content, "lxml")`) pro lepší výkon. | +| **Zachování původního formátování** | Pokud musíte zachovat přesné mezery, zapisujte `str(soup)` místo `prettify()`. | +| **Automatizace napříč mnoha soubory** | Zabalte logiku do funkce a projděte `Path.rglob("*.html")`. | + +Tyto varianty zachovávají jádro logiky **jak změnit název**, zatímco se přizpůsobují reálným projektům. + +## Závěr + +Nyní víte, jak **jak změnit název** v libovolném HTML dokumentu pomocí Pythonu. Tutoriál pokryl čtení HTML, vyhledání tagu `<title>`, aktualizaci jeho textu a **uložení upraveného html** bezpečně. S kompletním skriptem můžete tento vzor začlenit do generátorů statických stránek, SEO pipeline nebo jakékoli automatizace, která vyžaduje dynamické změny názvu. + +Dále se podívejte na související témata jako **číst html pomocí python** pro extrakci meta tagů, nebo techniky **načíst html soubor python** pro práci s poškozeným markupem. Vyzkoušejte hromadné zpracování pro aktualizaci názvů napříč celou webovou stránkou – vaše nová dovednost je základem mnoha úkolů webové automatizace. Šťastné kódování! + + +## 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, aby vám pomohl zvládnout další funkce API a prozkoumat alternativní implementační přístupy ve vašich projektech. + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /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-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/czech/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..69f6200872 --- /dev/null +++ b/html/czech/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,204 @@ +--- +category: general +date: 2026-09-19 +description: Převod lokálního HTML souboru do PDF pomocí Pythonu a Aspose.HTML – kompletní + krok‑za‑krokem průvodce, který také zahrnuje možnosti převodu HTML do PDF v Pythonu. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: cs +lastmod: 2026-09-19 +og_description: Převod lokálního HTML souboru do PDF pomocí Pythonu. Naučte se nejlepší + způsob, jak převést HTML do PDF v Pythonu s Aspose.HTML, včetně vložení fontů a + ošetření chyb. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Převod lokálního HTML souboru do PDF pomocí Pythonu – kompletní průvodce +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Jak převést lokální HTML soubor do PDF pomocí Pythonu +url: /cs/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak převést lokální HTML soubor na PDF pomocí Pythonu + +Pokud potřebujete **převést lokální HTML soubor na PDF** v Python projektu, tento tutoriál vám ukáže připravené řešení. Uvidíte, jak nastavit knihovnu Aspose.HTML, nakonfigurovat PDF možnosti a provést konverzi během několika řádků kódu. Průvodce také vysvětluje nejlepší postupy **convert html to pdf python**, takže můžete kód přizpůsobit svým vlastním pracovním postupům. + +Níže uvedené kroky pokrývají vše, co potřebujete vědět: instalaci SDK, přípravu možností ukládání, řešení běžných úskalí a ověření výstupu. Na konci článku budete mít znovupoužitelnou funkci, kterou můžete vložit do libovolné Python aplikace. + +## Požadavky + +Než začnete, ujistěte se, že máte: + +* Python 3.8 nebo novější nainstalovaný na vašem počítači. +* Aktivní licenci Aspose.HTML pro Python (bezplatná zkušební verze funguje pro hodnocení). +* Lokální HTML soubor, který chcete převést na PDF (např. `page.html`). + +Nemusíte instalovat žádné další systémové závislosti; SDK obsahuje vše potřebné pro generování PDF. + +## Instalace balíčku Aspose.HTML + +Aspose.HTML SDK je distribuováno přes PyPI. Nainstalujte jej pomocí `pip` ve vašem virtuálním prostředí: + +```bash +pip install aspose-html +``` + +Spuštěním příkazu se zobrazí nainstalovaná verze, což potvrzuje, že balíček je připraven k importu. + +## Krok 1: Import požadovaných tříd + +Pracovní postup konverze se opírá o dvě hlavní třídy: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` poskytuje statickou metodu `convert_html`, která provádí skutečnou transformaci. +* `PDFSaveOptions` vám umožňuje jemně nastavit výstup PDF, například vložením standardních fontů. + +## Krok 2: Vytvořte PDF save options a povolte vložení standardních fontů + +Vkládání fontů zajišťuje, že vygenerované PDF vypadá stejně na každém zařízení, i když prohlížeč nemá fonty nainstalované lokálně. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Nastavení `embed_standard_fonts` na `True` se doporučuje pro většinu produkčních scénářů, protože eliminuje varování o substituci fontů v PDF čtečkách. + +## Krok 3: Převést HTML soubor na PDF pomocí nakonfigurovaných možností + +Nyní zavolejte `Converter.convert_html`, předáte cestu ke zdrojovému HTML, cílovou cestu PDF a objekt možností, který jste připravili: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Pokud konverze uspěje, metoda vrátí `None` a PDF soubor se objeví na zadaném místě. + +## Kompletní příklad v opakovaně použitelné funkci + +Zabalení logiky do funkce usnadňuje opakované použití napříč více projekty: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Proč funkce pomáhá + +* **Validace vstupu** – `FileNotFoundError` usnadňuje ladění, když je špatná cesta k HTML souboru. +* **Automatické vytvoření adresáře** – `os.makedirs(..., exist_ok=True)` zabraňuje chybám typu „adresář neexistuje“. +* **Konfigurovatelné vkládání fontů** – Můžete vypnout vkládání fontů pro menší soubory, pokud víte, že cílové prostředí již požadované fonty má. + +## Běžné okrajové případy a jak je řešit + +| Situace | Doporučené řešení | +|-----------|----------------------| +| **HTML obsahuje externí CSS nebo obrázky** | Použijte absolutní URL nebo zkopírujte zdroje vedle HTML souboru; Aspose.HTML se řídí stejnými pravidly jako prohlížeč. | +| **Velké HTML soubory (>10 MB)** | Zvyšte výchozí limit paměti nastavením `pdf_options.memory_limit`, pokud narazíte na `OutOfMemoryException`. | +| **Potřebujete PDF chráněné heslem** | Nastavte `pdf_options.encryption_details` s uživatelským heslem před voláním `convert_html`. | +| **Běh na serveru bez grafického rozhraní** | Není vyžadována žádná další konfigurace; SDK nevyžaduje grafické rozhraní. | + +Řešení těchto scénářů předem vás ochrání před neočekávanými chybami za běhu. + +## Ověření výsledku konverze + +Po dokončení skriptu otevřete vygenerované PDF v libovolném prohlížeči (Adobe Reader, Chrome atd.). Vizuální rozložení by mělo odpovídat původnímu HTML a všechny fonty by se měly zobrazit správně, protože byly vloženy. + +Můžete také programově potvrdit, že soubor existuje a má nenulovou velikost: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Profesionální tipy pro produkční použití + +* **Dávkové zpracování** – Procházejte seznam HTML souborů a pro každý zavolejte `html_to_pdf`; znovu použijte jedinou instanci `PDFSaveOptions` ke snížení režie vytváření objektů. +* **Logování** – Integrovat modul `logging` v Pythonu pro zachycení časových značek konverze a případných výjimek. +* **Výkon** – Při konverzi mnoha souborů zvažte paralelní spouštění pomocí `concurrent.futures.ThreadPoolExecutor`, ale mějte na paměti, že SDK je vlákny‑bezpečné pouze pro samostatné volání `Converter`. + +## Závěr + +Nyní máte kompletní, produkčně připravenou metodu pro **převést lokální HTML soubor na PDF** pomocí Pythonu. Řešení pokrývá základní kroky – instalaci Aspose.HTML, konfiguraci PDF možností, řešení běžných okrajových případů a ověření výstupu – a zároveň demonstruje širší workflow **convert html to pdf python**. + +Odtud můžete zkoumat pokročilé funkce, jako je šifrování PDF, vlastní velikosti stránek nebo přidávání vodoznaků, všechny podporované stejným SDK. Experimentujte s možnostmi, které nejlépe vyhovují vašemu projektu, a budete schopni spolehlivě automatizovat konverzi HTML → PDF v jakémkoli Python prostředí. + +--- + + +## 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, aby vám pomohly zvládnout další funkce API a prozkoumat alternativní implementační přístupy ve vašich projektech. + +- [Convert HTML to PDF with Aspose.HTML – Kompletní krok‑za‑krokem průvodce](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Kompletní průvodce manipulací](/html/english/) +- [Convert HTML to PDF v .NET s Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /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-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/czech/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..e9567f6cbf --- /dev/null +++ b/html/czech/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Naučte se převádět HTML na Markdown v Pythonu. Tento tutoriál ukazuje, + jak rychle uložit HTML jako Markdown a generovat Markdown z HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: cs +lastmod: 2026-09-19 +og_description: Převádějte HTML na Markdown pomocí Pythonu. Postupujte podle tohoto + návodu, abyste uložili HTML jako Markdown, vygenerovali Markdown z HTML a vytvořili + soubor HTML na Markdown. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Převod HTML na Markdown v Pythonu – kompletní programovací průvodce +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Jak převést HTML na Markdown pomocí Pythonu – krok za krokem +url: /cs/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak převést HTML na Markdown pomocí Pythonu – krok za krokem průvodce + +Pokud potřebujete **převést HTML na Markdown**, tento průvodce vás provede celým procesem. Ukážeme si, jak **uložit HTML jako Markdown**, generovat Markdown z HTML a vytvořit *html to markdown file*, který lze použít ve statických generátorech stránek, dokumentačních pipelinech nebo v jakémkoli workflow, které preferuje čistý textový markup. + +Tutoriál pokrývá vše od instalace potřebné knihovny až po zpracování okrajových případů, jako jsou vložené obrázky a vlastní formátování. Na konci budete mít připravený spustitelný skript a jasné pochopení, proč je každý krok důležitý. + +## Požadavky + +Než začnete, ujistěte se, že máte: + +- Python 3.8 nebo novější nainstalovaný na vašem počítači. +- Základní znalost skriptování v Pythonu. +- Přístup k terminálu nebo příkazovému řádku. +- Knihovnu `aspose.html` (nebo jakýkoli kompatibilní balíček pro HTML‑to‑Markdown). Tento tutoriál používá **Aspose.HTML for Python via .NET**, který poskytuje třídy `HTMLDocument`, `MarkdownSaveOptions` a `Converter` uvedené v ukázce kódu. + +> **Pro tip:** Pokud dáváte přednost čistě Python řešení, můžete nahradit `aspose.html` balíčkem `html2text`. Celkový postup zůstává stejný. + +## Krok 1: Nainstalujte knihovnu pro konverzi + +Nejprve nainstalujte knihovnu, která poskytuje `HTMLDocument`, `MarkdownSaveOptions` a `Converter`. Spusťte následující příkaz: + +```bash +pip install aspose-html +``` + +Balíček obsahuje nativní engine potřebný k **generování markdownu z html** rychle a s vysokou věrností. Instalace obvykle skončí během méně než jedné minuty při standardním širokopásmovém připojení. + +## Krok 2: Načtěte zdrojový HTML dokument + +Načtení HTML souboru je první konkrétní akcí v konverzní pipeline. Třída `HTMLDocument` soubor parsuje a vytvoří DOM v paměti, který konvertor později prochází a vytváří Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Proč je to důležité:** Vytvořením objektu `HTMLDocument` zajistíte, že složité struktury — tabulky, seznamy a inline styly — budou před konverzí správně interpretovány. Vynechání tohoto kroku by přimělo konvertor číst surový text, což by vedlo ke ztrátě formátování. + +## Krok 3: Nakonfigurujte možnosti uložení Markdownu + +Objekt `MarkdownSaveOptions` vám umožňuje jemně doladit výstupní formát. Pro vytvoření **Git‑flavored Markdown** nastavte vlastnost `formatter` na `"GIT"`. To odpovídá syntaxi používané platformami jako GitHub, GitLab a Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Můžete také upravit další nastavení, jako `preserve_links` nebo `code_block_style`, v závislosti na tom, jak plánujete **save html as markdown** v následných nástrojích. + +## Krok 4: Převěďte HTML na Markdown a uložte výsledek + +S načteným dokumentem a nastavenými možnostmi zavolejte statickou metodu `convert_html`. Tato metoda přečte DOM, použije zvolený formatter a zapíše výstupní soubor. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Po spuštění skriptu najdete nový soubor pojmenovaný `output.md` ve zvoleném adresáři. Otevřením souboru uvidíte čistý, Git‑kompatibilní Markdown připravený pro verzování nebo publikaci. + +## Krok 5: Ověřte vygenerovaný markdown soubor + +Rychlá kontrola vám pomůže potvrdit, že konverze proběhla úspěšně a že **html to markdown file** obsahuje očekávaný obsah. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Typický výstup pro jednoduchou HTML stránku vypadá takto: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Pokud si všimnete chybějících nadpisů nebo špatně vytvořených seznamů, vraťte se k **Kroku 3** a experimentujte s různými hodnotami `formatter` (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Pokročilé: Práce s obrázky a relativními cestami + +Když zdrojové HTML obsahuje obrázky, konvertor je může buď vložit jako data URI, nebo zachovat původní atributy `src`. Aby byl proces **generate markdown from html** lehký, můžete zkopírovat soubory obrázků do paralelní složky a upravit cesty. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Po konverzi bude Markdown odkazovat na obrázky jako `![Alt text](images/picture.png)`. Tento přístup dobře funguje, když později **save html as markdown** v generátoru statických stránek, který očekává assety v oddělené složce. + +## Kompletní skript, který můžete zkopírovat‑vložit + +Níže je kompletní, spustitelný skript, který zahrnuje všechny diskutované kroky. Uložte jej jako `convert_html_to_md.py` a spusťte pomocí `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Očekávaný výstup + +Spuštění skriptu vypíše potvrzovací zprávu následovanou prvními deseti řádky Markdown souboru, jak bylo ukázáno výše. Vygenerovaný `output.md` lze otevřít v libovolném textovém editoru, zobrazit v VS Code nebo commitovat do Git repozitáře. + +## Časté otázky a řešení okrajových případů + +| Otázka | Odpověď | +|----------|--------| +| **Co když je HTML soubor velký (> 10 MB)?** | Třída `HTMLDocument` vstup streamuje, takže využití paměti zůstává mírné. Přesto zvažte zvýšení limitu paměti Python procesu, pokud narazíte na `MemoryError`. | +| **Mohu převést řetězec HTML místo souboru?** | Ano. Použijte `HTMLDocument.from_string(html_string)` (nebo ekvivalentní konstruktor) před voláním `Converter.convert_html`. | +| **Jak zachovat původní HTML komentáře?** | Nastavte `md_options.preserve_comments = True`. Komentáře se objeví jako HTML komentáře (`<!-- … -->`) uvnitř Markdown souboru. | +| **Je možné cílit na jiný dialekt Markdownu?** | Změňte `md_options.formatter` na `"COMMONMARK"` nebo `"MARKDOWN_EXTRA"` podle cílové platformy. | +| **Musím instalovat .NET runtime samostatně?** | Balíček `aspose-html` obsahuje požadovaný runtime pro většinu platforem. Na Linuxu se ujistěte, že je nainstalován `libgdiplus` (`sudo apt-get install libgdiplus`). | + +## Závěr + +Nyní víte, jak **convert HTML to Markdown** pomocí Pythonu, jak **save html as markdown** a jak **generate markdown from html** s detailní kontrolou formátování a assetů. Skript ukazuje celý workflow — od načtení zdrojového souboru po vytvoření čistého *html to markdown file* připraveného pro verzování nebo publikaci. + +Dále prozkoumejte související témata, jako je **batch converting multiple HTML files**, integrace kroku konverze do CI/CD pipeline nebo přizpůsobení výstupu Markdown pro konkrétní generátory statických stránek jako Hugo nebo Jekyll. Experimentujte s různými nastaveními `MarkdownSaveOptions`, abyste výsledek přizpůsobili stylovému průvodci vašeho projektu. + +Šťastné převádění! + +## 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ím, 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 .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/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/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/czech/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..0f0d5d333e --- /dev/null +++ b/html/czech/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,209 @@ +--- +category: general +date: 2026-09-19 +description: Jak povolit funkce při převodu HTML na Markdown pomocí Pythonu. Naučte + se převést HTML dokument a uložit HTML jako Markdown s přesnou kontrolou funkcí. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: cs +lastmod: 2026-09-19 +og_description: Jak povolit funkce při převodu HTML na Markdown. Tento průvodce vám + krok za krokem ukazuje, jak převést HTML dokument a uložit HTML jako Markdown s + detailní kontrolou. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Jak povolit funkce při převodu HTML na Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Jak povolit funkce při převodu HTML na Markdown +url: /cs/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak povolit funkce při převodu HTML na Markdown + +Pokud potřebujete **how to enable features** během konverze, tento průvodce vám poskytne kompletní, spustitelný řešení. Uvidíte přesně, jak převést HTML na Markdown, řídit, které funkce Markdownu jsou generovány, a uložit HTML jako Markdown v jednom kroku. + +Příklad používá populární **GroupDocs.Conversion** Python SDK, ale koncepty platí pro libovolnou knihovnu, která umožňuje konfigurovat sady funkcí. Na konci tohoto tutoriálu dokážete převést HTML dokument, zachovat pouze odkazy a odstavce a vyhnout se nechtěným tabulkám, obrázkům nebo blokům kódu. + +## Co dosáhnete + +* **how to enable features** v možnostech uložení Markdownu +* jasný **convert html to markdown** workflow +* schopnost **how to convert html** s selektivním výstupem +* připravený skript, který **convert html document** a **save html as markdown** + +### Požadavky + +* Python 3.8+ nainstalován +* `groupdocs-conversion` balíček (nainstalujte pomocí `pip install groupdocs-conversion`) +* Ukázkový HTML soubor (`sample.html`) v známém adresáři + +--- + +## Jak povolit funkce v konverzi Markdownu + +Prvním krokem je vytvořit objekt `MarkdownSaveOptions` a říct konvertoru, které prvky chcete zachovat. V tomto tutoriálu povolíme pouze **links** a **paragraphs**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Proč to funguje:** +* `HTMLDocument` obaluje zdrojový soubor, aby jej konvertor mohl číst. +* `MarkdownSaveOptions` obsahuje všechna nastavení konverze; seznam `features` je klíčová vlastnost, která **how to enable features**. +* Při přiřazení `["Link", "Paragraph"]` říkáte enginu, aby generoval pouze Markdown odkazy (`[text](url)`) a prosté odstavce, a odmítá obrázky, tabulky a další značky. +* `Converter.convert_html` provádí skutečnou operaci **convert html to markdown** a zapíše výsledek do `sample.md`. + +## Jak převést HTML dokument s vlastními možnostmi + +Pokud později potřebujete přidat další příznaky funkcí—například `"Header"` nebo `"Bold"`—stačí rozšířit seznam: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +Stejné volání `Converter.convert_html` nyní zahrne tyto dodatečné prvky. Tento vzor vám umožní **how to convert html** vysoce konfigurovatelným způsobem bez psaní vlastních parserů. + +## Jak uložit HTML jako Markdown ve specifickém adresáři + +Metoda `convert_html` přijímá absolutní nebo relativní výstupní cestu. Pro **save html as markdown** v podadresáři nazvaném `output` upravte třetí argument: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Spuštěním skriptu se vytvoří adresář `output` (pokud neexistuje) a zapíše se tam soubor Markdown. Tento přístup udržuje váš zdrojový HTML a vygenerovaný Markdown přehledně uspořádané. + +## Kompletní skript, který můžete zkopírovat a vložit + +Níže je celý program, připravený ke spuštění. Nahraďte `YOUR_DIRECTORY` cestou, která obsahuje `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Očekávaný výstup** (vytištěno do konzole): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Otevřete `sample.md` a uvidíte pouze Markdown odkazy a prosté odstavce, například: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Všechny ostatní HTML elementy byly vynechány, protože **how to enable features** omezilo výstup na dva vybrané typy. + +## Časté otázky a okrajové případy + +| Otázka | Odpověď | +|----------|--------| +| *Co když HTML soubor neobsahuje žádné odkazy?* | Konvertor i tak zapíše odstavce; výstup bude obsahovat prostý text bez syntaxe odkazu. | +| *Mohu zakázat všechny funkce?* | Nastavení `markdown_options.features = []` vede k prázdnému souboru Markdown. Používejte to jen pro testování. | +| *Jak SDK zachází s neplatným HTML?* | Parser se snaží vyčistit poškozené značky před aplikací filtru funkcí. Chyby jsou zaznamenány, ale nepřeruší konverzi. | +| *Je možné zachovat obrázky a odstranit tabulky?* | Ano. Nastavte `markdown_options.features = ["Link", "Paragraph", "Image"]`. Seznam funkcí je aditivní, nikoli exkluzivní. | +| *Co když potřebuji převést mnoho souborů ve složce?* | Zabalte logiku konverze do smyčky, která iteruje přes `Path.glob("*.html")`. Stejná konfigurace **how to enable features** může být použita pro každý soubor. | + +**Tip:** Při zpracování velkých dávek vytvořte `MarkdownSaveOptions` jednou a znovu jej použijte. Tím se sníží režie vytváření objektů a udrží se rychlý **convert html to markdown** pipeline. + +## Závěr + +Nyní víte **how to enable features** při **convert html to markdown**, jak **how to convert html** s selektivním výstupem, a jak **convert html document** a **save html as markdown** pomocí stručného Python skriptu. Konfigurací `MarkdownSaveOptions.features` získáte plnou kontrolu nad elementy Markdownu, které se objeví v konečném souboru. + +### Další kroky + +* Prozkoumejte další příznaky funkcí jako `"Header"`, `"Bold"` a `"Italic"` pro obohacení výstupu Markdown. +* Spojte tento skript s monitorovacím nástrojem (např. `watchdog`), aby se automaticky převáděly nové HTML soubory při jejich příchodu. +* Prohlédněte si [GroupDocs.Conversion Python SDK documentation](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) pro pokročilé scénáře jako PDF‑to‑Markdown nebo DOCX‑to‑HTML konverze. + +Neváhejte experimentovat s různými sadami funkcí a sdílet své poznatky s komunitou. Šťastné převádění! + +## 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. + +- [Převést HTML na Markdown v Aspose.HTML pro Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown na HTML Java – Převést pomocí Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [Jak povolit JavaScript v Aspose HTML – Načíst HTML a získat text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /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-nested-resources-when-processing-html-with-aspo/_index.md b/html/czech/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..7484778bf5 --- /dev/null +++ b/html/czech/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,244 @@ +--- +category: general +date: 2026-09-19 +description: Naučte se, jak omezit vnořené zdroje v Aspose.HTML pro Python pomocí + ResourceHandlingOptions. Ovládejte maximální hloubku zpracování a vyhněte se nekonečným + smyčkám. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: cs +lastmod: 2026-09-19 +og_description: Omezte vnořené zdroje v Aspose.HTML pro Python pomocí ResourceHandlingOptions. + Nastavte maximální hloubku zpracování, aby se zabránilo hluboké rekurzi a zlepšila + se výkonnost. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Jak omezit vnořené zdroje v Aspose.HTML pro Python – krok za krokem průvodce +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Jak omezit vnořené zdroje při zpracování HTML pomocí Aspose.HTML pro Python +url: /cs/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak omezit vnořené zdroje při zpracování HTML pomocí Aspose.HTML pro Python + +Pokud potřebujete **omezit vnořené zdroje** při vykreslování nebo konverzi HTML, tento průvodce vám ukáže přesné kroky pro konfiguraci Aspose.HTML pro Python. Řízení hloubky zpracování zdrojů zabraňuje nekontrolované rekurzi, když stránka obsahuje mnoho vrstev CSS, JavaScriptu nebo odkazů na obrázky. + +Omezení vnořených zdrojů je zvláště důležité pro rozsáhlé crawlery, pipeline pro vykreslování e‑mailů nebo jakýkoli automatizovaný pracovní tok, který musí zůstat v rámci paměťových a časových rozpočtů. V následujících sekcích se dozvíte, proč byste měli nastavit limit hloubky, jak použít třídu `ResourceHandlingOptions` a jak ověřit, že limit funguje podle očekávání. + +## Proč byste měli omezit vnořené zdroje + +HTML dokumenty často odkazují na další zdroje — stylové listy, skripty, obrázky, fonty nebo dokonce další HTML soubory. Každý z těchto zdrojů může následně odkazovat na další soubory, čímž vzniká strom závislostí. Bez ochrany může strom být libovolně hluboký: + +* Stránka načte CSS soubor, který importuje další CSS soubor, který importuje další a tak dále. +* JavaScript může dynamicky načítat další skripty. +* Šablona e‑mailu může vkládat obrázky, které odkazují na externí URL, které přesměrovávají na další zdroje. + +Když hloubka rekurze roste bez omezení, vystavujete se riziku: + +* **Nadměrná spotřeba paměti** — každý načtený zdroj zabírá buffery. +* **Delší doby zpracování** — síťová latence se násobí s každou úrovní. +* **Potenciální nekonečné smyčky** — cirkulární odkazy mohou způsobit, že engine nikdy nevrátí výsledek. + +Nastavení **maximální hloubky zpracování** říká Aspose.HTML, aby po daném počtu úrovní přestal sledovat odkazy na zdroje, což zajišťuje předvídatelný výkon. + +## Jak omezit vnořené zdroje v Aspose.HTML pro Python + +Aspose.HTML poskytuje třídu `ResourceHandlingOptions`, která obsahuje vlastnost `max_handling_depth`. Přiřazením číselné hodnoty (např. `3`) řeknete enginu, aby po třech vnořených úrovních zastavil. + +Níže je kompletní, spustitelný příklad, který demonstruje celý pracovní postup: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Vysvětlení každého kroku + +1. **Instalace balíčku** — Je vyžadováno kolo `aspose-html`. Příkaz `pip install` je uveden jako komentář pro úplnost. +2. **Import tříd** — `HtmlDocument` načítá stránku, `ResourceHandlingOptions` drží limit a `HtmlLoadOptions` je spojuje. +3. **Vytvoření objektu možností** — Instancování `ResourceHandlingOptions` vám poskytne měnitelný kontejner. +4. **Nastavení `max_handling_depth`** — Přiřaďte `3` (nebo libovolné celé číslo) pro omezení enginu na tři úrovně vnořených zdrojů. Toto je jádro **omezení vnořených zdrojů**. +5. **Připojení možností k načítací konfiguraci** — `HtmlLoadOptions` vám umožní předat `resource_options` načítači. +6. **Načtení HTML** — Konstruktor `HtmlDocument` přijímá URL nebo cestu k souboru spolu s `load_options`. Engine nyní respektuje limit hloubky. +7. **Ověření** — Iterací přes `document.resources` můžete zjistit, kolik zdrojů bylo skutečně načteno a jaká nejhlubší úroveň byla dosažena. Pokud je nejhlubší úroveň `3` nebo nižší, limit byl úspěšný. +8. **Uložení** — Uložte zpracovaný dokument. Uložený soubor obsahuje pouze zdroje až po povolenou hloubku. + +#### Očekávaný výstup + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +Čísla se budou lišit v závislosti na zdrojové stránce, ale nejhlubší úroveň by nikdy neměla překročit `3`, protože jsme nastavili `max_handling_depth = 3`. + +## Běžné varianty a okrajové případy + +### Změna limitu hloubky + +Možná budete potřebovat hlubší nebo mělký limit podle vašeho prostředí: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Kompletní vypnutí limitu + +Nastavením vlastnosti na `0` říkáte Aspose.HTML, aby **odstranil jakékoli omezení hloubky**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Udělejte to pouze tehdy, když jste si jisti, že zdrojové HTML je dobře chování. + +### Zpracování kruhových odkazů + +I když máte nastavený limit hloubky, kruhové odkazy se mohou stále objevit na stejné úrovni. Aspose.HTML detekuje cykly a zastaví načítání zdroje, který již byl zpracován, bez ohledu na nastavení hloubky. Nicméně nastavení nižšího `max_handling_depth` snižuje pravděpodobnost, že narazíte na cyklus. + +### Použití limitu s lokálními soubory + +Stejný přístup funguje i pro lokální HTML soubory: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +Engine zachází s relativními atributy `href` nebo `src` stejně jako s vzdálenými URL, a aplikuje limit hloubky i na souborové zdroje. + +### Integrace s dalšími funkcemi Aspose.HTML + +Pokud také potřebujete řídit **časový limit stahování zdrojů**, můžete kombinovat `ResourceHandlingOptions` s `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Obě možnosti jsou nezávislé, takže můžete současně doladit výkon i bezpečnost. + +## Profesionální tipy pro produkční nasazení + +* **Logujte strom zdrojů** — Při ladění iterujte přes `document.resources` a zaznamenávejte URL a hloubku každého zdroje. To vám pomůže pochopit, proč konkrétní stránka překračuje vaše očekávání. +* **Cacheujte načtené zdroje** — Pokud opakovaně zpracováváte stejné externí assety, povolte cachování, abyste se vyhnuli nadbytečným síťovým voláním. +* **Kombinujte s whitelistem** — Pokud jsou důvěryhodné jen určité domény, po načtení filtrujte `document.resources` a odstraňte všechny, které nejsou na whitelistu. +* **Testujte s okrajovými stránkami** — Vytvořte syntetický HTML soubor, který importuje řetězec 10 CSS souborů. Ověřte, že váš limit zkrátí řetězec podle očekávání. + +## Závěr + +Nyní víte, jak **omezit vnořené zdroje** v Aspose.HTML pro Python konfigurací `ResourceHandlingOptions.max_handling_depth`. Nastavení limitu hloubky chrání vaši aplikaci před nadměrným využitím paměti, dlouhými časy zpracování a potenciálními nekonečnými smyčkami způsobenými hluboce vnořenými nebo kruhovými odkazy na zdroje. + +Od tohoto bodu můžete: + +* Přizpůsobit hloubku tak, aby odpovídala vašemu výkonnostnímu rozpočtu (`resource_handling_options.max_handling_depth`). +* Kombinovat limit s časovými limity sítě, cachováním nebo whitelisty domén pro robustní pipeline. +* Prozkoumat související témata jako **resource handling options**, **max handling depth** a **nested resource handling** pro další zpřesnění kontroly nad zpracováním HTML. + +Experimentujte s různými hodnotami hloubky a sledujte, jak se mění počet načtených zdrojů. Až budete připraveni, integrujte tento vzor do vaší větší služby pro konverzi nebo vykreslování HTML, aby byl zajištěn předvídatelný, bezpečný a efektivní běh. + +## 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. + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /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-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/czech/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..0f013340ca --- /dev/null +++ b/html/czech/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,260 @@ +--- +category: general +date: 2026-09-19 +description: Naučte se tutoriál převodu HTML na PDF v Pythonu, který ukazuje, jak + rychle generovat PDF z HTML pomocí Aspose.HTML. Postupujte podle krok‑za‑krokem + průvodce nyní. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: cs +lastmod: 2026-09-19 +og_description: 'Návod HTML na PDF: Převod jakékoli HTML stránky do PDF souboru pomocí + Pythonu a Aspose.HTML. Tento průvodce ukazuje, jak během několika minut vygenerovat + PDF z HTML.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Návod na převod HTML do PDF v Pythonu – kompletní krok za krokem průvodce +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Jak provést tutoriál převodu HTML na PDF pomocí Pythonu +url: /cs/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak provést tutoriál html na pdf pomocí Pythonu + +Pokud potřebujete **html to pdf tutorial**, tento průvodce vám přesně ukáže, jak vygenerovat PDF z HTML pomocí několika řádků kódu v Pythonu. Ať už automatizujete tvorbu reportů nebo exportujete webový obsah pro offline čtení, knihovna Aspose.HTML usnadňuje konverzi. + +V tomto tutoriálu se naučíte, jak nastavit prostředí, napsat skript pro konverzi a řešit běžné okrajové případy, jako chybějící soubory nebo vlastní nastavení stránky. Na konci budete umět **how to generate pdf** soubory z libovolného HTML zdroje, aniž byste opustili ekosystém Pythonu. + +## Co budete potřebovat + +* Python 3.8 nebo novější nainstalovaný +* Aktivní licence Aspose.HTML pro Python (bezplatná zkušební verze funguje pro hodnocení) +* `pip` přístup pro instalaci balíčku `aspose-html` +* Jednoduchý HTML soubor, který chcete převést (např. `input.html`) + +> **Tip:** Uchovávejte svůj HTML a soubory (obrázky, CSS) ve stejném adresáři, aby nedocházelo k problémům s řešením cest během konverze. + +## Krok 1: Instalace balíčku Aspose.HTML + +Otevřete terminál a spusťte následující příkaz: + +```bash +pip install aspose-html +``` + +`aspose-html` wheel obsahuje nativní knihovny potřebné pro vysoce kvalitní vykreslování, takže nejsou vyžadovány žádné další systémové závislosti. + +## Krok 2: Vytvořte minimální Python skript + +Vytvořte nový soubor s názvem `convert_html_to_pdf.py` a vložte níže uvedený kód. Tento skript následuje **html to pdf tutorial** vzor tří‑krokového procesu: import, definování cest a spuštění konverze. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Proč to funguje + +* **Importování `Converter`** vám poskytuje přístup k vysoké úrovni API, která abstrahuje vykreslovací engine. +* **Definování absolutních cest** zabraňuje chybám s relativními cestami, když skript běží z jiného pracovního adresáře. +* **`Converter.convert_html`** provádí celý vykreslovací řetězec – parsování HTML, rozvržení CSS a serializaci do PDF – v jediném volání, což je doporučený způsob **how to generate pdf** rychle. + +## Krok 3: Spusťte skript a ověřte výstup + +Spusťte skript z terminálu: + +```bash +python convert_html_to_pdf.py +``` + +Pokud je vše nastaveno správně, uvidíte: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Otevřete `output.pdf` v libovolném PDF prohlížeči. Dokument by měl vypadat identicky jako původní HTML stránka, včetně fontů, obrázků a základního CSS stylování. + +![Náhled vygenerovaného PDF](https://example.com/images/pdf-preview.png "Snímek obrazovky vygenerovaného PDF z HTML pomocí Pythonu"){: .center-image alt="Snímek obrazovky PDF vygenerovaného z HTML souboru pomocí Pythonu"} + +## Krok 4: Přizpůsobení konverze (volitelné) + +Základní **html to pdf tutorial** pokrývá jednosměrnou konverzi, ale reálné scénáře často vyžadují úpravy: + +| Požadavek | Jak to dosáhnout s Aspose.HTML | +|-----------|--------------------------------| +| Nastavit velikost stránky (A4, Letter) | Předat objekt `PdfSaveOptions` metodě `convert_html` | +| Přidat okraje nebo záhlaví/patičky | Použít `PdfPageSettings` v rámci možností | +| Vložit vlastní fonty | Zajistit, aby soubory fontů byly dostupné a nastavit `FontSettings` | + +Níže je příklad, který nastavuje velikost stránky na A4 a přidává okraj 1 palec: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +**Poznámka:** Používání vlastních možností je preferovaná technika **generate pdf from html**, když potřebujete přesnou kontrolu nad rozvržením. + +## Krok 5: Zpracování více HTML souborů (hromadná konverze) + +Pokud máte složku plnou HTML reportů, můžete je projít v cyklu: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Tento úryvek demonstruje škálovatelný **python convert html pdf** workflow, který se hodí do CI pipeline nebo naplánovaných úloh. + +## Běžné úskalí a jak se jim vyhnout + +| Problém | Příčina | Řešení | +|---------|---------|--------| +| Chybějící obrázky v PDF | Relativní cesty k obrázkům, které selžou, když skript běží z jiného adresáře | Použijte absolutní cesty nebo nastavte `base_uri` v možnostech `Converter` | +| CSS není aplikováno | Externí stylopis odkazovaný pomocí URL, který vyžaduje přístup k internetu | Stáhněte stylopis lokálně a odkažte na něj relativní cestou | +| Náhrada fontu | Font není nainstalován na hostitelském stroji | Zahrňte soubor fontu do projektu a nakonfigurujte `FontSettings` | + +Řešení těchto okrajových případů zajišťuje, že váš proces **export html as pdf** je robustní napříč prostředími. + +## Kompletní, spustitelný příklad + +Níže je kompletní skript, který zahrnuje volitelné nastavení, zpracování chyb a logiku hromadného zpracování. Zkopírujte jej do `full_html_to_pdf.py` a spusťte jej, jak bylo ukázáno dříve. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Spuštěním tohoto skriptu se vytvoří PDF pro každý HTML soubor v cílovém adresáři, s aplikovanými konzistentními nastaveními stránky – kompletní řešení **python convert html pdf** připravené pro produkci. + +## Závěr + +Nyní máte praktický **html to pdf tutorial**, který ukazuje, jak generovat PDF soubory z HTML pomocí Pythonu a Aspose.HTML. Průvodce pokrýval nastavení prostředí, minimální skript pro konverzi, volitelné přizpůsobení, hromadné zpracování a tipy na odstraňování problémů. + +Od tady můžete zkoumat související témata, jako je **how to generate pdf** s vodoznaky, slučování více PDF, nebo konverze HTML do jiných formátů jako DOCX. Experimentujte s API `PdfSaveOptions` pro doladění výstupu a integrujte skript do webových služeb nebo automatizovaných reportingových pipeline. + +Šťastné programování a užijte si převod vašeho HTML obsahu na vylepšené PDF! + +## 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. + +- [Převod HTML do PDF s Aspose.HTML – Kompletní krok‑za‑krokem průvodce](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Převod HTML do PDF s Aspose.HTML – Kompletní průvodce manipulací](/html/english/) +- [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/) + +{{< /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-change-title-in-an-html-file-using-python/_index.md b/html/dutch/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..a6e7596050 --- /dev/null +++ b/html/dutch/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,262 @@ +--- +category: general +date: 2026-09-19 +description: Leer hoe je de titel in een HTML‑bestand wijzigt met Python. Deze gids + behandelt het lezen van HTML, het bijwerken van de title‑tag en het opslaan van + de aangepaste HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: nl +lastmod: 2026-09-19 +og_description: Hoe de titel in een HTML‑bestand te wijzigen met Python. Volg dit + volledige voorbeeld om HTML te lezen, de title‑tag bij te werken en het gewijzigde + document op te slaan. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Hoe de titel in een HTML‑bestand te wijzigen met Python – stapsgewijze handleiding +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Hoe de titel in een HTML‑bestand te wijzigen met Python +url: /nl/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hoe de titel in een HTML‑bestand te wijzigen met Python + +Als je **how to change title** in een HTML‑document programmatically moet doen, maakt Python het werk eenvoudig. In deze tutorial lees je een HTML‑bestand, werk je het `<title>`‑element bij en sla je de gewijzigde HTML op schijf—alles met duidelijke, uitvoerbare code. + +Het wijzigen van de paginatitel is een veelvoorkomende stap wanneer je statische sites genereert, gescrapte pagina's aanpast, of SEO‑updates automatiseert. Aan het einde van deze gids weet je hoe je **update html title**, hoe je **read html with python**, en hoe je **save modified html** veilig kunt uitvoeren. + +## Vereisten + +- Python 3.8 of nieuwer geïnstalleerd +- Het `beautifulsoup4`‑pakket (`pip install beautifulsoup4`) +- Een HTML‑bestand dat je wilt bewerken (het voorbeeld gebruikt `index.html` in een map die je kiest) + +Er zijn geen externe services nodig; alles draait lokaal. + +## Stap 1: Laad het HTML‑bestand met Python + +De eerste taak is om **load html file python**‑stijl te laden. Met `BeautifulSoup` krijg je een vergevingsgezinde parser die werkt met onvolmaakte markup. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Waarom deze stap belangrijk is:* +`BeautifulSoup` bouwt een boomstructuur, waardoor je elementen kunt opvragen en wijzigen zonder handmatige stringverwerking. De ingebouwde `html.parser` is snel en vereist geen extra binaries. + +## Stap 2: Zoek het `<title>`‑element + +HTML‑documenten bevatten meestal één `<title>`‑tag binnen `<head>`. We halen de eerste voorkoming op, wat voldoet aan de **update html title**‑vereiste. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Waarom we op `None` controleren*: +Sommige HTML‑fragmenten laten de titel weg. Het automatisch toevoegen voorkomt later fouten en houdt het script robuust. + +## Stap 3: Wijzig de titeltekst + +Nu **update html title** door nieuwe tekst toe te wijzen aan de string van de tag. Dit is de kern van de **how to change title**‑operatie. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +Het `string`‑attribuut vertegenwoordigt het tekstknooppunt binnen `<title>`. Het overschrijven ervan werkt de DOM in het geheugen bij. + +## Stap 4: Sla de gewijzigde HTML op + +Tot slot schrijf je het aangepaste document naar een nieuw bestand. Dit vervult de **save modified html**‑stap en laat het origineel onaangeroerd. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` formatteert de output met inspringing, waardoor het bestand na de wijziging gemakkelijk leesbaar is. + +### Verwachte output + +Het uitvoeren van het script op een voorbeeld `index.html` dat oorspronkelijk bevat: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +geeft console‑output die lijkt op: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +Het opgeslagen `index_modified.html` begint nu met: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Volledig script voor snel kopiëren‑plakken + +Hieronder staat het volledige, kant‑klaar programma dat alle vier stappen combineert. Sla het op als `change_title.py` en pas `YOUR_DIRECTORY` aan indien nodig. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Voer het script uit: + +```bash +python change_title.py +``` + +Je ziet de console‑berichten en een nieuw `index_modified.html`‑bestand met de bijgewerkte titel. + +## Aanvullende tips en randgevallen + +| Situatie | Wat te doen | +|-----------|------------| +| **Meerdere `<title>`‑tags** | `soup.find_all("title")` retourneert een lijst; werk het eerste element bij of itereren als je ze allemaal wilt wijzigen. | +| **Coderingproblemen** | Open bestanden met `encoding="utf-8-sig"` als er een BOM aanwezig is, of detecteer de codering met `chardet`. | +| **Grote HTML‑bestanden** | Gebruik de `lxml`‑parser (`BeautifulSoup(html_content, "lxml")`) voor betere prestaties. | +| **Originele opmaak behouden** | Als je de exacte witruimte moet behouden, schrijf `str(soup)` in plaats van `prettify()`. | +| **Automatiseren over veel bestanden** | Plaats de logica in een functie en loop over `Path.rglob("*.html")`. | + +Deze variaties behouden de kern van de **how to change title**‑logica, terwijl ze zich aanpassen aan projecten uit de praktijk. + +## Conclusie + +Je weet nu hoe je **how to change title** in elk HTML‑document kunt uitvoeren met Python. De tutorial behandelde het lezen van HTML, het vinden van de `<title>`‑tag, het bijwerken van de tekst, en **saving modified html** veilig. Met het volledige script kun je dit patroon integreren in statische‑site‑generatoren, SEO‑pijplijnen, of elke automatisering die dynamische titelwijzigingen vereist. + +Vervolgens kun je gerelateerde onderwerpen verkennen, zoals **read html with python** voor het extraheren van meta‑tags, of **load html file python**‑technieken voor het omgaan met misvormde markup. Experimenteer met batchverwerking om titels over een volledige website bij te werken—je nieuwe vaardigheid vormt de basis voor vele web‑automatiseringstaken. Veel programmeerplezier! + +## 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 implementatie‑benaderingen in je eigen projecten te verkennen. + +- [Hoe HTML opslaan met Aspose.Html – Complete C#‑gids](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [Hoe HTML opslaan in C# – Complete gids met een aangepaste resource‑handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [Hoe HTML renderen naar PNG – Complete stap‑voor‑stap‑gids](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /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-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/dutch/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..42147ce048 --- /dev/null +++ b/html/dutch/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,203 @@ +--- +category: general +date: 2026-09-19 +description: Converteer een lokaal HTML‑bestand naar PDF met Python en Aspose.HTML + – een volledige stap‑voor‑stap‑gids die ook de opties voor het converteren van HTML + naar PDF met Python behandelt. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: nl +lastmod: 2026-09-19 +og_description: Converteer een lokaal HTML‑bestand naar PDF met Python. Leer de beste + manier om HTML naar PDF te converteren met Python en Aspose.HTML, inclusief het + insluiten van lettertypen en foutafhandeling. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Converteer een lokaal HTML‑bestand naar PDF met Python – volledige gids +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Hoe een lokaal HTML‑bestand naar PDF converteren met Python +url: /nl/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hoe een lokaal HTML‑bestand naar PDF converteren met Python + +Als je **lokale HTML‑bestand naar PDF wilt converteren** in een Python‑project, laat deze tutorial je een kant‑klaar werkende oplossing zien. Je ziet hoe je de Aspose.HTML‑bibliotheek instelt, PDF‑opties configureert en de conversie uitvoert met slechts een paar regels code. De gids legt ook **convert html to pdf python** best practices uit, zodat je de code kunt aanpassen aan je eigen workflows. + +De onderstaande stappen behandelen alles wat je moet weten: het installeren van de SDK, het voorbereiden van de opslaan‑opties, het afhandelen van veelvoorkomende valkuilen en het verifiëren van de output. Aan het einde van het artikel heb je een herbruikbare functie die je in elke Python‑applicatie kunt gebruiken. + +## Vereisten + +* Python 3.8 of nieuwer geïnstalleerd op je machine. +* Een actieve Aspose.HTML for Python‑licentie (de gratis proefversie werkt voor evaluatie). +* Een lokaal HTML‑bestand dat je wilt omzetten naar een PDF (bijv. `page.html`). + +Je hebt geen extra systeem‑afhankelijke afhankelijkheden nodig; de SDK bevat alles wat nodig is voor PDF‑generatie. + +## Installeer het Aspose.HTML‑pakket + +De Aspose.HTML SDK wordt gedistribueerd via PyPI. Installeer het met `pip` in je virtuele omgeving: + +```bash +pip install aspose-html +``` + +Het uitvoeren van het commando toont de geïnstalleerde versie, wat bevestigt dat het pakket beschikbaar is voor import. + +## Stap 1: Importeer de vereiste klassen + +De conversieworkflow maakt gebruik van twee hoofdklassen: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` biedt de statische `convert_html`‑methode die de daadwerkelijke transformatie uitvoert. +* `PDFSaveOptions` stelt je in staat de PDF‑output fijn af te stemmen, bijvoorbeeld door standaardlettertypen in te sluiten. + +## Stap 2: Maak PDF‑opslaan‑opties en schakel het insluiten van standaardlettertypen in + +Het insluiten van lettertypen garandeert dat de gegenereerde PDF er op elk apparaat hetzelfde uitziet, zelfs als de viewer de lettertypen niet lokaal geïnstalleerd heeft. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Het instellen van `embed_standard_fonts` op `True` wordt aanbevolen voor de meeste productiescenario's omdat het waarschuwingen over lettertype‑substitutie in PDF‑readers elimineert. + +## Stap 3: Converteer het HTML‑bestand naar PDF met de geconfigureerde opties + +Roep nu `Converter.convert_html` aan, waarbij je het bron‑HTML‑pad, het doel‑PDF‑pad en het opties‑object dat je hebt voorbereid doorgeeft: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Als de conversie slaagt, retourneert de methode `None` en verschijnt het PDF‑bestand op de opgegeven locatie. + +## Volledig voorbeeld in een herbruikbare functie + +Het omhullen van de logica in een functie maakt het eenvoudig om deze in meerdere projecten te hergebruiken: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Waarom de functie helpt + +* **Invoervalidatie** – De `FileNotFoundError` maakt het debuggen eenvoudiger wanneer het HTML‑pad onjuist is. +* **Automatisch map‑aanmaken** – `os.makedirs(..., exist_ok=True)` voorkomt fouten als “directory does not exist”. +* **Configureerbaar lettertype‑insluiten** – Je kunt het insluiten van lettertypen uitschakelen voor kleinere bestanden als je weet dat de doelomgeving de benodigde lettertypen al heeft. + +## Veelvoorkomende randgevallen en hoe ze te behandelen + +| Situatie | Aanbevolen behandeling | +|-----------|----------------------| +| **HTML bevat externe CSS of afbeeldingen** | Gebruik absolute URL's of kopieer de resources naast het HTML‑bestand; Aspose.HTML volgt dezelfde regels als een browser. | +| **Grote HTML‑bestanden (>10 MB)** | Verhoog de standaard geheugenlimiet door `pdf_options.memory_limit` in te stellen als je een `OutOfMemoryException` tegenkomt. | +| **Je hebt wachtwoord‑beveiligde PDF's nodig** | Stel `pdf_options.encryption_details` in met een gebruikerswachtwoord voordat je `convert_html` aanroept. | +| **Uitvoeren op een headless server** | Geen extra configuratie nodig; de SDK is niet afhankelijk van een GUI. | + +Het vooraf aanpakken van deze scenario's bespaart je onverwachte runtime‑fouten. + +## Het resultaat van de conversie verifiëren + +Nadat het script is voltooid, open je de gegenereerde PDF met een viewer (Adobe Reader, Chrome, enz.). De visuele lay-out moet overeenkomen met de originele HTML, en alle lettertypen moeten correct worden weergegeven omdat ze zijn ingesloten. + +Je kunt ook programmatisch bevestigen dat het bestand bestaat en een grootte groter dan nul heeft: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Pro‑tips voor productiegebruik + +* **Batchverwerking** – Loop over een lijst met HTML‑bestanden en roep `html_to_pdf` aan voor elk; hergebruik een enkele `PDFSaveOptions`‑instantie om de overhead van objectcreatie te verminderen. +* **Logging** – Integreer Python’s `logging`‑module om conversietijdstempels en eventuele uitzonderingen vast te leggen. +* **Prestaties** – Bij het converteren van veel bestanden, overweeg om conversies parallel uit te voeren met `concurrent.futures.ThreadPoolExecutor`, maar houd er rekening mee dat de SDK alleen thread‑safe is voor afzonderlijke `Converter`‑aanroepen. + +## Conclusie + +Je hebt nu een complete, productie‑klare methode om **lokale HTML‑bestand naar PDF te converteren** met Python. De oplossing omvat de essentiële stappen — het installeren van Aspose.HTML, het configureren van PDF‑opties, het afhandelen van veelvoorkomende randgevallen en het verifiëren van de output — en toont tevens de bredere **convert html to pdf python** workflow. + +Vanaf hier kun je geavanceerde functies verkennen, zoals PDF‑versleuteling, aangepaste paginagroottes of watermerken toevoegen, die allemaal door dezelfde SDK worden ondersteund. Experimenteer met de opties die het beste bij je project passen, en je kunt HTML‑naar‑PDF‑conversie betrouwbaar automatiseren in elke Python‑omgeving. + +--- + + +## 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 implementatie‑benaderingen in je eigen projecten te verkennen. + +- [HTML naar PDF converteren met Aspose.HTML – Volledige stap‑voor‑stap gids](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [HTML naar PDF converteren met Aspose.HTML – Volledige manipulatiegids](/html/english/) +- [HTML naar PDF converteren in .NET met Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /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-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/dutch/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..1026798a49 --- /dev/null +++ b/html/dutch/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,218 @@ +--- +category: general +date: 2026-09-19 +description: Leer hoe je HTML naar Markdown converteert in Python. Deze tutorial laat + zien hoe je HTML opslaat als Markdown en snel Markdown genereert vanuit HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: nl +lastmod: 2026-09-19 +og_description: Converteer HTML naar Markdown met Python. Volg deze gids om HTML op + te slaan als Markdown, Markdown te genereren vanuit HTML, en een HTML-naar-Markdown-bestand + te maken. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: HTML naar Markdown converteren in Python – volledige programmeergids +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Hoe HTML naar Markdown te converteren met Python – stapsgewijze handleiding +url: /nl/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hoe HTML naar Markdown te converteren met Python – stapsgewijze handleiding + +Als je **HTML naar Markdown wilt converteren**, leidt deze gids je door het hele proces. Je ziet hoe je **HTML als Markdown kunt opslaan**, Markdown kunt genereren vanuit HTML, en een *html‑naar‑markdown‑bestand* kunt maken dat kan worden gebruikt in static‑site generators, documentatie‑pijplijnen, of elke workflow die platte‑tekst opmaak verkiest. + +De tutorial behandelt alles, van het installeren van de benodigde bibliotheek tot het afhandelen van randgevallen zoals ingesloten afbeeldingen en aangepaste opmaak. Aan het einde heb je een kant‑klaar script en een duidelijk begrip van waarom elke stap belangrijk is. + +## Prerequisites + +- Python 3.8 of nieuwer geïnstalleerd op je machine. +- Basiskennis van Python‑scripting. +- Toegang tot een terminal of opdrachtprompt. +- De `aspose.html`‑bibliotheek (of een compatibel HTML‑naar‑Markdown‑pakket). Deze tutorial gebruikt **Aspose.HTML for Python via .NET**, die de `HTMLDocument`, `MarkdownSaveOptions` en `Converter`‑klassen levert die in het code‑voorbeeld worden getoond. + +> **Pro tip:** Als je de voorkeur geeft aan een pure‑Python‑oplossing, kun je `aspose.html` vervangen door het `html2text`‑pakket. De algemene flow blijft hetzelfde. + +## Stap 1: Installeer de conversiebibliotheek + +Eerst installeer je de bibliotheek die `HTMLDocument`, `MarkdownSaveOptions` en `Converter` levert. Voer het volgende commando uit: + +```bash +pip install aspose-html +``` + +Het pakket bevat de native engine die nodig is om **markdown from html** snel en met hoge getrouwheid te **genereren**. De installatie voltooit meestal binnen een minuut op een standaard breedbandverbinding. + +## Stap 2: Laad het bron‑HTML‑document + +Het laden van het HTML‑bestand is de eerste concrete actie in de conversiepijplijn. De `HTMLDocument`‑klasse parseert het bestand en bouwt een in‑memory DOM, die de converter later doorloopt om Markdown te produceren. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Waarom dit belangrijk is:** Door een `HTMLDocument`‑object te maken, zorg je ervoor dat complexe structuren—tabellen, lijsten en inline‑stijlen—correct worden geïnterpreteerd vóór de conversie. Het overslaan van deze stap zou de converter dwingen ruwe tekst te lezen, wat leidt tot verlies van opmaak. + +## Stap 3: Configureer Markdown‑opslaoptopties + +Het `MarkdownSaveOptions`‑object laat je de uitvoerindeling fijn afstemmen. Om **Git‑flavored Markdown** te produceren, stel je de eigenschap `formatter` in op `"GIT"`. Dit komt overeen met de syntaxis die platforms zoals GitHub, GitLab en Bitbucket gebruiken. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Je kunt ook andere instellingen aanpassen, zoals `preserve_links` of `code_block_style`, afhankelijk van hoe je van plan bent **html as markdown** op te slaan in downstream‑tools. + +## Stap 4: Converteer de HTML naar Markdown en sla het resultaat op + +Met het document geladen en de opties geconfigureerd, roep je de statische `convert_html`‑methode aan. Deze methode leest de DOM, past de gekozen formatter toe en schrijft het uitvoerbestand. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Na het uitvoeren van het script vind je een nieuw bestand met de naam `output.md` in de opgegeven map. Het openen ervan onthult schone, Git‑compatibele Markdown die klaar is voor versiebeheer of publicatie. + +## Stap 5: Verifieer het gegenereerde markdown‑bestand + +Een snelle sanity‑check helpt je bevestigen dat de conversie geslaagd is en dat het **html to markdown file** de verwachte inhoud bevat. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Typische output voor een eenvoudige HTML‑pagina ziet er als volgt uit: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Als je ontbrekende koppen of misvormde lijsten opmerkt, ga dan terug naar **Stap 3** en experimenteer met verschillende `formatter`‑waarden (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Geavanceerd: Afbeeldingen en relatieve paden verwerken + +Wanneer de bron‑HTML afbeeldingen bevat, kan de converter ze ofwel embedden als data‑URIs of de oorspronkelijke `src`‑attributen behouden. Om het **generate markdown from html**‑proces lichtgewicht te houden, wil je mogelijk afbeeldingsbestanden naar een parallelle map kopiëren en paden aanpassen. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Na de conversie zal de Markdown verwijzen naar afbeeldingen zoals `![Alt text](images/picture.png)`. Deze aanpak werkt goed wanneer je later **save html as markdown** in een static‑site generator die assets in een dedicated folder verwacht. + +## Volledig script dat je kunt kopiëren‑plakken + +Hieronder staat het complete, uitvoerbare script dat alle besproken stappen bevat. Sla het op als `convert_html_to_md.py` en voer uit met `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Verwachte output + +Het uitvoeren van het script print een bevestigingsbericht gevolgd door de eerste tien regels van het Markdown‑bestand, zoals eerder getoond. Het gegenereerde `output.md` kan worden geopend in elke teksteditor, bekeken in VS Code, of gecommit naar een Git‑repository. + +## Veelgestelde vragen en edge‑case handling + +| Question | Answer | +|----------|--------| +| **Wat als het HTML‑bestand groot is (> 10 MB)?** | De `HTMLDocument`‑klasse streamt de invoer, zodat het geheugenverbruik gematigd blijft. Overweeg echter het geheugenlimiet van het Python‑proces te verhogen als je een `MemoryError` tegenkomt. | +| **Kan ik een HTML‑string converteren in plaats van een bestand?** | Ja. Gebruik `HTMLDocument.from_string(html_string)` (of de equivalente constructor) vóór het aanroepen van `Converter.convert_html`. | +| **Hoe behoud ik originele HTML‑commentaren?** | Stel `md_options.preserve_comments = True` in. De commentaren verschijnen als HTML‑commentaren (`<!-- … -->`) binnen het Markdown‑bestand. | +| **Is het mogelijk om een andere Markdown‑dialect te targeten?** | Verander `md_options.formatter` naar `"COMMONMARK"` of `"MARKDOWN_EXTRA"` afhankelijk van het doelplatform. | +| **Moet ik .NET‑runtime apart installeren?** | Het `aspose-html`‑pakket bundelt de benodigde runtime voor de meeste platforms. Op Linux moet je `libgdiplus` installeren (`sudo apt-get install libgdiplus`). | + +## Conclusie + +Je weet nu hoe je **HTML naar Markdown** kunt converteren met Python, hoe je **html as markdown** kunt opslaan, en hoe je **markdown from html** kunt genereren met fijnmazige controle over opmaak en assets. Het script demonstreert de volledige workflow—from het laden van het bronbestand tot het produceren van een schoon *html to markdown file* klaar voor versiebeheer of publicatie. + +Vervolgens kun je gerelateerde onderwerpen verkennen, zoals **batch converting multiple HTML files**, het integreren van de conversiestap in een CI/CD‑pipeline, of het aanpassen van de Markdown‑output voor specifieke static‑site generators zoals Hugo of Jekyll. Experimenteer met de verschillende `MarkdownSaveOptions`‑instellingen om het resultaat af te stemmen op de stijlgids van je project. + +Veel plezier met converteren! + +## 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 stapsgewijze uitleg om je te helpen extra API‑functies onder de knie te krijgen en alternatieve implementatie‑benaderingen in je eigen projecten te verkennen. + +- [HTML naar Markdown converteren in .NET met Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [HTML naar Markdown converteren in Aspose.HTML voor Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown naar HTML Java - Converteren met 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/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/dutch/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..04f98150c5 --- /dev/null +++ b/html/dutch/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,222 @@ +--- +category: general +date: 2026-09-19 +description: Hoe functies in te schakelen tijdens het converteren van HTML naar Markdown + met Python. Leer een HTML‑document te converteren en HTML op te slaan als Markdown + met precieze controle over de functies. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: nl +lastmod: 2026-09-19 +og_description: Hoe functies in te schakelen tijdens het converteren van HTML naar + Markdown. Deze gids laat je stap voor stap zien hoe je een HTML‑document converteert + en HTML opslaat als Markdown met fijnmazige controle. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Hoe functies inschakelen tijdens het converteren van HTML naar Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Hoe functies inschakelen tijdens het converteren van HTML naar Markdown +url: /nl/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hoe functies in te schakelen tijdens het converteren van HTML naar Markdown + +Als je **hoe functies in te schakelen** tijdens een conversie nodig hebt, biedt deze gids een volledige, uitvoerbare oplossing. Je ziet precies hoe je HTML naar Markdown converteert, welke Markdown‑functies worden uitgegeven, en hoe je HTML als Markdown opslaat in één stap. + +Het voorbeeld maakt gebruik van de populaire **GroupDocs.Conversion** Python SDK, maar de concepten zijn toepasbaar op elke bibliotheek die het configureren van functiereeksen toestaat. Aan het einde van deze tutorial kun je een HTML‑document converteren, alleen links en alinea’s behouden, en ongewenste tabellen, afbeeldingen of codeblokken vermijden. + +## Wat je zult bereiken + +* **hoe functies in te schakelen** in de Markdown‑opslaan‑opties +* een duidelijke **convert html to markdown** workflow +* de mogelijkheid om **how to convert html** met selectieve output uit te voeren +* een kant‑klaar script dat **convert html document** en **save html as markdown** + +### Vereisten + +* Python 3.8+ geïnstalleerd +* `groupdocs-conversion`‑package (installeren met `pip install groupdocs-conversion`) +* Een voorbeeld‑HTML‑bestand (`sample.html`) in een bekende map + +--- + +## Hoe functies in te schakelen in Markdown‑conversie + +De eerste stap is het aanmaken van een `MarkdownSaveOptions`‑object en de converter vertellen welke elementen je wilt behouden. In deze tutorial schakelen we alleen **links** en **paragraphs** in. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Waarom dit werkt:** +* `HTMLDocument` omsluit het bronbestand zodat de converter het kan lezen. +* `MarkdownSaveOptions` bevat alle conversie‑instellingen; de `features`‑lijst is de sleutel‑eigenschap die **hoe functies in te schakelen** bepaalt. +* Door `["Link", "Paragraph"]` toe te wijzen, vertel je de engine alleen Markdown‑links (`[text](url)`) en gewone alinea’s uit te geven, en afbeeldingen, tabellen en andere markup te negeren. +* `Converter.convert_html` voert de feitelijke **convert html to markdown**‑bewerking uit en schrijft het resultaat naar `sample.md`. + +--- + +## Hoe een HTML‑document te converteren met aangepaste opties + +Als je later meer functievlaggen wilt toevoegen—zoals `"Header"` of `"Bold"`—breid dan simpelweg de lijst uit: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +Dezelfde aanroep van `Converter.convert_html` zal nu die extra elementen opnemen. Dit patroon laat je **how to convert html** op een zeer configureerbare manier uitvoeren zonder eigen parsers te schrijven. + +--- + +## Hoe HTML op te slaan als Markdown in een specifieke map + +De `convert_html`‑methode accepteert een absoluut of relatief uitvoerpad. Om **save html as markdown** in een sub‑map genaamd `output` te doen, pas je het derde argument aan: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Het uitvoeren van het script maakt de map `output` aan (indien deze nog niet bestaat) en schrijft het Markdown‑bestand daarheen. Deze aanpak houdt je bron‑HTML en gegenereerde Markdown netjes georganiseerd. + +--- + +## Volledig script dat je kunt kopiëren‑plakken + +Hieronder staat het volledige programma, klaar om te draaien. Vervang `YOUR_DIRECTORY` door het pad waarin `sample.html` zich bevindt. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Verwachte output** (geprint naar de console): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Open `sample.md` en je ziet alleen Markdown‑links en gewone alinea’s, bijvoorbeeld: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Alle andere HTML‑elementen zijn weggelaten omdat **hoe functies in te schakelen** de output beperkt tot de twee geselecteerde types. + +--- + +## Veelgestelde vragen en randgevallen + +| Vraag | Antwoord | +|----------|--------| +| *Wat als het HTML‑bestand geen links bevat?* | De converter schrijft nog steeds de alinea’s; de output bevat platte tekst zonder link‑syntaxis. | +| *Kan ik alle functies uitschakelen?* | Het instellen van `markdown_options.features = []` resulteert in een leeg Markdown‑bestand. Gebruik dit alleen voor testdoeleinden. | +| *Hoe gaat de SDK om met ongeldige HTML?* | De parser probeert misvormde markup te reinigen voordat de functiefilter wordt toegepast. Fouten worden gelogd maar onderbreken de conversie niet. | +| *Is het mogelijk afbeeldingen te behouden terwijl tabellen worden weggelaten?* | Ja. Stel `markdown_options.features = ["Link", "Paragraph", "Image"]`. De functielijst is additief, niet exclusief. | +| *Wat als ik veel bestanden in een map moet converteren?* | Plaats de conversielogica in een lus die over `Path.glob("*.html")` itereren. Dezelfde **hoe functies in te schakelen**‑configuratie kan voor elk bestand worden hergebruikt. | + +**Pro tip:** Bij het verwerken van grote batches, instantiateer `MarkdownSaveOptions` één keer en hergebruik deze. Dit vermindert de overhead van objectcreatie en houdt de **convert html to markdown**‑pipeline snel. + +--- + +## Conclusie + +Je weet nu **hoe functies in te schakelen** wanneer je **html naar markdown converteert**, hoe je **how to convert html** met selectieve output uitvoert, en hoe je **convert html document** en **save html as markdown** gebruikt met een beknopt Python‑script. Door `MarkdownSaveOptions.features` te configureren, krijg je volledige controle over de Markdown‑elementen die in het uiteindelijke bestand verschijnen. + +### Volgende stappen + +* Verken extra functievlaggen zoals `"Header"`, `"Bold"` en `"Italic"` om je Markdown‑output te verrijken. +* Combineer dit script met een bestands‑watcher (bijv. `watchdog`) om automatisch nieuwe HTML‑bestanden te converteren zodra ze verschijnen. +* Bekijk de [GroupDocs.Conversion Python SDK documentatie](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) voor geavanceerde scenario’s zoals PDF‑naar‑Markdown of DOCX‑naar‑HTML conversies. + +Voel je vrij om te experimenteren met verschillende functiereeksen en deel je bevindingen met de community. Veel plezier met converteren! + + +## 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. + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /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-nested-resources-when-processing-html-with-aspo/_index.md b/html/dutch/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..706b0741ba --- /dev/null +++ b/html/dutch/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,246 @@ +--- +category: general +date: 2026-09-19 +description: Leer hoe u geneste bronnen kunt beperken in Aspose.HTML voor Python met + ResourceHandlingOptions. Beheer de maximale verwerkingsdiepte en vermijd oneindige + lussen. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: nl +lastmod: 2026-09-19 +og_description: Beperk geneste resources in Aspose.HTML voor Python met ResourceHandlingOptions. + Stel de maximale verwerkingsdiepte in om diepe recursie te voorkomen en de prestaties + te verbeteren. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Hoe geneste resources in Aspose.HTML voor Python te beperken – stap‑voor‑stap + gids +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Hoe geneste bronnen te beperken bij het verwerken van HTML met Aspose.HTML + voor Python +url: /nl/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hoe geneste resources te beperken bij het verwerken van HTML met Aspose.HTML voor Python + +Als je **geneste resources moet beperken** tijdens het renderen of converteren van HTML, laat deze gids je de exacte stappen zien om Aspose.HTML voor Python te configureren. Het beheersen van de diepte van resource‑verwerking voorkomt uit de hand lopende recursie wanneer een pagina veel lagen CSS, JavaScript of afbeeldingsreferenties bevat. + +Het beperken van geneste resources is vooral belangrijk voor grootschalige crawlers, e‑mail‑rendering‑pijplijnen, of elke geautomatiseerde workflow die binnen geheugen‑ en tijdslimieten moet blijven. In de volgende secties leer je waarom je een diepte‑limiet moet instellen, hoe je de `ResourceHandlingOptions`‑klasse gebruikt, en hoe je verifieert dat de limiet werkt zoals verwacht. + +## Waarom je geneste resources moet beperken + +HTML‑documenten verwijzen vaak naar andere resources—stylesheets, scripts, afbeeldingen, fonts, of zelfs andere HTML‑bestanden. Elk van die resources kan op zijn beurt weer extra bestanden refereren, waardoor een boom van afhankelijkheden ontstaat. Zonder een guard kan die boom willekeurig diep worden: + +* Een pagina laadt een CSS‑bestand dat een ander CSS‑bestand importeert, dat weer een ander importeert, enzovoort. +* JavaScript kan dynamisch extra scripts laden. +* Een e‑mail‑template kan afbeeldingen insluiten die naar externe URL’s verwijzen die op hun beurt weer naar meer assets doorverwijzen. + +Wanneer de recursiediepte onbeheerd groeit, loop je het risico op: + +* **Excessief geheugenverbruik** – elke opgehaalde resource neemt buffers in beslag. +* **Langere verwerkingstijden** – netwerklatentie vermenigvuldigt zich met elk niveau. +* **Potentiële oneindige lussen** – circulaire referenties kunnen ervoor zorgen dat de engine nooit terugkeert. + +Het instellen van een **max handling depth** vertelt Aspose.HTML om na een bepaald aantal niveaus te stoppen met het volgen van resource‑links, waardoor voorspelbare prestaties worden gegarandeerd. + +## Hoe geneste resources te beperken in Aspose.HTML voor Python + +Aspose.HTML biedt de `ResourceHandlingOptions`‑klasse, die een eigenschap `max_handling_depth` bevat. Door een numerieke waarde toe te wijzen (bijv. `3`), instrueer je de engine om na drie geneste niveaus te stoppen. + +Hieronder staat een volledig, uitvoerbaar voorbeeld dat de volledige workflow demonstreert: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Uitleg van elke stap + +1. **Installeer het pakket** – Het `aspose-html`‑wheel is vereist. Het `pip install`‑commando wordt als commentaar weergegeven voor de volledigheid. +2. **Importeer klassen** – `HtmlDocument` laadt de pagina, `ResourceHandlingOptions` bevat de limiet, en `HtmlLoadOptions` koppelt de twee samen. +3. **Maak het opties‑object** – Het instantieren van `ResourceHandlingOptions` geeft je een mutabele container. +4. **Stel `max_handling_depth` in** – Wijs `3` (of een ander geheel getal) toe om de engine te beperken tot drie niveaus van geneste resources. Dit is de kern van **geneste resources beperken**. +5. **Koppel opties aan de laadconfiguratie** – `HtmlLoadOptions` laat je de `resource_options` doorgeven aan de loader. +6. **Laad de HTML** – De constructor van `HtmlDocument` accepteert een URL of een bestandspad samen met `load_options`. De engine houdt nu rekening met de diepte‑limiet. +7. **Verifieer** – Door te itereren over `document.resources` kun je zien hoeveel resources daadwerkelijk zijn opgehaald en wat het diepste niveau was. Als het diepste niveau `3` of lager is, is de limiet geslaagd. +8. **Opslaan** – Sla het verwerkte document op. Het opgeslagen bestand bevat alleen de resources tot de toegestane diepte. + +#### Verwacht resultaat + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +De getallen variëren afhankelijk van de bronpagina, maar het diepste niveau mag nooit hoger zijn dan `3` omdat we `max_handling_depth = 3` hebben ingesteld. + +## Veelvoorkomende variaties en randgevallen + +### De diepte‑limiet wijzigen + +Je hebt mogelijk een diepere of ondiepere limiet nodig, afhankelijk van je omgeving: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### De limiet volledig uitschakelen + +Het instellen van de eigenschap op `0` vertelt Aspose.HTML om **alle diepte‑beperkingen te verwijderen**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Doe dit alleen wanneer je zeker weet dat de bron‑HTML zich correct gedraagt. + +### Omgaan met circulaire referenties + +Zelfs met een diepte‑limiet kunnen circulaire referenties nog steeds op hetzelfde niveau voorkomen. Aspose.HTML detecteert cycli en stopt met het laden van een resource die al is verwerkt, ongeacht de diepte‑instelling. Het instellen van een lagere `max_handling_depth` verkleint echter de kans om een cyclus te raken. + +### De limiet gebruiken met lokale bestanden + +Dezelfde aanpak werkt voor lokale HTML‑bestanden: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +De engine behandelt relatieve `href`‑ of `src`‑attributen op dezelfde manier als externe URL’s, en past de diepte‑limiet ook toe op resources in het bestandssysteem. + +### Integreren met andere Aspose.HTML‑functies + +Als je ook de **resource‑download‑timeout** moet regelen, kun je `ResourceHandlingOptions` combineren met `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Beide opties zijn onafhankelijk, zodat je prestaties en veiligheid tegelijk kunt afstemmen. + +## Pro‑tips voor productiegebruik + +* **Log de resource‑boom** – Bij het debuggen, iterate over `document.resources` en log elke resource‑URL en diepte. Dit helpt je te begrijpen waarom een bepaalde pagina je verwachtingen overschrijdt. +* **Cache opgehaalde resources** – Als je dezelfde externe assets herhaaldelijk verwerkt, schakel caching in om overbodige netwerk‑aanvragen te vermijden. +* **Combineer met een whitelist** – Als alleen bepaalde domeinen vertrouwd zijn, filter `document.resources` na het laden en verwijder alles buiten de whitelist. +* **Test met rand‑case pagina’s** – Maak een synthetisch HTML‑bestand dat een keten van 10 CSS‑bestanden importeert. Verifieer dat jouw limiet de keten afkapt zoals bedoeld. + +## Conclusie + +Je weet nu hoe je **geneste resources kunt beperken** in Aspose.HTML voor Python door `ResourceHandlingOptions.max_handling_depth` te configureren. Het instellen van een diepte‑limiet beschermt je applicatie tegen overmatig geheugenverbruik, lange verwerkingstijden en potentiële oneindige lussen veroorzaakt door diep geneste of circulaire resource‑referenties. + +Vanaf nu kun je: + +* De diepte aanpassen aan je prestatie‑budget (`resource_handling_options.max_handling_depth`). +* De limiet combineren met netwerk‑timeouts, caching of domein‑whitelists voor robuuste pijplijnen. +* Gerelateerde onderwerpen verkennen zoals **resource handling options**, **max handling depth**, en **nested resource handling** om de controle over HTML‑verwerking verder te verfijnen. + +Experimenteer met verschillende diepte‑waarden en observeer hoe het aantal geladen resources verandert. Wanneer je er klaar voor bent, integreer dit patroon in je grotere HTML‑conversie‑ of render‑service om voorspelbare, veilige en efficiënte uitvoering te garanderen. + +## Wat moet je hierna leren? + +De volgende tutorials behandelen nauw verwante onderwerpen die voortbouwen op de technieken die in deze gids worden getoond. Elke resource 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. + +- [Berichtenafhandeling en netwerken in Aspose.HTML voor Java](/html/english/java/message-handling-networking/) +- [Aangepaste schemafilter en berichtenafhandeling in Aspose.HTML voor Java](/html/english/java/custom-schema-message-handling/) +- [Gegevensafhandeling en streambeheer in Aspose.HTML voor Java](/html/english/java/data-handling-stream-management/) + +{{< /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-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/dutch/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..626c3d2008 --- /dev/null +++ b/html/dutch/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,259 @@ +--- +category: general +date: 2026-09-19 +description: Leer een html‑naar‑pdf‑tutorial in Python die laat zien hoe je snel pdf’s + genereert vanuit html met Aspose.HTML. Volg nu de stapsgewijze gids. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: nl +lastmod: 2026-09-19 +og_description: 'html naar pdf tutorial: Converteer elke HTML-pagina naar een PDF-bestand + met Python en Aspose.HTML. Deze gids laat zien hoe je in enkele minuten een pdf + genereert vanuit html.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: HTML naar PDF tutorial in Python – volledige stapsgewijze gids +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Hoe een HTML-naar-PDF tutorial uit te voeren met Python +url: /nl/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hoe een html‑naar‑pdf‑tutorial uit te voeren met Python + +Als je een **html‑to‑pdf‑tutorial** nodig hebt, laat deze gids je precies zien hoe je een PDF genereert vanuit HTML met slechts een paar regels Python‑code. Of je nu rapporten automatiseert of webinhoud exporteert voor offline lezen, de Aspose.HTML‑bibliotheek maakt de conversie moeiteloos. + +In deze tutorial leer je hoe je de omgeving instelt, het conversiescript schrijft en veelvoorkomende randgevallen afhandelt, zoals ontbrekende bestanden of aangepaste pagina‑instellingen. Aan het einde kun je **hoe je pdf‑bestanden genereert** vanuit elke HTML‑bron zonder de Python‑omgeving te verlaten. + +## Wat je nodig hebt + +* Python 3.8 of nieuwer geïnstalleerd +* Een actieve Aspose.HTML voor Python‑licentie (een gratis proefversie werkt voor evaluatie) +* `pip`‑toegang om het `aspose-html`‑pakket te installeren +* Een eenvoudig HTML‑bestand dat je wilt converteren (bijv. `input.html`) + +> **Pro tip:** Houd je HTML en assets (afbeeldingen, CSS) in dezelfde map om pad‑resolutieproblemen tijdens de conversie te voorkomen. + +## Stap 1: Installeer het Aspose.HTML‑pakket + +Open een terminal en voer het volgende commando uit: + +```bash +pip install aspose-html +``` + +Het `aspose-html`‑wheel bevat de native bibliotheken die nodig zijn voor rendering van hoge kwaliteit, dus er zijn geen extra systeemeisen nodig. + +## Stap 2: Maak een minimaal Python‑script + +Maak een nieuw bestand genaamd `convert_html_to_pdf.py` en plak de onderstaande code. Dit script volgt het **html‑to‑pdf‑tutorial**‑patroon van een drie‑stappen‑proces: importeren, paden definiëren en de conversie aanroepen. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Waarom dit werkt + +* **Importeren van `Converter`** geeft je toegang tot een high‑level API die de renderengine abstraheert. +* **Absolute paden definiëren** voorkomt bugs met relatieve paden wanneer het script vanuit een andere werkmap wordt uitgevoerd. +* **`Converter.convert_html`** voert de volledige renderpipeline uit — HTML‑parsing, CSS‑lay-out en PDF‑serialisatie — in één oproep, wat de aanbevolen manier is om **hoe je pdf snel genereert**. + +## Stap 3: Voer het script uit en controleer de output + +Voer het script uit vanuit de terminal: + +```bash +python convert_html_to_pdf.py +``` + +Als alles correct is ingesteld, zie je: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Open `output.pdf` met een PDF‑viewer. Het document zou er identiek uit moeten zien als de originele HTML‑pagina, inclusief lettertypen, afbeeldingen en basis‑CSS‑opmaak. + +![Voorbeeld van gegenereerde PDF](https://example.com/images/pdf-preview.png "Schermafbeelding van gegenereerde PDF vanuit HTML met Python"){: .center-image alt="Schermafbeelding van een PDF gegenereerd vanuit een HTML‑bestand met Python"} + +## Stap 4: Conversie aanpassen (optioneel) + +De basis **html‑to‑pdf‑tutorial** behandelt een één‑op‑één conversie, maar real‑world scenario's vereisen vaak aanpassingen: + +| Vereiste | Hoe te bereiken met Aspose.HTML | +|----------|---------------------------------| +| Pagina‑grootte instellen (A4, Letter) | Geef een `PdfSaveOptions`‑object door aan `convert_html` | +| Marges of kop‑/voetteksten toevoegen | Gebruik `PdfPageSettings` binnen de opties | +| Aangepaste lettertypen insluiten | Zorg dat de lettertype‑bestanden bereikbaar zijn en stel `FontSettings` in | + +Hieronder staat een voorbeeld dat de paginagrootte instelt op A4 en een marge van 1 inch toevoegt: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Opmerking:** Het gebruik van aangepaste opties is de voorkeurs **pdf genereren vanuit html**‑techniek wanneer je nauwkeurige controle over de lay-out nodig hebt. + +## Stap 5: Meerdere HTML‑bestanden verwerken (batch‑conversie) + +Als je een map vol HTML‑rapporten hebt, kun je er doorheen lopen: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Dit fragment toont een schaalbare **python convert html pdf**‑workflow die past in CI‑pipelines of geplande taken. + +## Veelvoorkomende valkuilen en hoe ze te vermijden + +| Probleem | Oorzaak | Oplossing | +|----------|---------|-----------| +| Ontbrekende afbeeldingen in PDF | Relatieve afbeeldingspaden die breken wanneer het script vanuit een andere map wordt uitgevoerd | Gebruik absolute paden of stel `base_uri` in de `Converter`‑opties in | +| CSS niet toegepast | Externe stylesheet verwezen met een URL die internettoegang vereist | Download de stylesheet lokaal en verwijs ernaar met een relatief pad | +| Lettertype‑vervanging | Lettertype niet geïnstalleerd op de hostmachine | Voeg het lettertype‑bestand toe aan het project en configureer `FontSettings` | + +Het aanpakken van deze randgevallen zorgt ervoor dat je **export html as pdf**‑proces robuust is in verschillende omgevingen. + +## Volledig, uitvoerbaar voorbeeld + +Hieronder staat het volledige script dat optionele instellingen, foutafhandeling en batch‑verwerkingslogica bevat. Kopieer het naar `full_html_to_pdf.py` en voer het uit zoals eerder getoond. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Het uitvoeren van dit script genereert een PDF voor elk HTML‑bestand in de doelmap, met consistente pagina‑instellingen — een volledige **python convert html pdf**‑oplossing klaar voor productie. + +## Conclusie + +Je hebt nu een praktische **html‑to‑pdf‑tutorial** die laat zien hoe je PDF‑bestanden genereert vanuit HTML met Python en Aspose.HTML. De gids behandelde het opzetten van de omgeving, een minimaal conversiescript, optionele aanpassingen, batch‑verwerking en tips voor probleemoplossing. + +Vanaf hier kun je gerelateerde onderwerpen verkennen, zoals **hoe je pdf genereert** met watermerken, het samenvoegen van meerdere PDF‑bestanden, of het converteren van HTML naar andere formaten zoals DOCX. Experimenteer met de `PdfSaveOptions`‑API om de output fijn af te stemmen, en integreer het script in webservices of geautomatiseerde rapportage‑pipelines. + +Veel programmeerplezier, en geniet van het omzetten van je HTML‑inhoud naar gepolijste PDF‑bestanden! + +## 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 implementatie‑benaderingen in je eigen projecten te verkennen. + +- [HTML naar PDF converteren met Aspose.HTML – Volledige stap‑voor‑stap‑gids](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [HTML naar PDF converteren met Aspose.HTML – Volledige manipulatie‑gids](/html/english/) +- [Hoe HTML naar PDF converteren in Java – Met Aspose.HTML voor Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /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/how-to-change-title-in-an-html-file-using-python/_index.md b/html/english/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..ba5e373941 --- /dev/null +++ b/html/english/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,264 @@ +--- +category: general +date: 2026-09-19 +description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: en +lastmod: 2026-09-19 +og_description: How to change title in an HTML file with Python. Follow this complete + example to read HTML, update the title tag, and save the modified document. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: How to change title in an HTML file using Python – step‑by‑step guide +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: How to change title in an HTML file using Python +url: /python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to change title in an HTML file using Python + +If you need to **how to change title** in an HTML document programmatically, Python makes the job straightforward. In this tutorial you’ll read an HTML file, update the `<title>` element, and save the modified HTML back to disk—all with clear, runnable code. + +Changing the page title is a common step when you generate static sites, customize scraped pages, or automate SEO updates. By the end of this guide you’ll know how to **update html title**, how to **read html with python**, and how to **save modified html** safely. + +## Prerequisites + +Before you start, make sure you have: + +- Python 3.8 or newer installed +- The `beautifulsoup4` package (`pip install beautifulsoup4`) +- An HTML file you want to edit (the example uses `index.html` in a folder you choose) + +No external services are required; everything runs locally. + +## Step 1: Load the HTML file with Python + +The first task is to **load html file python**‑style. Using `BeautifulSoup` gives you a forgiving parser that works with imperfect markup. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Why this step matters:* +`BeautifulSoup` builds a tree representation, letting you query and modify elements without manual string handling. The `html.parser` built‑in is fast and requires no extra binaries. + +## Step 2: Locate the `<title>` element + +HTML documents usually contain a single `<title>` tag inside `<head>`. We retrieve the first occurrence, which satisfies the **update html title** requirement. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Why we check for `None`*: +Some HTML fragments omit the title. Adding it automatically prevents later errors and keeps the script robust. + +## Step 3: Change the title text + +Now we **update html title** by assigning new text to the tag’s string. This is the core of the **how to change title** operation. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +The `string` attribute represents the text node inside `<title>`. Overwriting it updates the DOM in memory. + +## Step 4: Save the modified HTML + +Finally, write the altered document to a new file. This fulfills the **save modified html** step and leaves the original untouched. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` formats the output with indentation, making the file easy to read after the change. + +### Expected output + +Running the script on a sample `index.html` that originally contains: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +produces console output similar to: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +The saved `index_modified.html` will now start with: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Full script for quick copy‑paste + +Below is the complete, ready‑to‑run program that combines all four steps. Save it as `change_title.py` and adjust `YOUR_DIRECTORY` as needed. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Run the script: + +```bash +python change_title.py +``` + +You’ll see the console messages and a new `index_modified.html` file with the updated title. + +## Additional tips and edge cases + +| Situation | What to do | +|-----------|------------| +| **Multiple `<title>` tags** | `soup.find_all("title")` returns a list; update the first element or iterate if you need to change all. | +| **Encoding problems** | Open files with `encoding="utf-8-sig"` if a BOM is present, or detect encoding with `chardet`. | +| **Large HTML files** | Use `lxml` parser (`BeautifulSoup(html_content, "lxml")`) for better performance. | +| **Preserving original formatting** | If you must keep the exact whitespace, write `str(soup)` instead of `prettify()`. | +| **Automating across many files** | Wrap the logic in a function and loop over `Path.rglob("*.html")`. | + +These variations keep the core **how to change title** logic intact while adapting to real‑world projects. + +## Conclusion + +You now know how to **how to change title** in any HTML document using Python. The tutorial covered reading HTML, locating the `<title>` tag, updating its text, and **saving modified html** safely. With the full script you can integrate this pattern into static‑site generators, SEO pipelines, or any automation that requires dynamic title changes. + +Next, explore related topics such as **read html with python** for extracting meta tags, or **load html file python** techniques for handling malformed markup. Experiment with batch processing to update titles across an entire website—your new skill is the foundation for many web‑automation tasks. Happy coding! + + +## 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 Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /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/how-to-change-title-in-an-html-file-using-python/og-image.png b/html/english/python/general/how-to-change-title-in-an-html-file-using-python/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..d24a2834a56df61ca436e5d82dc182d6bdc5edbf GIT binary patch literal 43859 zcmbSz1yoya^CnejDbivs6ez`Aic_Req`14aK+)h3AQ1X1R*IG4UR;7ha7c?5cT14s z8r%b9Fa5r6cmI3#?C#l|oZN)u-uHdy&O0;DGc$y$tI88Rq<n~jgG2C6;jJbP&fRhx zoZFsww}HR>e7TK}g9D>{_x6pp7jk<RY)mST{kbn9?1M|CApiF9uZLfn6Q&yFv>bSw zPnWy7n<tskyrGnhoivbblkK<<dUrddx#jCIS1!TCbw-g(ggcRgn2z2_??$nkN8>zd z_L;#%yLx8mZl}X7U_hL5V_nj}Z-|L+CV+#7_xID?z?%;^x269cZqeNwK7As-IY>$2 z-5g%LxO;O*6cmxYIl{@gPIt)}R$1O9#lD;Vt~n7bc5{id$vB&!!5rnD9ETlNlA9r< zCfPOGOryT@vBtR0<|+S|i~XI$59Jjajz{D9_gG{2SSLX}f2UF~cU<tk?Cs6P>m9Y? zU-TwFEpqt`EF$^u=;h`!bbqJw|1e>(`jdBjinuqE=6DMJyWIcn%Kq;H`PtqLSB=&X zzPXfncb&{%x%?j_XZ~jSudK%m>t+x}-x9MKtTdUdloSo9c5Wo|$4oDaOafSROl5sO z$D4QoUhSp32o(|jFyQ*fJd_+3-yoznqBO2$Razqadr!u+{x#m;oAT+R=pe>6*he=a z77)~ypw(Y#Xz%)rmFs2w=frR8+Dr)_AK%RRe_6hI#&1qnSSgY7$H}bgf`vPC24F2# znX5YQb9G>4KZ_0iP)ldM850sHJbW9_K7s=%#5Z<}9}*M3i_bm)iXtVYz>hc9b)m)} zqYRv2E^>=*_{9&5hSa0KpI@w7k=~5@f7dYc>t)h^Lfy{In);^2t?j6E-b2wGcs8+d zF$kZng@<N_2HnrMK~z2sHFyWMGe2j`?VI8~t-F3zZ4S2ifSth}AGm>WfcwWorkKmd zZ5Ey2k5TMF7m(iq8Q#|w3YynLYx)m4x%~an=AhNdyQDOk6Z#U_iY!NxTYU<LFLqTy z$uR9j$BzR$Z4X4e?@51&3Du(#az1oie{&9;mWV$`$L}E$C2K7?mD(lo{<9_D@Xxkf zi>+^!PF%*#?<#J7^O)w@J#~75*Css@)+@{Sbdl-x?yHv`bb$eB==EC_y1IPFV<Va? zBLtW*CB-0ObZfwfqjlcw0E^Ly<>ELn;CM#Yqc0xr<*@Rs>Z5RyP`zENReb{kfdg0j zdA5R9qo56N)f4XAy!l=>4vzS4%YjJGxro=TDd(bM$b^2ah359ptuHtDfenp^#~B0K zeQ=^Rr{nLL25H#Fq%w=a_?(Oc95yfe39XPTGYJ=1dtNHB$@+Yqub)#{HFTJ=t{ujQ zCOy|J4kk>BUsD!-eW+N*MCxRw+k_oFC~V+TChr;94rv8J!Yeie26~wFKknv0@55c^ zd2~(Z4paj`$m2@8ZEm-H^%culQ{loX{#t%IQ=ga;N(_nsG9&tWq9;4Lh{w!(O|H98 zyu*lseK${$GZ(d4q<onH+I}^hH|e#-bgSs4tnK1L>&iS!8MB^oAz@Hn@9OXEGzW}Y zy!>gc-4m9oO5Hp&c8PM+iuaK$Y-73K|9&gMvO6`{Bc||srRZpjG5>@dl&l9O8%H7h zn2<-5*0T)iI*EF&c1{c52X&rpv`)-9PAR8Mz0oz5D4OY8yt9R$;Af>8MGL#u`6&IR z+&rU-LQ|Vf=bx<gi+-_N5(ML;jx!DUk@v0m9xu)dqdoI>*z29qtJ8<9r&z5b<$CW^ zN4bG7&|yJW`(tp|fQdw!d&%X?B$0FAxmGr_O+GtP7Meg~3+(%`rBCW|3r|0J=;L-J zSa&~9-K8j+k(=YYdD4u-|E%c+ZJH&FoM_G0qD4+J#9vft+A5ANoYNKuyu428Z_aFz zq4mbh1tFSEsx6Wx>ITGqZ#1v)bzy|uEC(DXfagC82SYX9w94P7?waW4Lly}~CCWE= zSFasvP7VnDQt2C){RB&Vy$Y2wH!9^|!79{dDHh`ldl}MuAV;CR`X;}OOCn~ybJ9{B z3;!-X|0=uZdxJF?!P;YxBiRriHap~a8lg2;g%&7vK!F+_RS|+>PBVBT%LZx)Tg+Pd zqU34<XyOF+xXw<ViEkN~(AI<bTze!M>xJ>?QmN5b$zCQ(jr4&EEv{7@FPdDJuFDuC zB3@HdZ(n$Xl8S=aV%%9v<lXDQ^ilYFPBapJ8h9E%SVa99Ih&Hoh!;nWk1B0=nv$Hh zR<C6{7%@?dvkfUanuZPR*E4$()V=e}V~i@J+}^;Jw74G_UuuI|%mRhkPtk_EzvL6c z?Xqr(6A?}@eXS#mZ5v^?wo-Mh5${4q_#pFo_ePd2WKr?4VUopwmUAJ6^KCGiD<!b3 zYHgHaT&<R3qywi&g_8GLa8bcfPcJI3m#6XlD>M_r;5ot|E+N;26?KcK_qmB;Oe8ti zg?5swDc<|>-)c1D{YAE~Hb7%m9t}*6R-jP}<>BCI*%YYW$JvS#qN<FeJP&<H7c-*I zJG1PfG%Yen_n6X3mvHdPe4L^D$nNuEl#?QN`V&Uk2|A6F7}F|3N089<N^AYDV(`I4 zB=@D|xUiHrCiue!1*7!|jP#yv#N|q~NwHtbM!kPylxFc+sn?*L&Vcw<{4imZpWV3d z&y6-6KFHc<1E<*38OE<+4j*ulk_VA0N1t9|$#W;4s9e6#ENpM?d+x!KJHhcI^g<@= zTi)g;9?mOMM`&hMwx4a`!9{-~*~d|n-fwxgRH%xUngIhA_Eo8UUajCE-9RdWmY_jc zq+s5*y0&U#rlq3@L0G5_$T7)zU+x@C?eUJ}#-9)id>|2eyE>;Hmy(3-Ce?w~5KG5- z8&z!LCN*cH|7_F{DPQUReDQYJEbJkLud!7n*$y@9C>Q(nS!Yjnh03YMfo|H@B_Ug5 z#nlNZyv(zulo5R9vH4h2r7_0kAwb;BrcF+ug;uqlLAMR%YwOWe#2nM1jRVQ6a<4(Q zS^Sb70i^r71@+U?CJ#<*z`LSLOl`TM>TW;Avgpv7$^jCt!EtW9$dswlC&fOmuH*P| zu5n4{S?!J!MA214v2qThS8)L8*reTETRv0mXfQ)FH#v;|umwg^RNcA8Fb6YEl!#8Z zKdL5-5?J}fbM9(*uu}cdOb(96vh`uCF|)A|ruES?U6FCXtbSVXHP6aK^Y`zXbb)Cl z5eRU=X6bNaG-TRZ%!tZkFOP-ou{3Ey>_^L$xRP22K?-IFGcIQ4Qkw4V#q73S?t>eT z{QFQ%z-pGy5Kp7puTa$RjG0IO6b1-VH{y;ZO+@c!0=l=u6G08R_8^pB^=rp+xRYB_ z46OWO&5zljEe}bqX)3}ldQ!C^P{Yq?5ErA7)?eUrBgJZ4$8&7a!^5wh992|;S~N7- zgm@kt)ohb2PNODx8co(Z2K-+B5zlG?)$c)_lt29X&1*}OX8IT^*n|E-xnp*G|JptZ zFSDn`h@9a1>PqDCtD&Ck%$DO)-6&&r_N3-C5WU(YV0M|XG>I)%&ZBpjzXuUhl+HSg z^8M+Fa6dl%1&!!wNE%LSPD4ww$6eXG$ZEKp*X_(JO&8p0&01Wv%eB2=B*Kv!X<dO* z9EFM~0-=^>O-}4F9-hWhugqYlG~P-?7+H(nie*9NZnv>`$!n^F_<N7o;`pu_2r2$d zM3!ALMSU4<lA{tUiJl6sKloiL=pqB`j5t#zwr1Zv{(a}}3N+aw<JFBx?HTKhYpG`l z{N^oKsGF%%FJ~YlNf$U<kdKy=U<@SYo4(pQMwDSnW+-D7w;S(EoLamJK%3<rI3f`N z3%+!L2PY9<!zflC&;`y+#BSC2JeS_^{(MD6D-J0vsAE7#xd<Gq_VhzGcaObHwMD1c zXz#`o5e5+leZ^qm@Cv$5cW`FQ-i~Jwc!?|a0HK~o3g4~FTLDdW#xgxSX3j<K$ws-P z9kMzDR>1zEd7R%f$ZEXjV%th*wF=TGCT5G9t)oB(OEAUxYP^|)kgP0J9Mp&x%Vaq$ z22Y(lhq3i>r(zs~#PocMRT1r251nf;mR*$GaNJ&dKH$57ZS!UVYOI<|+X-7#blQ9# zV`L<NZ{xZn{grs}Pw3(1nr!n-n)qxgfzcDd9}?;1hi|{8Yws6JvYKC8rC24K*;TEH zPGB#gz*&bf+D&a~+}x{DRO|!1<9cPiI8uB%%M&trhAO+|e8|flh)_vT`9a}STu|S% z$?7I+p!!^+4w{;rhBHw8#<Wcy9LyUD5e!@He|N)G8lWbX#<REg)+P#JmH;PSzqcKE z3=(37!9`7;)E+!wYj$5Xlij4|2s~R8Z{8$LZl}}%j|LJ4xy^H4*k?){FRB(1x3cjV zKSvgTXe_qP@JIP_Y+E}><2Ey>z;RAQqEpl4EMEhOfmrP8S0x9~k!`GD&;?pNnI-V| z0H?6;#RtGIbucnwA{k*sD)#oUcsiB(u{$_81${*=6jJY^iKSQ7dH1wdEWeCANrK3* zbMGF^qdaL#ATKxd#vCA#CB*tj2_7B1%q9<=#VdaF<IECbX_klAa0<VaUer;6sc3F4 zV^>Wa6E)d{>(-x%`=)6p?I7IO2W3;;bMM4Q<htu+1lXz-?X?k!)}!{ReFJYYd|X^l zuN>;^{SpRQFq4(SVn~eOwKa~EJv+=C(Mh(tf7l|~2Hc;pNi@c9ywpQ1QU@$ccO5}5 zy^Ga%+mY@8f>u4pP=p7w79L$~&E{N%)e0{&;9;etSYpANLBuuUoxiuKvDCz*2~4yk zd`WF2X8M?r2SyO~T`A1FG8Cb&{^{GVr`W=tCQi3wci&^7t&bYgj`VI$HbR#!jlY09 zAiL#1O5c{NM-oWvnVlXj?-@5O*7KTj+Wpzi(Z%!kCLMlcT@?N`8GBzn!XkCkRRZD0 zs}nzK*7Uu-!ilAmy#3vULzr8fO%k_x4o5djRTJ9B9Yl%X8D~Xt)+BVb6@-z_zAJi3 zuza>9-R?}4aW=qu>H9icY`_`pvE-3hgB+Selc_0SNQ00XIMs3Ws6Tnapw0>bcjSDI zvIr2@I{R3Ms%*bVs%k8+s5&5kQ}cJc@09OEA>#98>y6x?5~guZIG#4tPsq2I*3Fq= z2DMyh`p>xT5f6_*>&xcWR*b+#sjnBVd1NbE4aP-mg6$sS9ILM|k3Kpsru;Yj9ofXt zXEW}n6yIq>cQ)Gy?Z_SriKuz%TFsG5la`(hY#h&*7`eM&oDEi<hY1c;P@fe<h8B?C zJD(TdI_u${=tqe(W4aI@I+|f&HQeL$Z5?6>sFMtbm6fHlP09UWHlZpnYzAQ27|3G< z_9{S=y`Fp3Uy~#o;QSj31bX@Qi#;QY;xGr=#G;mv6L1pwDt0fcX#HA6ff~PLQ-Dng zzs0L>KhCW9j*-agE0v&WZ3A%8*CwSygiq@}d>RNn*f>mGPo&_LcDysj&uM9fn;Vq8 zh1?U2jN)S1f`~J3&Ba-lM;mp?1$D{=>83C5&Ppv&hMb}cTudUU>V&SrYWV_cBsiN! z$~HMPg#Ts$m|l!2R_y4})xtOUr;7fGDnHjlMCLx&Kc|)aAhyZ6^+$n@q-Sd_OmL7r za^6_vMXVyjhQi#I3@Ai`$!T^P2o@AIel#VkS6dkDUrQcu$;iYd#9{rH01>l9Z8EvJ zYkZvJ5^uio<|#DUxfC2{zQM0Oe>9nJZ!!JDXH8^vVzScD-XVr%k*L#n$t+r`dfJW; z^@bf8eg_Tm0^U`-<LgMESI2>qQW>L8?U1`c_JO0_4k{bi&>BQ+ELC95kFy%H?>I&3 z8_#}Tu!R|VZ`sXJwK-rU8UBS^3bcz*tc=WH3Xp+$)0MrgWL+#930F=*_8T=J>kK)X z*atX?P-TT1V^5w`DOgz?nn}rg1{!!(cCzK;&rIo}wc5aAz@k*eT${rZuGmE{v^79r zv9^4w)7T?nWYB%#5m|h2l4js$FNF{Q;Qb}f_FWwM%4j1<ok*?iWAo|Z7r=f7n4hYJ zi64a(PER)XTQdz3nBxHEDv_T3D^5WzFI|w-I{?7kmd1I@_v6tm94S9bk+dGXi?}z< z`Sb6M@TvQV34retnM!tvd-|L$E``=i=$YR7tsq3y5N#7_1#)J5Ux85)MU)_xWAl%k z9Bz;K0-uSAU9BFeuK~bS9m3%@^`JBgc#HEx@rdt+HpBTpP%Qr@r+C0m+EjnDP~ZIe z|AiYWe}RNN%Z<?hVo;yFpu?-id!hCJ2^ioDf2o#h4@Sd<S2vq71@bRWYUo&Ttb8*2 z-^9vaa_hgc8!TG&xcD;1wr~F9k#8uQBCxpK6#IWX9OLgwreM3&KM2N*|1Br;Kgc$9 zvq$Tb%!i&|YY>yB-v7M3O_m}P-hcPs6x}DrZ$_KJ)RIlyEId-EG5D6?>!bBYvs$Qn z51Et#1&|gPJtyWc=EZgsW*3^omFU-$g9mruH5D7RPC`UZFwAPgwEv%>ADP)jjiO+1 zZJ?I?^XJctQV-V*5X~p6V(^+2bGd&}Tw@h=s=SX&T49Z2%ec(zPY7<`4J;=nQb~TX zZ`UIe!=(NeM_v>}i1SLo0+~JD7+G7HEVx3~L-6;ueVV2c^9c+IY1}y^TAvsCIiKMw zL-4LihNbEVl<>^`<FmN#yC=!v)Nl4b7ugJrDKj%yGyEy)GcN5pDqB7|If<c7-J3m? z+!Dt2ZD@rX3>fcBQ2dMgQ*NzhB{DMDaQB;g$x&@IIS~8QPE{2kx;UotIE`khE;I;9 zh0Vz?uY7TjcB|em#j~vy@8E}g68!h+9TuW*eH<N2m%1Xeip`1t{`FG_rGV#mt||c{ z5IMp>L_77Qy-EqIZ-D=7XRbs^|M26xZVHCgBz~9F>}+~5io1cU{c{7Q_6c=~iILGI zM(3Dw0o$41zlMLwadC5S^!4<#L??S*Uj|t)t2)kCU>0+GNhuoTq@C5xqjpTPU(&ZG zhg_U_LFyV&C=^V)Xl7<6ysz(&f{TgSOxT$Py4!L`M5I30un-RSn3rh2f3iEuROImq zfvBp|a&(+Si-89+5OwEeASyw}dcU<uC@bd7OI}v4+L3H$cXw?KH8xpW7#0?m9nc&Q z5TIG8$?|a5%5tvBduy>nDSwb@8|A+@w(*KBuE(pxzKN4edTJU;2sM{Nv@~bGG{T%; zOrcN|q@+2sO>y56t1Z^j$L%MrEG;Sb@4iR?e~pL?i-`Q{Ku!E-Z8j$~J0`m%LgoGY z_i}Qp@GaK-fmCtl7uRJVv4evHn`g@Vq^41)KQxGxo5x|R_;Lb%o7vpW7kM>>y1Kff z`4ZBsztk-aNMr<5_vSUtC#XCx_vU{5!~tndmZJ8CvZFTAkpm@E$hYtbL66Cu<~BJU z3;v?LcupFBhs}b=G9H(<YuojK^Q(PkbvA`r1qwa`?XToh_#JaxMs^P=#4)WfB>8hu zuc0Op?5J>|w-@RNWvKQvglPK_h&;<>WD~wclXT%laB2bE7d>t>%WrJ^3tbuh*W+Lh zxPADqj*j!pcO*=b!kM!A1zd*-v9SPGZ$A88a-tNa4?MhsZ(Ut*7zoRw7BhUWkC`+4 z7z4j`Tat7|c`uDqqzE1l3%Ws}*OT+td-Jr{dIjq1US#7i`C3!)MlgD$@O{Ajakh}y zSSoyS&a3${H}|NtO=l&nt*=!jYm~ANI*x*&rnbC%uU6zx^8AwBg8_RK6V;6Mcd|`6 zPg*lesx_~Ov?qGBmmy-&b5@Z(J3CvHTCbj|U*Xy>G=JrF-6~73^D&!dLv+Vct2fje z{U*R6kM()t#l3%yOU^6HVU_+|Ug4f0>OO}8J-xm5&!&0B#N^!s*5|?9pQp$BI|r+v z5OhBl2A{qAs#Poy-qY50m5+tO!E3ACM3IwMa{jQrcr(B2;e~+4`-JQ4;%htNm}-@; zTcq?A=Elb1C-*GiDt1#p{;9E1$E&bEmGF$Hh%{n{C5`5%zOKZ!onB{K@UsMd>s=9V z0H+;~f&q;vJ}sgWva8#S3X=3a&25(rCT<-b-tV6@Gd=H;W@cul9^9Gt$8`K&kST(Q zFb3`&gD#Nl+^ND%P9yCu_c<)-LAC~dM$Nv%2^oG2&CP%*QInAH+a2K4h%O<3n?y!N z()#ZWEZk}QIFMMR#6cHWURwomZk@UVse$h8pge18s+T=r>AP>TX%a6Ao%$&rab52X z_n3)_h^Rc5)J45~m2VI2-Wyt=k7dTgQ!&JNf(W<gMBiUNrG}7{{+u5K?_W-5_#gZO zhr?-Zy|<|%4t3L6Q|0w}`#o*x!*Q7E)<P-o4><y=Vza|8X4>YhjSY?7dt^us%dI>( zAck?5YryRGlJ}37X~TN^`;ReBh_lNWB4vLiDlc!4VQmqlmP?e0=Fe^|w4ZNd-rb#a zqG>vvItADg$q_2>c?v+BYT~?0Wh(Z`{I<#vQ@zb|8vYfgf^>c}o?runUCWA?-)0+M zlCp)^4;SoQGuWx4M<AB@(KEnzUzRDtQw^gWO(sfAbq`1PjtYqeGhX$|aZT2dZ#?DT z5;R=WbS&j6X*IHoy7*8HihcXkdr59HS1G~XT5q$I5FC+tE&cg6_!8ct<xu^rH?t>; z@aPodHm)ftId4}2b2Hu!FN_*Pnx;z}F9@0XRRqIcZN?*!zY{pG#f!bG>=<{px0@_~ zrS6fx7qATyt+ubSYD@n1=SOm^v*p$oPAXlY<NeYrIip=l)7iFP?yet9A?2$n1|hh4 ztlB1{PAwc8MasJ-w&Afvv=Tm-?S(z_A$M_)H^#GF?Ox^CwTKHl&ApV(%wjqh8d*KG zzVN?%p-p8NRBJ4}tA~q=8;~PtV~!|mIn!Ut*_zZUHEzxW{ZdWimw#NrJN!hFAh^~c z6J3}ykOl|x0tu)9c#Zv|ESDuYdtI(*=-uC5ol#UJW>c3ZDP?ta!jpy)W<Co^glJUq zc6`g_q8l11w-H?jgY^dPTO7?5{P_9FDr~L3zJ8)9@aoDpfjdcU*ApHtZo{SW?VgYs z4-H7@0WIvvrT{qO%!N`eg@u#z3bf;^_~e4_1-~c+f)PPn+f3meF-r<Vj|vtjnbF8* zJ(MPrMkEGGs=^dw+eEvvurQ~Ix%z6dN=!U)P+GWAVP|!WDyH@IOG%!k`?I{v?|P;_ zyEfR}edRXWc`AA7FgAsoz2p-Nx0}qdRfx%>>u=4vAbfgpVDCizRg%L*eYfeV!Pe1s z>x=H7_@O1*y024C0yCMxkj~4+#g!!HwD4`gA|R#KafZK61yiSI>W`TyaR(jNIy^hs z55dYG4$xHpW-4Ifs5}3xQDO)`8JKO1L+sAN<by(P)1>mKE_w7`M5H*)DC9C^X84G1 zw-5aa;Bz!9OY;yv9P1lWFYIcIRa|N9=#9Us;N#^LVHTQfe7BS?-YCiIW?1#jJTzCr z7n`P%QoFjU`&`!ibf=j}Exo`c`it%Y7uP@>F3q~}c;h>lv=2g#7qHfZv=7+=5=f{d z)xQOl8N#d<3$@ikmzAKf#<lx@GTVU232=s9-rncu7oO-5TPbXdz~w?cQ)lF}bIfHC z#Brv^Z>?3fSI_~OH8i%8wm8?^c)CL^;&VAU52clG-y4*KT3B1>^QLj7i3Qa<xNy-8 zkJTK(^-RA(k6}4EmM1gk{v2i=*R36ki%<Oh=YIv<e|@#Atf!ZdylmH5Ezjt)+~~pX z*P0{WD_QP-j661jrZxI@Y_2F#*feIG59K^Kq~MTnJrZ6UHvCCboOUDLmh;L)7~g0P z3)_X?Toy%!e?#jjUy=iIEW`}kXs>?kFObKxl_0_&H$(--i|7R$T~hu>#lCMD8Ilgm zXV&QuZy*Q(@6742km{A1rn~|}Cuyz#r~IPAJUf^mPYv=`i=oC0^+OKu<GjPv?7ka+ z{t%Oq8R$qA(0z!-Qynm?ON{p%eQ~eOZIUJ`7;5D|D1rUj-UqxYo+q(i`t9#t&)fS? zjscV>+P<uXMSKv59<J^a(26ZAoZ}~?BAj{I*&7QAggMb4FBj;|pjY!PcY;r7`9Gi{ zO#}v&H8l2#B(FwbyLWEUEwuc@dH*$!>s4_7NLaPgq#Rem!$3k>2~nHh1;a~BWrm0O z(jkOHdSxc3mr9z5>?j(MzOfo0NV3I3n;GN#2L_(){rsY5h8>K~?y9P+JUl!kA&Ehp zZ8oZ!K+NjA-tCq+J3D*rpIcX(2C<MXF-c_YAIF7<_l3sf&om}vf~JK`A=BytGhXry z=d0~aC*~kNITCG>_(@;5bB!j}g-kC6n)0eFCnx9N6bKGD8yTl+)yn?-_}O!qDxOg8 zg#BgsJ7<6MKI^0^fH^!YTI+a6)EEYQ59*sSgxc3F<>k(u7HS!yesUkCZKEW#&u0;0 z;9VvLCR?MNgZ`iEk!aX<30I{DtjCD%G4YOI$Sr0&K(_4#(QT9hv71AetsP2!7$TA4 z!mUld{g9||8nKQ2{PePJ{k7WNnT=`dAtS8!?pdhT^t6b#w|B@Qk(!Se5^(=94{gxf z$x3tKX-9k2cW{?raWRZa31*GySs*)b8e|Fv=k)VBc)J0$$sh1KSg#<7L#U~!P`z@j z?98P1;C1X%AR+>Tw5+d0PnQcvk$H0sao1OBRn;o!>1^21tn1UekaF_mAIatAtFTJ} z7T))0JeSHR(mA=amu^>`Jz6FvCY=$~h1Zu;N36-He+=uz*FSK+(wyZnEuja}-Z4BM z&WJ+`8&9_}ZnJVAEizeICj|ZY19(&vIOGJ)&jbTS_gwX8w_x<NwT&03>WyirW*5vN zK8Lxzg*k_!KTO)p2ngWeg(xX=vazM}p+k>QVD~0sgL0cf=rmw&)As&kQ)XCQAi$Ch zklpn5%KHdPtwL?c$<CypK$eb|iX+}r3nhp`<g1F6GLTWNEj96Z&$zwh<x$u#Sc78j z_ZBHqX^xoZLEh`%aBbGM$}5VTAVWFHFTxyJe5wiK>I6$37#X0+%3|OZx~mq}#j)cn z#hj&DV0KC*M~*cSfh4)5r6re9i{e#%s0o^^I&)KQ#a&_gDeD#$vEgMM$^9HgBGm!a zVQQ2ThY)y9dZT2j89blctH+?ZK3-+ClFK0KZi~u`NNY9$wjFMuQH^6`g2w*i?7F(d z1Er2mIs3-ROl`K)?RhgHi0<0kO}okUQ)_FdNw`w#*uD9KxctHNlAt@*bDulpqcVo- zeq_}tED?<JIqsC+FMA~9G&kb2|K6U2l+;|*$j;iDidCfUvguw}u8`;4XIUTqw}g>| zPnzY@guO)tI8}U_g*3HBN1g1IGOeRZ^L%rtKK=|5?GLTrdDDzPQ=I&w*S^Jg#+Y-V zwOF;Nl<vFuQ-A%XL;3gbGiMt;k|fZNBm9K=jOyytHEfPnRe6L17_lxPLtg-R5bx!v zUa0Lj-O$|gRuFWp^r5J8?)C{<Qr*z72+gn6VjcYudj;7Kz$Mbzz7NQE8-ax#-(KmP zb`$V^Ia~>jXsM5gg%*QPX1w8Aj#Z3})e`>KSz{i-k45>pwH3r=H_)@~?lsjOZ`qBE zs6x$-fNjH>mTNz$^(5vytdUM5`tg%mO4ZcYxk@jAucC!x8AKDL`zvr&>K{}#t@d^& zMKf<E*6cH<`|or=00M^BewTs}nw4P6?^<^|>8~6+SJ?Fq4-Sfym$&Qhh8EH#>qf`K zKrWXH3DNvu)@PHfdE5O<H6SE_%=8i$e*W?T80I&3F5<A2AQTHw@l!du(rDxV&k)D` z)B>1EcE)NZ-4m^<DmT@1Q7!zS`0uVuz*?WYQjiSI!R*lt3=CB8QlsDz5AEk>=F4oe z<sxQgXSUI3ki+tLgX{6p9#0x)9L=-skrnoP_wMQF)mJ^>Y)#gyI#3X2I$dvzq4D$5 zRIv*J2FR8pU<?+LiXid_te(&t0S>h)$Cd*Jwn){aL>Rw9Hz})qS<!M_QFyGYU1o(Q z7yH@@`(zVlAjLF2o$TZKoX(*VZc2?qbNay`ra*|S$dKJyW;~+Z*eWRh<vT#nNr)$s z@+36xd@+mn{Zro8p`=-5OO@>l_;uv%R@DmLm4LRMU&~2VYsJNE>9yMqATdvyeCSyF zuU~X*n)Y2ePwvoF+J{G@My&_f;^4#jsS<9gKEaolzM+MD)HF{wM;q6w<!Lvkvm4v{ z`Db;mE85hJ*sdV|baHxt!7=*Faz&~E^0_&>kZ@L7CnpQNN3^?4cLO^)OizA1CQ`mr znFtuJV;i(_=;DVt$(3Stmeqc<qsuC_jk;|tG|9yNypL7m8LJ}izYG?u{UpfCtH+{Y z5V2H7@WevOc4?dA7-H!esk$__vb?OI46g!!1H5pCpbx-OW?nnC5n*q^Hp~gV<0e#k zJMKs7mkT2!BU<@`tE;P`Sj=!VfEIuZZJq@#NR5Y_B0;;h3NES<(kMqXVlng%J7X`U zbD#5}Z1h|x1R`{PytcbkMERu3uxMLCZ<ll2qE-<%u)f~Afg!8wPrShMpXwBFx24>< z4@8v5Kl$;1{b(miSeypqbK6JFoDaS}u5&LNJ3ZCbtbDusw$r?+;Z2VR<k10P=3`qb zPhFKR)n%CPx4sG8HbcTr+6h6*?=dl2+LnRDtw^M3gGI<gty5}YhCsluifh~A1XNa~ zwSOX!kD^X!QE4yb^>Xy^ZWw=2Syh#5&7u>(ncxb*OO)W1?Nl!-UErLP+%qR7_^_a- z%{|53p7OXZp5xJp_=%QMN|+BE*B<*b=UjUB^2CMS<Epd2p|21fB=hOhP@n>lI&A3< z9U&p%$SYDZR{l~^Q_MGaAnpqyE}?H_M_8J9`tSbyB}2v}3$By=kU54IxVm@y{p=29 zz*@}&be5ZotB}ojcnz16nK@tf(0Vcl_g>Z1NM9dEXyHJE$MTP^{+A}f-KFQb>?M9C z0=ma`M3jXOib8!xd^1lro@`iIS#ifb*S^oAAZ4?^r24d(_QOWkPh*o*4+D5u*cjuF ztODTicIoqzw8r+1&WCjDSiVfd_wN_>NtnmOb|s0;M6PW~#ybZlN=+ICk(zUGYqPW+ z0~3-$l!?|XV%wq6TC4fBxXMOB;mM*?)5Uj0Mp<;Jn~Js4E54lDtxOSA8<hdcy8EI@ z!LqKdt`Yt;yjL#Fc6ARtl1L6`0({CU2muFtIUcjx`=PYQPCVwq+H3w=W`uh30o^LM z@%Icf^K~XzDW&iA=2?`gRrtD`U2^-_j~`MdPaZrV{BGDmP~wEYjcnd6nKYXaW);lK zR%U`-e(425sops*VbASA>CA$?YRxs(;hGvjWI8t+3yZMp(bLAf9uteHnVLu&Ktfh| zk{8IS-^`J;^x}h^D*l{i^%u*9uWW^!$Vf?J{TmK)Dbl?U;R$^oltvxrViS=Z4DFqA zrYmX~07De-_-KvhOkj2}wEl<l88$GLXOM5J_{XEgW@}K)cs?=@V7lg4d60J>1%Dd) z!e!jVK<07xzOaah&iQS9m~)}h&oHE(%Vm3aYN~MrJ-4@4T`itH4b^Bx>nVol@-VR= zt6&|7ZOA@%0-H?`IWH*UyzXq$JnCfHnAh-q(Ck~{=H})TvS+|0SlwRBHMDztUkAw+ zYD<WsLjj7`Cgs=MS()Cm9>7YmVOuq?d-%8n<$QjVOU~zwQ@csyxm<r9OSH)RE<^c~ zv>eyAMO~89sAUs72c2zeGg%tr^amkak12ES$}CVz(~G(sRJZ$4v9rUVem=TMzdv33 zG33#RK{Zi1fMGbeWqL14;?n#MciGp+K$M7A(&VM=-sNbrSe;uBsU0?Zp$(2Kih#r8 z47QUuMZGt}kD9XqvPp2%f`NlW`@<%HtQffR1BoRh=2k0nWo0{<Rny}W-#6tw4(Uy~ z{Np8lktFPL;BH$uA;Hk#zGIo(VO2msd)xIx9;95NK(e1=^DUseO+jIBm6HBpCMl^e zl-<3(G3(Q^c>6=kp(CvB8#Ao>2m2iWi>ahM+pK3Fcmg1pxH8CM)bkiZJRsuB@rj+b zKl-G8F)LZ7NLSjulf0QucCsV+g12pInBGXfny<?u$0b|ti56H}C-@0`_%3=1F7L`5 zsSd`%q7fOpT55em7P;r==eR`F@d~=APq`kw>hcZumfMw2&HdENlDWr1=RXdPo<Y=I z4}#KGc~)QH;knEg32ZUsovcq-4Sj+l^N>iSFF*)A3CqvR1Hhc|hhP(=)3grM9o=3y zN+uUB?0#mmV%7zp&HmljcO%G(UabZhv_!K{VsB|-DH;1DV9eq0q^n+{2ui^r#zH!x zN50Oj`XnM!Ib!Z{E!?6%{Asg2*33x{$vNWdW-YC(;5KtklxE7uCytfA-Ir_-`1r?_ zO-aVQmTP3#1tY4&eg+G@>^zEc$NwEFvh(ZWhpB*B0m-D6qXV)MesEd^O;K6^OkOI7 zL5=Z+PPKugAB^U1mg~=xL!x=b8D3)POF?jpyWY#SCr@@~nqd~Y?DIr@gM*Xeoha}h zbIv1sSG3R9_OZluLV$a-0+=mh<5ZY$U8y5j#e>tVLiFl{I`mm`&|NIt7Su(EW?X%M zkAHQ%h8;*blvE=kx>?zlbqJxMlb@H5m+#3wW_6qr2<2zWZNu6h0SX22bhsEyDU+*l zTv=S)1^^>D`NiU)8tqiG06+iR-D9pR3oG6DiGn=6D97>U)2VEu1W7$kld2EzEVuAR zB}X`4Ft66(ZUy*^`(~CZ`*=0T(_<g{dyJ>`-H-$$WgGi?F<MW7BFHzMo&)~=sf@e< zF)^bJ<Gn3co1?(iO{bv&_`PdrOVn$Am%&IC`e1^1{k@a4#wutUd$VVpBHViS7Il^3 z!o60E#^Ns-QLYwyFeqHg>%2#2gZC*@ByE+)DAJx{5C})%z83sjT}~=?liCS@d59To z`JUbduz$V5Iskc>#_wVbP=9)Q6h=lVoe@-U5Xt%S(x@JXk+b>fga&;`(%3E6jS;KR zLM_^);(bnPr(GtP9>>8U$j+0X72uIMXZODc1hgFvO4Qq<I)Nc`O;tqetWic~i0#!? z!<e|$l@-4$G|`h+O{W7XH>6BSNrb!T+?+~!q6m6u4h@Uv<~xDe-+%qzrFJpld#l|1 zh|kV_{`xduqb)@7QuKqB)$z^lGuw<g=|t@UoQb%^_>MRvH#?znNMp&K4MX(Y=OVPr z{UP4zSm)9<Tb$is%N5b1ZKqp+>4Rn<Z2AD=$;mK&62P-9em+UP!xesOJKw)QsW*0$ zSq8W~tE<g21m-;e%>now(+iUR91#4P=g)pu-lp*P#=>_B$`_X~CwoNMdB(>pQM+Yz z5O;EqW#w8r)b}zm8rT|hRl8EI2j_jo97aZB+-gMJ+=D|O=>X2b!a}qf&z=ib^0<!x zl4B&L+UH0#feSF(w}EWh6&X3XYSR94o(FqsYU-o7)yp8I_%i*H-c$fAPFmHtJqS%o zqP#yK;ml)NsBLJV<HCGCQF64rj1SjJM+}-d6ogeZ%nFR>YP03{dAXwU;PGQZCc3&O zNDnG`LfS0QeSn?;&-tL!YE7#WRjyYXX)z}|&t@z9JSh6QyG?4}j|LWr(vJhK{cPA) z?Go-1QA5)gM68m`4_(P!GxgpOAz@{?L$g8tjl^vxfV_-G&<uxzEGm2=_?7jb_}NhP z=g+qTa%$d>##5L=WxA5MO<KNxcg^mZt|m~Aj*CnCmY5?mRbMvo&<%Bx205iJ|74OK zk|N|pKqWw@;`+m`>TnJ>gN5{=IC<Z|z`4aaTNP^V`}gk;V)E8q_2Uv!QpBJm*$*DP z^C>$8(o@-;DkEo&QMP>B(T=x7cpJs_X~$|;@qxUso#kY@pNxDs!uwE{U^Gb_d@U0t z!6eSF+hGH88W(yX&?3b`&8`b33(f*WC3)QkU{4P7$@K+*auCN5Ncb)nbUdd7?tRAj zvfDU1fLT%!`zs`$Q7Lj7RJmhi`G``~@bsT|rKXM7Kg)Rmb*rpOpzLlaC{PehTVhr{ zrWP)qa9mA6{+(CZ&Ai(FHLvC06-zF&7%tNW<6O;+inHTbDk2Gfbcfzt?9&{5x1ZTE zU~WvcykEoJz(zap>r_BC$Lp_ber4s3T)8D)mktk>7;W4M35RZ_opP?4{sMAA))L1} zJEyh)`A9A5+7vn?F{1YI<HWj4jG5Ot!N!0E*~5+-&IxXf1>*0AbO2;xDC2{1{lur> z_Sh2N>n+0?>Fe8E<XZ0i^@sp9Em08CPXXj^#}t6{7>OEU2)_0yC@ewe>5*D%ePBC< znRk_i19(GX3ts5jbQYGtm7hO9AqEu39wR-d(-j4ZQ&VU1Gaw>aDo5;PSnCa1_CZF5 zy!`pn?wAaZO8X;SL&J+UHN;zwFOap_C?G3XfYEF`*@kR~u0fNo8Vji@0cLT$YW@!Z zi{1?arG&}HTd7>)7+P`9))}Kaaf$+Kr}v^k7Won<W0foHF)`fBD=VyVJ(ri4z@o0| zp-cGOh+)3UC8OP@j2JgW)JwDO^arEvjlCu6ED~pDhXsUbH#`}Ykmhj#<U!~=M1Ruh zdUaRGBU)?EzaAGL!~E2VQn+!*<^Fa$1b#xC9S_%SZ*Mnvpl4X~EVjNl`%5AK8z~|z z{Cj2MVbDu<c8r`I@*JNcidwSXVr>VQiH7ku<%7(A>6>$aROsQ*M~OL=*RN;LXmp&S zj-%sFb9i_d1vfJjb5|GbY?Twj9rq&dMV8LlpEp-xT^;xD-S_hGnVOmcR+pcb%gDgA zJ6r4Dk0dzd<J$!FzXtQop&CPL3i}PK>mj?Q9-|J_!$tN9ssOD2_3MpFbMx$sF?xF& zC=3S@ozOS$O-<+eQ)&S&!!ak<q|SK*$U(Y2csG;6$GZI{nfq_gOz&ic42F}c`b64g zVKFx{%|~4kC~au)vLwan`>8Z2$;s={YldQdc~eV;hm*Gh8<eDc<?}YK4HADkM)K<7 z7|qDr2JB2${eS<0OIX-uB5HmI1-I&<j{zo>YwhU?B$;DQ=dp-dhSlkV$rHeIXaHSC zQbbKalM3AK_-n^(qo=OFE(<9Nye&cMzq~hW!OAKGY&&vt@`gHLh_{cNoSb{;7XQaF z9&2ms(6NX3_)87P&Auya_ka$iqZj#jI6q3Krl$#>4}t%DYVpb6+r}?@OmLg$2l)Ws zaY(x{*-fd0k!BBa?>7rhB4eE5F*0SB!>HwZ7LNHI`|!hzzl}mOT1+qQ;)H!qN)kAa zeul+Z5z5~B`BX0}xS56#XpUKFP)P#1jyU9PZ8x$Q{o6g!&CsQfia_<;*td4Ez?(K6 z<t~69hD{U$RP-+(9c`O?>*+t?H~lZ1{8rs?yIm{oH;s5W_pP0rXi1+EKPP?qoRpXp zc=u;*XLWUZd3k+({pMxahCYFUf?{oDZNAx!`*^h<pMoo0B*pp9&_YhmVJr<!cF~@1 z@-0mDi+@eapzM<~`%Pbzlz7C0jksu_>8VxoW-Y+uGHe2j=Ph*a<~;{hb2v}}^S6=) zc>VwEH2SZn6&M{{R28<U_yG=+hpos1wnt9T)C9z2)YR1MgPs7<c)~k7mVr4%H+%hZ z06l<SbO>cYui>5Ve7NyQe$m`L2C6`ai4DK3X7)>5|4E~nZS1k+^Ax$6=2*g~y<ZP3 z5NF#mVn#-ug64LSG)QXFr|KoLfR>w@LUlcLfglPnk<4moBG7}e1^TX$5l78*;M}`` z*b#)&u2aipI}({JPN083NqKd98}RmHWAfDwk0-JrdLFTL_NR066dZHqE^aO^4{`yC z{h(Lc(FSnr$)TF$3(C8jGO<(HkVz55WgWOHK9U-lWKIaAvaaV!V90AA=boMhbQj^_ z5jX(3EkFoUT~b$%DJd)W2g#fe`wzJv0ot)Hy%?=gg-G2Tg@v?_wdX8jn*c`SFNd$g z78egHt0cC(h^NtmF-3~olol5kr~9A0Q&WptGxKTlwTmrI7WjGr)K7=g5GRX=GIuE| zDKRT2`vA7r4#zy2CjIrkvGfQx;z|`L7{VDF{Z#&@?LLx;ktuDGk#gp8QgE>IpRw;g zUrd~C&3SK)6HwL8D5zw!0KeTdkplG1#@-?uw3#Lbo;v+x<>v10d$Q4G=6xkedJkv4 z6sSJ39w2ekxhX4hc*kmQQIXa&HKowekejP$==-z%s@^f%dg<qZKS5JKK(aglf3^dn zBqpu?{Hn;7=ef^{v+nXg6)HX9@HhAAeUZ>B*5STQN=5zb+2cREYv|dj?&0Ci&b;z+ z9{N{XNcdL%V5*q&`rZUc3?LgfjTZR#4z^MG)^A~Z<*S*uZb7*Q22@oe0j?w{C<sV+ zB_$aE=)$-$-4#eq#pJ6383;k4N$sz{k;n$8-Sj&br#FQlz)0KMu_-CwwSn1Xe2Usj zxZhG9CqRRai@Asyp>XdX?@re00W^@47A=sq{QS8U@Wp@)22h(dV1u6}C4H<di&L}$ zqAP&&h{_N?@7<oazB&S7TbdbH!5$u=5fO86h?AeAc(`Hzj-H@cW2uQ~$6N51aGRCg zT~wV0J+3@1Reck%Om=oL0rba%^RO<p)R_vm!49Q_ejlZOE=UOC{r=~^x)>{!N8`eD z&i2vM0+xCM8J-><g&XNMv%KP0H5YEcz!cnPDyY;9=zf2GhJUup_c?sKsmHgjU*$>i zLHk&M$|*K$z^wM_m0q1-GPsQEwDIp<w}H)6p9(3W#-IUm&jHA|+W};0GQK4;r2VsF zA|`pdO=7b6!Gjj0S*Xp#m@yBxo-Z}QoKOoFa0>IElqUQw9DxE=AITS9_9-Gjpp>!; zz1WSaB7G=(9BG%dJsd*od%UtnCAc>ts0N_y?RtEPtHl(6wV-PUFt67xb%~#=1g6y< zC?(>RBNO$p(Nj17R8#0*iaOgH>&jjFb_a6(@X=mE;##&EkdfZPKBV(axp*$wByXf+ z(EM>W_L<s7BHB6wdI^NJ<ANR|ZKFaC7cijW0Cuf!{!Nn&bvLHyqum0hQD5r*I#7f0 zoSNDr3A<h2KJB)~ZFm`yrI4=`zTv>CE_p}#{g03dg?~44e(YW%P8O4w?;@JV4rcnH ztW`6zl=ur;B%sc%iC2v^O+ZnL;Yo}upnivI1BP(l_ot<49#Qv$h=Kefr%_;ks)W`4 z=Xr^%^=8p-Ux0Jg<4VEKJ4qzedFkkV0<v!|9V6$es;UjlI}1B42T}LTd@ufa3)GgB z*Vg)fSgoE#3CYRIB{~VHvycMbC-Ug^n>YV#60r(t3OUXdfok3aTmZgsvu^Ia%zfJw zcg(;nq6W<q)XHlopfy=d+k$aDJt2r;iX7#oB$cjy=(N9LO-qAB_?cr{0G0#?M_=%^ zG|Bku>giI@7HtNv?1hy=#IoyoOqAMu(|es5rU=eT=b0Jf$zuJZpFg3iiRT~tKVy+~ z4L7wM1GJN@K0v{ZuC6F`5kb>yp;Du{W_xRD5~97E%88LW)!|j6XM`QJ(doZ>N3*vN z%aHP!<?xDULY_I1K@&_x@S4J2y<#B!Ua@V*6lgOkXg6QlPtqAN;un1Yl)+I9U{<Q4 z=3x_MA|92wQq7v@a)FtSD&PLonQH?@!XuDPP%8yzb(JTf4zqTn4P+AEC6lOtJy}e7 z`K!^X7DQqd2@(7`?}Yx^0c}x%!L`@w5;wGHOI-!2sLn@Z-I7BDVY-XJ?F(DIny8db zOrqg<_AF`S)s)y&f*(+0;;(t&4RTY3I;V2kKNmc@6<Qb;fBAlTTp4e;*?tW``Gx1Z zDx-O?k1*RAE3Wn3j;!i~7Se5|q5r*s*hcm9?K|<D>01E&J<I{th1GwpcbZ?{_wq&f z*YHGPXm!%g%)W*E2Kd?4#1?mbov_m2;RycVIt6oMLxVz7pY7u7-dUWng7P2bm;U}~ z;%cbW_x&>2Vl`#15p8hXz#B&g;To=l832wJADXf9=a2cfVnWKHQy@0u@8`U?>84z8 zO@GtNi?5XQY3TLT)NlWk<L3O33HzDF#qaZL+?1jpd=>Olm|8M{c-!wd0_-@eI4S7g zOa7kLUtMUa{Mp9+h4tt*OTPZJz18Jq=oLCDAUM*NX09~Usi4+hA0}8~;`1o+WNH+9 zwcw9Ap=D!b<sJRH0Mu!Gm?92+W+)#hd3r>0y!S0MV&{c;+brbS3bxU5x@UX)Ip~!n zzwKvtyOF`L<W}^XY~5FYt(~rd@@$KF0h&uC?wVK#Vg)*kLry-ae+>4&uTjE(JP;nA zdy~vxbUg&n@2voN3G4wCgy?zS?;Z{|))t?u3+^iasI565HyneEPrm$fc7jHY$tJ<< zs_WuqFOGIHT}}Y3&=L@g!0ub)E)mVwgUbqX^fhu68odvVKP>hL__rKhcge^_;)BK= zSG5M6rjGP%ZEeTnW)vDt%`CdYzv*wlxFxxPs*-o_x{K#mPpJ7{vv7<E3BN9dAfhC$ zG+*);<xc$g2&(~?`#W@!ZrtTEX)%UIH(fRXMIiPm-e*H^xJn0}*vERARu|L(T#bNS z;R7bE{&ernilHIm(2h98mCv$DA(7ALn{>o>Kb3p(&YJoj_lHryp4u(8oz8iBy6_d= z`6_vRwiG3Ky*Zd68zJ*_>M}#U2PnUC9bpBz0Y#jUqreblPAuRWxh3-9OOPOGUg$_{ zO#YyDdTex($o|3x#?x`a(|*5S&+NH~qbsLVq-G(%T;;86C?&!S;i7bKjz7}-5l99Y zwb)G`=&1NL<-g`L;HoW!`I%@NUv4=e%JktUiz~gkxjkQWIWv5GgWZKh&?vd?71szM z5x<m+qg|BJhw1I@)aWH9YO(9VviqU$x`Ag{Jcn78uZDucHxZiM(o!zO)nzk~1UPbt z>ykM47-)K?MLX=3F+Du&GWI3YZH;pz9$B7gh@qIRJ}*0v5!*pFPgcD%KcBa1xjG;L z^-5r}H1419I0yi78}uUd*^}PYwY8`WeyiQ<0IPZ9dLPihE&$0)_7S@X8a}TdHTS3l z9eDhD+RXe<vqK#K6`P@ZJNxve{I{{OrVw#?(%5OEjt2CL7J4Cz8Uw=6iECMe;?wIS z4Qp#=2m}%lGq$v`0VEcX7+SxR0SN76cVvs-nqwJMX6^z(6q)flE-fu4Apy*C{d-y7 z`tq{ZAv702kkuYf4*~XSq**{U<=p+;rd-+15SbWCL_toT+{^nirrX%W1X&a6vtOT2 zxHE@r)B|sv11U>F8d2kgUH~rc&g6O&T-=m03U<#A)`GNiY5=puAyin&=OvKB<5_*w zmK7y=C4F;cz}<#3r;B@B6t`Du(WVuH2Q%)^1OL?lXfqR%dqh<%P^Vc4EwyWcTlMO_ zQ>GU5QU^4EcZXQfnD1l@)jK`?D42pBC@A3Z?y0{^U=r1Yxn>6M&c^5qRwu3IANwer z)FZ66PD)T<yA+?5O*k#|dYr%4?)RU6P905Iv0x$eLEQ2vO0eW64dT9`V!3e;M~N$i zwW^ueXGY4&)<oh>3frCy{d$7<?SQK2t%OZGckk!`Ltxh~RDcx7*RR)yrP^z}5_5CZ z$XbDD&U-f~#p5TCDCN@Ka&~4`O;c4-icwvVvorL$0D-h1?z@J)Mwa2Ga)8XL2@Y0K zW7b=p0!y9YV}4%yqP+eKnh`=<V-)=u{#kR@?226jAlOsr{<Q-0B_DoD#Gd>aunfB` zSOcSPzCcI~!nbRD$FkqFUP%VqK_uE`jsrZ|y9RvS&^3qNmz_!pWeR;mT4jPge~f_Y z|66pMazMn`?q$rZmOjiFjRNo3rHnCE!fOUZBFKp;8K>=$WlJd`f|w12S(+qxdu;fM zJ-!dS*NlCAFx1ZFQo%&_a^TvprG0Gqkb*JKZkt8&<;$6gPC3-e+}vE?a)nt6W%&$D zj7D?3$2+(ga|+{^ufA#)UV=&|sChpwI|E7ehi1u>hgtW_K7wA-Gwckq$MpbFK>?p$ zO07doBC-?|%X*{j#}TP7c^;1taf<^3%hM$5#~h`lrBMplvG7U-J-#iS{WcJCLS1m+ zr!b!<0RS1Fle4wpwurInvo?94!m1It>qw5khnkK#01yRo9L@ew(ds~k&L^PP=%BkB z2r<b?Nwt$Is@9$u1q#&W+}S)m4`WEjCzIyTuRDs+GaWipEJ{h)DyIuzdmSL|@MQv* z31CiGdFPs~w5z^-GvBa_Pe{m@5s2y0QE>kDuQ?Nd@l=AMz$DpaS?@^jSqiM!bvG)s zwP<%Ax83*0tT0<gQtQ{)I8F|vZ897Js39($PA>$usW=>#(mn>TJs$6t<?M<&o+~Qm z9;9Hek6PKC6bIvz;^4k3lprm3A_ZY%%wZOO0>`VuCk2(sD=TYTE_dJI1~xFbY8*rl z=c)K9FMPWFR|DI|$Jd>zfNY$h)Eny8?)nKKqtz8PH9MoQu4J+>|EqIEWF*|=1v1^7 zL(ACMc$R;5HurXGs&N|E7dJP~<%V;BX}l8>3Egc|^QeEr>4MM8CD?FD!0s<OUjyQo z94b&}(Jj3m&3TyFW2c)_m`!avFrcZXw>i}Xm`ETW@PtTm5_t<i@qo?+r<Igc=)JeM zHcBzlUSSUtbQRCghh7#^6g}T;P^1qbN;>Q%8p#%TY8-dx7gdwR6KdKSfsr54aJgJf zp!yQr6P_=6x(+`3Z?t^}RFmDdt^WK9f(QzVQUw*HHv#DiA_4-^JBUaPy+a650TB^U zk={f)q4yq9dKCyIv<L`DAVEqJTHtN`&l&fgH_kox+&Avaa5yX^`M&+_z4lsj&NX+J zC|iOIY-u`k=h|d0$a>7t_7Te}<8IUM<KkR&bFAMuanIbj_*2qTElyk5s5YvQOaUhS zA4-=aKkXsWEOJWXMSS5fQ2GoBFG8<e0k>ybYwbnrHBsv~2*P<uzgWR$a2We@6Fa;3 zHhrd<m-FACR;Y-krY2NX6{v$P8cD&VuY)mKaIsGodFO3-iY*(p%y_CMA533Q74h{p zQPjRL7%61B7hVt-BU+f`O|kgV*8AJ*O6l7V1|MbLEZhR&;bY5CVB~%7r*_TO21`~6 zv>y!OUew&%HWsOsStwk!;C?w%JnV=@PpXv;m~E!rPx_(I0F_#p;}vi8jYyFu4+X=Z zEArU{FKtCp=)j9l>Irex^{YOm@ytvK=crhuT#I_ONE^g4sMY1cj8#bmG29ttwoT?@ zGvo@`D*zy9kd7*|4gm`LB1{>2u(qIPSp^_&_{r))`Y1KRrq%wafc9qQ6DB5mi_LZH zJQthSvHsyf9<de}kO0h;cE$QMX8-$$TlJfK!|-el)eph8Lt`D>0s>VpuS`_>9i=z# z%gf6Jdan;>K@;-3#xgTGM+0|itiPTH5po7DG8+WZGM&_nDCk#u0hBQYvr>?YvlYSY ze(miyK)n-4$XULn1#=kQA+ShloK>vzM!yd9q*HI0%KZNMm>xg(K3R}(pP2^$LsV3& zr2uMDdq_)5E7~fztkH5FRd$ymqM$j@7vV~IVRE{+%ea0|+ozL#Y;5fA^OOC_r=)1k zI9<9h4Dil-i1^{bo{o<DDL!}niOw$oqb}!~o*Wg`r00CB6S=PYYs+QwQ%7t4ZnCV~ z5Y3>1txZ;@=-OyjN{nCZoH8ZE%y*;WA|d-jHfECc?6#k$XJ2n`Db_FilCI159F0_f zwB*B@lpXlAQf00U9o=27GiK=Xihde%u3tGt?IEnr?kk^@o~dadz%qfhHuz{kc(8fL zG)95$UQMJ~qia?h*YLtlQVVFvX5i7*=o1O<d$7XDt;uTCyPlBzVS9TDUNUa33=kMg z=;AI|mNBaEn}@IPX)JLc9uQo0d(&7}M(?D>*D*QS+Kz%r&c|@&TWL%iYN1ox17M`j zo|PT;3=S&hH-A+I>zat0Of*f;ku?I~MILeW%Pe_syD;rxZthI##*R1;td2;AfZn5e zqx7^!lKMk7@j!pTAVw4t00)QN9U`r+1x#|w-?lEQQ3II!IPBsu#XQhGCi|aXTwLtr zh{v{6Z+1mp^p1|CrKWzHXx&*Ne>_B2uNI9PmYVR05(psb3ZqLb=7aYRAvRBU4pa(M zo4CwslS_bLUQ3h>pcfV{mz+I3x;Ge1-4p;1<5emRs`9wHlR)fH?LI5q+WI_>CjcsC zQseI$2U9d{Qr=M2N>eZ^R-vY*HY~L$-9JF1b&=`Yc=XI!=KN}1T78mh8s)j42$#a* zsD8@z7T$7yr^)_nsxe-deh-kP*<Po51k_a?>J8i6SQ%9>gVqi}jD#$kgRGyfx`V4k z6^IXu2W`$B!S+XaK;II2YO1lZ9snsj*sYkc5>u`j%$q9GY{0@IQ-<TCep$W?^2xJJ zajtj?9zonvho;$eyI&iw70{`dwHSZt3Lk#3^e8FA0dyoRM?$rvr6{L_x&J)Vof66n zr~@x8pTN^CzVa$hoF00IuOrD#7E?FDJ7Qr$et^ix!CW}N&|$n^uNdz_!DgEgykj~q zSxx_hIDP8udC+8-_EGN&!~2AUqkccdmMtP=($1fxSPBgY2;N*VQhA@{21f6S!uIoU z?x=*|$kHX(?A)0Lnh@+Yi6^bu5es1Q*?*3cbVB{=?#xp>>SKT$PS*u5Ea7B*mzRx( z;@aP~QrLW&f}|vW2%7zaZ!pg)Xaou8hzJe@4RPtvrHJM9fEN^+S%1mZR@w1*nE|AO z8sQ~JljowTuWxjle+($H(?wjp7eTjldEip)V2aXtTl?jpqY(iY`3h>z)Ku2-64MIz z4UXPJ<D^7y1!3V*&@FKMfB+_8$Ju&;7gO&=O291Xo;e9-SLjZ_*xI{mFKeQ|1u1KD z$I9=c`aH5!L35M$U<*a}vhY(|JM<(vFdz`TLSMdY^IoH8m;t>>4#hK1cWibGWg<jD zTHF!MuHd`v9;W2+>)Sg$`+;=Xgtv*_oY$^hljY%&lF}ARkOECP28ejTf3r(G$*=i? zS4armWSepdl^WXiL%3xRA7y0q<LYpXQl@d419}9=DQuTkd8LSW*+<3O27IHlFv`=k zYxZL~+cTsi7U`f@Z5FmbkODI4l!M2FV2Z#k#r0+NXs_P@?rJ263cTX!(-qcnZE3H$ zHJOnI^WwtDoj1Hs{pa2*rUy9X&Mtgmxh}RgTkHiUIl(Mw6swri*dcoDn5hPeihF*} zRx_u(JUzh<Di^$#9~ivdpDupXoiyTI(5De!@|HbRFDrm1J`s8cbY<PfmFGznSy;yA zweW-M2Z=Jo;o#(ne0~t%JcTS8!~&<4lT1vO-cOkz2S#mL!G75fcPX9f!!##s5RYJw zMJ4jGv$tErb9t_F8$k-Dr<;J#8>p>4ep)o9SJ<vb^VtItu*NoXusaZ=gEIXVNms^8 z(t7xsIQ8|;tD`eO!PLCdlY)}}oE<9Ni-P|Kd98t#F*z25M-s~|uHA!Em0h^-jGzF3 ztU3vL?)BB5x8Vj&b|~u_aWQcqx(Ni$R2qfSfT21~$I@t%S29DgYW9V7z4F+n>wvI~ zTWap58EAa!O>qW)*Ld@U>u!Pmfd71bZ$fD@lovN!={Auc0R*~*)-sjLLjL~Ph2d+r z{>UdgJX)|n_Fa%90pErG!S=`m==PO^Q7O!E)#PsowC~~3seoNxjVdsJjM1_yNXnCa z*_L*J0E&V#rl!jkFJ4*E@z8%K#|YB^+mCK@rVg72J#)BO=-a@$Q+`rX-4^DLw4)nA z4r1|^^`Qz?xqr83^T;uQJQy6pBxGra7bOna@HA{+E_<4!5Hmo{S&}!MxZU+8!3x?~ z^}&H&WXR#$f9|+V<_}ZanB%dkiNX^X$1#`(nh5+n$l}jLbR+xI6m9onzuwmpaWVwb zVmel_J#aB`Eq%@I8^d4qI5Gg3BC&F39$anm?EtLy(LSyZ9g4NojE|4UD_%Z+Gx>B> zKHfr8{F83M(m{(zA#8a?Jj0|W$On|{00dXh5d%={e0%Tem|Nh=XsxMAdkY!P5l@@? zeRWD-=1l<)Wg1X=v%|TBh2gjcS_u;sEiJtGAab(7CC>=sZ;$3c4BWV$lZTN+F(g*= zUK8KywztI2Lcam3OCLSrmISy%VI<M_p?PUk%HgMXlqWtj{?#u`UsaqqEXoUXijCfQ zMzjpq_1oV%8zWLu5TL?PzX8ZP8ft3KtxeZibs)Rf&}<Bt`;r6dgbNp9AxHQpAf3NU zu}@f;xpw_#S8wmg(2%H<FsUaF0wkB1vXxTsgjW0%@3H`(=vTZo*bpRW&Jed;u&Yy5 zAP4%32=Iig0>B<5mZ{UzpcLW0VR1VlvCd^miw1fh^=N=q@jI^AC%<E94u_xZ&F4{> zTU+xcwsC^OK1vUO1c#_fVLfZUvdYTUu^U2?xytwM)gd$77Vbx}va<ac`-|=ckp0r` z7E?^x?RuN>bWoV<nLq0u_7~>jHBve5sa{GK0~8!Dn{3rol@>&pmr2+%8b6J&yx8@! z8s2u#@7rz1u3yK?LeKsLDmL-kv;VNc`~FVnV+(Yyp65pHu{zu`?qx!rDo{2_XaSk? z<a6cl0+AB}#=8jZ|9~0=o_kQ8?A>V3<6wQQSn*`kG)K2!feUmIHd}ENusqwNEq~ks zq(Ija%pj?^+zy|7RoFUvf}5S;7^$qdky8XptCPLwFR<=x(OIpd%RK;F3!vZMZ0+9K zf*%IDOdAnU<2)0*<g7&I{rvIcGp2N?`a(9SmH~vA8x4BkX}+>4eI5qtmcw11b@(s5 znXE5f8ql|0Lkj@12EDwDfWE!m=pPtxuR8iCE0b*C4-prOynG;fY1tTq5;EI>mYYlt zf|9U@)8g874Gj*dK*E0mL_L(yZ$A0+*<(`oC&vEHkpduf4>U@xT0BQ}d+j$v7Fu>U z8QAOxy7~_05l6ZOAh}qad#7{aVu60)I3~~!y*bJlHYvLvocb<F?U+pL1y_6G=zUTg zVcV<Jd7>`t(<8GA=XRhZyb0_V9}WJYbR~=eB@7m9Z+vOs(ZZnHjC$?Cr8~8><}IH6 zUc$}yp<tuHTHWcoNdLG%N9)FTNnVj<V=%r+1?WafrNZGCrxM>K?Y62~9kkq$NBxNd zd~CiSm=faRbD55JpC8_R{=D_>$-8$?0<;b9>I!Bqcwyl#KQ`y*=bH`=8vWLDa%N=U z8^h?zGn5N4*KcIxZL6!RdwF`f&NRTV+erYg1u09VQszg%w?DJ}8$ILzJ(B}y#uFzl z0Tcv0m;W7J_ivV(|I~Og>pdjpYL@fycYgll5&qkW^B<iQBYA2Q1?y40&NVmup=TuM zj<1TBGSr*jM(%^)@n0G`uVo#-|8JfG`Pu@@Y+t_Pa@Mqt|MeT&fA57U@QP@8|BCEy zTLl5;|NiIy@dE!)I{qF|O&|aMkBs&|-Z}P}`Tq4Qe;?rAKBE6|(ZCuq2RoE^^!B_> z82wQI0o^ohP93Twsfo*y)eQ1ark@`n&8j2g3~6Y_w1|(#rl;itN${&hw)}p6boEhD z^iR-VFmyOfaj`<8j{J};B7Smu=*@UGt3W{*%FWC)RP`ZzGk~*=WCiowoeyBvrl(I1 zefzD9CmjlQET55vD0s;eN{VOJQ-c*Wozj&pie8&_v6WlUj9{}F9~fbyQA)QYt{8aK znd)xhS%jAs9a}EMbw71$Ar*w@CF~&)@q*Khkj8hW!A4S~Wh>ZJ`)CxOjx3?L>HYlt z!9f#>h1Xu2P0{n`9i4YCUJP4kp1ZG32L|Y&k@+}#R)_W_rJ$V*qxG3)<>#o_na<!+ zx1z;O;!v9J`i{l|>RVa7?a;?^0#^20`>1AtzEJAE#(e!q*r`*jh1GsKPiz*jOL*+k zESKCT)r^x~cCZZJYhmJ4$8MQr#;OZ+tWk=0h<!$uuJ}l8t>Oc6uUj*wZ7Q$q<M;lA z^g=OkMM0F5or!fNpvxk0V5Y}ToOmg$hKfn)I!~&+$F12-Y{(f`rQQ98nwlDgmP6QS zxo;H)*+wBR#nXf4Mo5?<9?|*;);ENju<UA8*!?`Q6VGIP*M4zw-ebtfJ$!yQE)O(R ztKO@*sKgqnXiSsj;p4-g^z`Yp4HDJz>C-3v1fc`sh@ZW72BT74L%q++Y|4|9pr$|Z z?1lz1DR6O9h4bFSypp)Qn#kz5-bHC?^zuMzQCMG>%MT?gTSwmgoDyKHQk-(A4|hG! ze)su_XCB%?jL%IUI2d<M2(|Vn7sy`d>Z?oe#;=v&QpE8F2k(rzV<iX#I+_@Vv8FKa z1QCdoYV-7jl-R(9y@CbR7<L6?Q(ax_cbjQ`i_42De%N8r8n3S%nyG0PHO|J30p#SK zt*RJ2<5Uim!Hoj~*`1MH;fZ0Nt%hmn=)4Oy<B9DqjQeOV6oW@eRJcIhGIGyFYlVfK zTB&tSmxVpS;Mrb(`LgMym9+a1F{a~Kz-tw>qqV!9;=kW?Ft(4~+LJ9+Flx!7N_t4d z=V1U`wm#Ktvp9TeST-jpfdWiB$K3+#Il=9&%IFs<66=?zq($nI5Gg6ZL&Dc^DQ#*c zPn%WN=ODi$SlC<mN3v0-6He3KJ|Ufa`laf<0RKQf#@8uQx<uTp2exg9Z~y)X`D1=J z9x+{RR!wZYd(P?1<X)Qi&PlW0>Mwt`uVWZ4GY;n}Zzo^W;Cm{|U4o#W@5&^r=M4K_ zxj8lN1j=sgbaTR<m+qG&6AWC?>092Den?g(vsnnM$EbYX&$;_OJ_JfXI$_Sxs3;s< z;o!?q_sVoqERwvP)}hkGd@G22qyW55r)r(ek#+%s&PLS(vUc8|v6km9sD?I%+b6I$ zr-X+=C7c}~kOc6Q($eCRJ;|tzEVT%Gekq3wh0seZiUCfY6Lm#>Z%DI21)fglbzC^o zHa^hLr)Xo4!MN8#Q(U3$p1ydr-($p>3o772<GTvCapDM1%;-SUgBX4WHvYWgVw@}o z+}3T~eF?Q8eY9`6pe`>bj|o~APkLBmvzqIJIQ#~s@TtEn>D+(vq_qUtRW<z`Ojjjw zJ#ch>xnEYtY`H~)VDkQI0fTC<_9lVGA3s{le|>%lKevP*sxUZ~R|fCSt*#XbM6Fho zm!}>6*e;9LMf#bVnQ5nsi5FUgSGYC7f|_ALW-2wiD^r6PUpx8L8_xX6BIzWD+puT3 z<#eDe`|}4Y<FvrdI+NOT*mB?AA!rV^jeXBBSmVUDh+9~l$HvE!2MrNcUvx5zl)jp# z-}bF@*40yl^YGYnw(Yigy_}2~?eU5Or7w@%t!jg(DR3*NTboYbZWh_zt6UOX8a%Yp zq^{>S$Zvp-D2n*+F$_w}NXLzSwzC#Y39Fv2g@E>{cq}{PQt+ek(9ClalSLPESK5Yl zth0C~reyC`ue$GiKlJpu-8I!|#3tGR^*24>z0bnn=)79ka*>Itonv|`%kL<@m<x=q zgylo9x-7V3LBbKT?>qj*cLg>px<N5^6-@&{W8YoT2HN~M*up$^X&yU<8b{hVFJIJH zTE|rCbsqfmyCg24c=UNiTVegjnt6OUh?JSuf+YNOygN}Jml{#%WBUoZD8R=j<8fV~ zMuYV0)lGY*@#)mH9t8gKlnQt38P0PY6OgyGAL=ekKK}hsff=tR>;V1tn+RuHy*LkW zH(2Q)Ao$|=MC#BKUsd<_PCZPQ*$OXJZ1!AHLUZxOVJG7>^0e8J-U__@{Ng;ay#uqe zUq=uY;S&QhfqS<IDRQ<;bXM>}51$a#H)p7*O)8(PfEcs6<w@~EiO&iHM6ohOwusSQ zrVN?jTT)V;y@<O<lrO6tIdDw$sP*U8@Dg*w8J8l%7g_@YF^c;YDUIQ}1=H0oTdicM z7=Fgb!^34<G#B$RQ>er>MxHQll+ohHLyiwTtXO@sB>1Hl88y?SQb+%(D!a{8$Zb}v z=|JLj;CtPIrnjj#)3zd)V=aR`o#J3^22z6ttQRCD#nS`tlDYJBzo2KPYRwx1>mOvg zdyznurt>s~n3K$Y9bw2ho=t54Q7Li7W49c1bcW&ykZ6u5;4DD=wf#D3buw%41P>FF zG8>}=8g|<JTiLEu$HtA!F{iL@-J6U&(H)&_K2dm7b<mys;8)w5?OPx&GD}<)Sk;|h zD1}#5S5MVK_Iqq;AV-W@Q5(!tSay$UJxuc6UV-9MyJ-XX1QKdbvLrthGjU$V$5Aqs z$M?$mV!1+ZXMAucX*HDBBDj~?7!)5v(&f#7CW#}-8pMsXxO!{c>n*j2dTF$;FR=uV zSI{JXn)DG65*iZ~-%D#h+uJ_svZpsFD=nSC$mE8uBTmePpwVbcOIjHp+)%YDhyAq- zHA0<Of$O52_hUEb1UwL|;IeG|T&8rbN5ztgY@ERY8|_VSop~tUb=s-%Z*z*^y*^`Q zkpiY=4K_w)F*s7*ZxNxL5wJ_^#(@!K;5a-8fd|)X*9Q}(1{DP|9;msxTDrRSR3j3E zxD{m<3clO*Q-q{A%ANi+>AQ1?i0KVZl+O6@C?LHCCmT#!RFx{ha4_B^kM*DOvJ3E+ zq@tpZj#{m;#`R!lg-Q)y0Nt~<7l~d;z)J4u+u;m6BWB$NQz5!IIeJCA`LVs5qUTyj zWy_Je{K{B=RZ-trDZiM_@tfe*fFDFCJtYy39nSLGx>Ve=tV+gwfEZCzZ_-vUAX4ld zoA+sTYwH_pTud509nmDe_30MqvM-o8$xNP_g^#KYZ#n#YpvuDoq{n_^bZTepQC72R z$ZA)@<{PM=YIMre{E#oxbl7AO)JZc)wGtET^jW<4V|Uzo;|>}6WWM3F6lAtcXJKlk z7Bx=kB6E+1^BfMNr>!MAnW$s~$==JY=fxjA+fyE{7l%uISy5XasB##U;VxN?r-kqz zNHUGqG*?ze($7C@k)nSSSW-m(qv$J{WxA+-&u;RCbfr+bb_3>P+z-%R0no$(L+$kA zS-{2_qmOaSAWdmwTcT0z6?VJt*ZTTeuXUilB;}hLagP?Kj+dA>B*jm*P4URoXaLLC z>;M|=($h+>b||1{tDjE_y`(kvdW6dmUL|yxnGk-?Xj8rOSf8CVxCr0o<I~NDpMlKd z7{Fx+ok^DtFeg9teUQJj8^bzjwOAPm^>Y)3yy|sjW1X(mpt4^7{v9_`)sRvEeF3sB zHk)}Ak|IumYmv^A;5KM2XeQw>kv~m3W2>lwIQ3`P1bT{}@pW;^I6|L~PP?>XcTrOE zZfifP;L1}TY=XT@QE@R)jAykFO>6h)Y#2Rh5pVJQpa&B&rC>_sK}1DVY&j&s8vU|! za#3IITH`5wigA0B1sA#TJ&TdG!@vY`2<|7yFj|t;+#K?$?AOzJ7ApdgQLi@21&5Mi zVVQdN@jI`0h7O58B{sI%k3`%=TvDp5Yf!mYU0n9qd^}z0Rq9$%WuEqBXrq(=ah$JN zLi0nL#QDXuxTS~I1?-G#YJ71rZB(2CY0@T_XyeiKE?#@ZDIE$#1c>EUi~5Q*lWlng z8SuwpDxYj*X$Y}7s&p()6x9}ISqhi#(3u{)(s@Cjj-vmxLY}Z^GU9C8_(~af<3`*v z^6iI@k8T3YG+DyUV^_&@S55HCwMp++8(VbVTfYEmVWbEg2>Sb#ZL|hbZ*wE~mhH9K zOXUXpk*Z6CU%whWa8A{)l}LY5{1F0%Rp}Lj>Vm}5R@*ye>{z{tLu6y^$of%LtbdJ- zb1EXGv9@-wzY0~c8W*|D;8j`aYK~l5<)9z?6c>2-{p}+H-vCc~tO0!4(DEKq4#Gfx zxrlvntt%78m!oSJs#IcqaTum@2v6u+VNjKD?Mh<kM3vgb2~Q-mG6t@-Y^HFFhTv(K z<&GvR?0-?z_&S9}vowM_Ml+7Rn|~xr`v^=|^)=?1LGCyyp2N@SoYy*i-b77pFRSP1 zUYV*-p`YJ*r`)chA~s_RP4dvXDKkcyHFiJbR*i(>{8>v()y%trIzPXGqZZ-5LE#kf zm9>>dKUb)P!{zau&H@|No+W26ff+CGg}zcOGcqxCTEh*mH`!$0&w6Rl@N(bC#;1Yo z_vTjM7v)~2em%uj1SNUk$wki_PQHwkf1WPba>q`br!6SZ&x_{J8Mj<u+aGNZ8!Gi= zk5UwIn79dntp2PM;$4)PEU)!@<ve0Z<$>KfuVQ_dR;sKg(pq_x^|IL2B06TN4MTWc zFs`EG3NVRjZmb1a6N`ka?&0#M?h(5h=Zn0%EO}8K>%EG>#Zesztkl#rhYGiGh{mJ_ zo}cKCbL3n_+{=#a;X{QR{*n%l@XU*cgM*oZrg6yoI&iqcMrtYi&Q|=~K56Y{ioUsi zHvUP=(spm9q^;Xyqa7Hk3|b5_BxdLcq7_puWI&qC$NXL}nwPQ9iqlN3_oCTlz}+}7 z8P&$0e+M?W)2F2v;@Ax;*7V*yy<?nkykcrWlg>d?Qx$4;St~=%)7>ge=%GH}=yQ2l z%9zUx!%Zq^uXd$Zz?Y;jk9`;+n=~nHl-zsLY-=sYyb+iraf5u#!MJxEL%xl>-;+br zZ6pNP1BH51zu;}z$Sa2E7DL6RkDPSLEmCXcR>k}bWIlUWE#EImdLTQV@_l8}_{6ar zQ;Mx#p?9%?@bdxZ*RQmwnuW6lUU%*o%M;H<W9jHLp-MTrXE=L~*sTsLL$dVH%jXx^ z^{uMXWIVRJo&%F`-uim!8}02_#>4dyH&m&pL-tOiTAUo4Q=qM3PGKs4+F)q|w}ZX? zk)MJ@%*e+_jPYa#eWI<FmanPP>)IGMFvd{d16zByb&ksdhrwFB(i_f$!4%5LwPh6* zx_ogY_+ZOh=X}5GVDQKItldiY(}$s@quJCel~UE-)JEAWQ1UryFU5R_FWD*a_hMK9 zURu)7y?Y>E5%ris$s;ijn>}zni+f(L-#x00D&D}RY_qLU&(p23iTKw|cjW4gvqOvo z42}|q6>?+gxp?QCt7SeGE_&tEvzDFio}D&PJbPL0lioNUM5kFzSaZr=A*Dxs;O_94 zCY(D}+Msz0>ND`<r9phSQdm5!xZvDn;za3KT*Pdgc<@pBtNfaC=c3QQbJ1pvGJ;>3 zDF9m%K5bj$s3pqeEA58~`VbT=J-wm!5JolZA$P3n0tnNi9IR=nQ>uQtN5&Q2t*O+N z-A~0RyYrQA=;xYWwe1g0i_bW5<ap%>CX%5ow~Sk0xxj2Em=GTN(!|8X*50-dF4-8g z5#-_VE+izY6#gBQgrIW&@)7oNHO)SXnx<FROGKA*yo`E9Pt4bs*}iOayP2Ibteyjv z`w^sRCa*BHvK5;9mx@g(Plr=+@*z*#wB{x9jau74xIpF_!x06F&U)pC%d`-qct)n$ z$Y=wrN%rZ+k+#7&f~tqkPzHa3EATG^aq;8ZZ_mEdAAP<`p!uZ70r$nd&S|W56CE~r zNR_F}d*g{w{dC7Od)+9X&t;v#)g=$NOHw12we0O}>l^Ap<^AbcKCoeU^uv4SvjPyQ ze*T@SKRC|S3DbxBb1NBuZ0zBrM+GJCnVOiK;f!WeFb;6C0cCmp6{eMD+1gQ#WPhnq z|0_d3)@!@hXLiR+%eo_$8wgl?2!!b}<0t%hNfAp3Sc<(&!nfSc&w^wbKmrYOBHtxm z&jyT{-#82oZU#F}Mf^DxNd8#iBed{hRLV}aL*TWXwRbVhzYC$1KYCq_3;Ds!vFnic zqtjO9Sss4>K5K(=b&xk#-DhGVIT}cx{odf#e*Qq^T6A6mzPs3AWvX{+aRGR5!6<e6 ziLGec@US!X+6AiE*xtqSI=K6qiJ)=zw)@XlAyB`I7kS@!Tw+jSym(P9RJ)-`@so!Y zWFVwAraXr1WRdjKLK;XPhm`lBM3&2wT+=gO#l;saJGCsrfDt(MS1YVKsIb_&|2caV zNsLc?N-=E<j_YZEaS+6L@1DLH8$-g>G*Y0lqNYU7K%VOT%j#9#LW2Rl8L}?<&r-`~ zeRK2cp$;PorVCsyvTgZH4gQ?v2c!g{>k0AkRGdm?FT>-TM>a{QA8nONufAQH!>T5F zdR2@J>w06}R<yJOwSQb5HqE}@U>=)ua3IHdFFf&fQe5BVFy|sZeMc+-kpKYNQ2OGj zs*$<}_t1|kBxG+oRqS7v)I^@5O@|lXaQjA41Lmdmq_*`(NzGnngZYfr81cO5<>h7U zhuo8c<`>iq@)Rz&NHS-aOZ+@<#6l<@#t>GGN-UZMLVu#F^Wcx%K?Tg&mPv+w;LACg za`kHlf0WL%mksRSWT7%vx8gs<r{2DVgl(NZ1}R)ZI-(G>LxE}Sp$`F2Wq=vka{l&l zQ@1#4(qQ3cOP~o^$>QnMxwzQ(Cf!_9HB!Xm@EV(J&IoGTtd^B=PRW6u$wHWS5j_`( zW`>6M`%5zr24+siUOOWTrIvKEI;N%#UQ^rzwHvpJa)ctM>tRQE2|X}N%CKAO!_Bqz zM~Qwvz6EpMyYtBXp?NK}p7K}I8b=Pn&<9$#q05*VpGy~cK@NHo2*5cF$&nVG!}Xhr zjx?NqgeaR<ISC#YLXYOq6pjG_^;kMrJpOcF<$d)W&%tOU3aP3f;#?(4T|ZX%HZakR z^B$tBCewQEVy-VJ!)K(;`srRLuPKBGJN!BrKL_UYc3A)!n~<KoH>{_(Ja|}dnf9dc zX;X*cx^lIv>jnI5i7PQYD*0neL?&+NiH&oD^`I=_b;ttQZ;*O(>y0;<vF0uQM`5*~ z8s>la8aF*7d^O)xb-Mgocqsi`aTcH7-YDpexF6LV1zR&(?aAhj+w$ELBs{8RvyrWR z^UBi$V1;c*jj~A%GNXnFkl_(vkN48dq{3cSJC8LjZu3}y9Ap`!GmcWafFoODW3@0h zpO$Y*4y&euToHv62eD>EKUYkH@8Wy-V|P$60t)l{Y+BM4lKIT^6hQH0A9uC?xW{3o z=wsAm2lVg;bLVwj@yD>N>$kF@Omd?*D6)M$T&6g4k3L!hFGU^WI#2YM9-4G*8Kw)& zxp;;(J8TrlYb(?orAn5UmTt>7=Buj9XXrPpCYD$=7wHy&N_9|yLR=hgJKbnDcR_Vs z4pIf{?YJ~o3^0Je?JM8fI{m=I0kaik8b1J(`%!0MOa~X&Gi)G}m%B2IBo=<_P&BG} z?Y!{)`_4}rZ5K=A5<pz0Q=LJY{}W^g+gIG@je}Brha?nlI@Rr;ZTV=uWo33UGfYY# z^~qUdmMGK&7S=Wz0g~46H<y=xtg+HF3WPq8gUWy~;o^Gy*oIqn4y8Enbu>3}94=q1 z%qPx3Np9!a-+gc=g5*LPZGuLdh;eTH+J582Gy^JppU?3g>m?flPk@<f!#mI7f>N+k zQ(S!g1(ZQsTblsad$TfKY&O^uPKRFwyM?L!@T)G#XsrQ|Qv~(CtnNI=(bwO-@oO84 zs#XP17G(LM>G3Mk9{?ZlM@UM5gu^ZGAGbO01qaWf^*SNN9^%Ik%^VE2M~5GQm(>)k z8VXL;yHxI}Mq`2xU4Kka%69lh;HH~5W7M1~JZl>ggc8X+UZpa!joUwGkgDs4wwOHg z#s-JkQsI`35|aco0ErJ`U<!m|WX*ZHa{Y5Uj50nWIW|p#l&}t}S%ZMqA8lR~r(<^Z zw~*-`Mg{sz?=PSf)g!Pm?^8kKzIAvfJh2YscY@arcVVvhqV>U48OvBXh`y=mW^as@ zHh>2K+z1GWDyo=#e@;(<mX~4X5QCfi;tRDIEom}aCX}k3oYy+eT@kHu9&VYLVi-u( z&FJ9sR?6?Zs}nn8|LYWO%8{uJnl`ea`k=bwa`n)IsNz{w^R%11yb+3Jc}3NVWp4I@ zZpRPsQb$Jz_bq{@P5I`1MYHT&fz<s-oxvwcuWoDwLl4jiY-y>K=dMV*cXd@zJS8VD z`VG4o@L%og9@ty#bjy`LOa+t&#n<}@NYz?55;0VqN8)toOZnr%OE<PBU~^&)0DO~Z zG<YsILvQ=;JdTKWeH}Gaccp9zNVX<lN4}01O02Z+90T(apwgsYPLJ*FGcqy&U>oZ} z8VLIl3dRyUJ2(p9k$vofUmyYc(H8N*kB$zgS4h5l8(AC2$u>)Ud(n&*lF%N06cN43 zjLwBIa9B}Ns)l_MA=^!&M|g<q=*;443x6RIqc(Zz+Uoh<r@RbdQJ%|0K^NqLx^a#B zK-33_%cPGps%>g^Hq$e~aBtBh<;#l~0M>N_7^iGo+o`ZyUOqlXXAJ&A%<Z+<6@3mK z&}!64BEH3GFeyNf`q^QW$CxS}U-0PWux{x(rg;Gsk)?x^DO~2wN6}gO(7k5HAIHiG z5Gy0yjBmGJE|g?0Eg#)~g<t@{iN4i}ovq#Vba{*YDO<3=-vHI@7Qly+YpLkYp7Ze8 za`*9y?JnB%^wQNU$p8uU#2kgKurKqvKzw}i<|xlP5r1^YxR*-Gj|BA95F_FB$(r5y z-RxIgHKQ}1R*i(=#MTt~{j<)a4N>8FMmq1f2={vq<z=<l6m_K~#fN_<{muM&N}0C< z*4(!-!X=O(OO$_9iZ$e1p~_z^+HceN)G5mz1L%bv<iffIL901=E0r|Q0?tsMfo<*@ zh0&Wy7R^*x3!eI7^5&0|+jc7FPZ0E0^J|n|r8r96j`>4GR@4Jz89*ES?NI*1X?sz1 z3czeVl22<SIAfWvhTdj|KN~*r*z$L@T?I1-wrOl=cN%=$**luQ&T&5OX1^?{E|dVc zCKzb|S5)*6!jIrq(6pIvxbKJM3$62#C4Wx0_;BHb7iVlYh$_tT))mtoK!ocuRh2F_ zCvczl<e#A@sysb?qXDJ}8ElE;nW;}ZoYKZ@X49VV+UV18+o3$2K=vCa3KmF}=n15@ z-@F01%4deFhNTZQ)y@DK2$-ZtB2uD?HG_kLO?wC+v*_fQKorY5o)9qsb+Vsp9>+xE z)@MssT8~Q$0;eyZ_^Si>j=TzByTI#j{Odn*p8u~@X?!YIJ_Eoea^*Kt>F1B3W{}FG zNjTXKE&pROw338TNBYFRcwx<-D4Gb(!3{MYeLrs#O26JjG`DmuakSH2SISkJE0aiQ zP!D;$F)jkOGl11O%~r%UHim<-quS{FbWE7)L3}#I&WRrP1_)fgwYFhzbxFy2rYU$N z15qfKIgm#9nxxm6mYRkk|46}>tRl2$H8txkYwmO2b9C%(bZh#Mk+*wRFt&TvpTt0? zElhwLk;@%0CAiUkpcN3geN2X01^`$!s+U~|3dZQ?;H2rSLc>Tp8{9FKnR%?D$RzZn z4|doFwWFr=DrPnSH#;Ny1CuT0$Yo}akNfkMgGdbs$pAqDJ_RaXaJ7fG^^70gNpeS1 z{GsIFyZx&*E1b@B;{M{|Qp+}~st1GIUV>^i!Ki7dX9IUv_<-$3m!G@)n-!FbS?^_r z@oHyDz6){jN~iM?B5BPW%$I~fMkNQGpRkTB6*nh-eh=geIW`Z)wgjBmDh2sTcMbcW zN@&Xj-&QCwive?zO!1=BqS@S<8>IJ!?_9#@!5)U4F3!s}=*61MNDdQw1oDlyOG<p+ ztBFs_46qS!O?N`>SQIA%ZjPR7VYXRD&_Mp2s1Wp#@VDNZeP4^s9Kq(vsC2K>r$DY6 z)_J+!JUuox&3%c{7IbW=z3W|6qRP=#(*gIZC#NLn3=Q1IEBd!NaJI>o%7e%{4rs~F zi2+&`DPRwPu9zDXWEqRkkiLEkK+)!p9^^+N5cFK)*RJu-t(CZ#i2?5OfgyM7?#^B{ z)o<#vF+A_@)MpByK35nzqdPbR1O<l@Ie6@s(_yEpj>F$d&Lc(ukfLj$ok_8s)r&}2 z=foL0?Tbo5#KWn@{mH^I3xI;#$ofInaMx<%fy{CLNBP&rnj-@Mn~44<9$}QBs`m=F z+{FnUhcmKTX}8C?<ep4248Go<aj_5~r$HT#W}kh0D~XdWF)6S5(s94j2e8HR-XE)~ zs?K@c4&KaSdoo`kCXRuxF81hM<C;<sTR6knR+|CyCr@6ClC3TKcopzF(V`x-%o6X< zm;~<iGpNp!@RQd0)P}{$tQVMxJC(w5WKxu$B5wu?6!huRKGPrgi=%f-A1RFX*jFdN zOMY76$+=qY<C6$)PWd+J*s|SasafdfLuclQXHU0iAW^#v4I}O<o0&B>O{b==t+DWq zYiHaBKuk%{0HQicvZiJ|XgjRA`72tFXQ^-R?o=V*4jBM<=(W1!gGfl(G3gUv4(+iu zc$>j7Rd4qD!ATevekkA_uXUMqSKz%X4>(8*p#GckdqZ&g_UMK_?|2D*x<Ptl`icvu ziFck5sF1dZ8$Ryd`iz&dF%1F4?QSyEmyenz%9~b?7-hQbDu2|HcH{kpfy2$OQWt#g zuj@*zadz0!QBn0L0`j$rCpWCx*`UPs$i6TwZDyxi&$QOjDEQs|sFYhy)7NXfYTJ=V zf!Mb4&DbFFAL+2gerklfm!F@PpBuW+2k@}L<c+Ddq9SVXon1;T=)4J-CdkUC49sI< zw~7{LEv6U-)5qKz0f51ynRI@%Mj0(NtDxBoORjO6Sz2Ci0WG-~mq>JHlfj`2(a~DA z0f2y40sAqaqOE<Ad}(sN{u4hph{SU`F0!oBRYw^vXQ?)cj(nlFy&so?*kxig*{#P8 z0dLyn`?1V1!O879MzUJ|@pQcD#fniZq|2Po#b?W8#;y&8vO6Ro{HqNaoIK6-YbP%g zo4z&KB2;q~T_F%7ViXAX;8#qk6=01oYFuKSXw*RV3kU(Ga2pf}u7cON(k#q9y*&9! z<s0<ulOA%1-VSo-pnV~F?q>b8T~A-0S*Yp<*ho=8BoLC=(!dpi+%qC0SF3n3fTqqW z*a_Se-<n_b%P3}T*g?{1S{6WJ0^;`aw1CKO;&$n9a{;6RPIJt;my&t)x+D|iuU@@% zF(f?Z92K=?qbC}0gj<`Q6d_8}@^}t$K*#9WDKK1^G^g^w_Z5Hw2vZkqP@sG2bl6#T zg@%HRqio(7@=m|Kk&uOehGu~-_=w%Uf(52Q9ss2*J+()pr=b3U)j0Z*dI()cZg4Dn z+Qx!ZM#A8;NW|1OPlk`Trx35uY=y^6`BzG>ib{EwTd!7!n>Au)2ZV(7T*g0UUi)fV zWm*~3UBJ)@#zl_h*3YBQ-z0G|d#C;+vfSDpG=P7|04E7pz}N+a_$HgIaS>VJ#~&mo zZzJOe_9$?oMPvX@4<vgal>|8=Ab38wT^ZHZ0|nw7u{gzUMhv9E9l}=~`d{bp#ISV_ z_PTt__ZVky2B|=x6altfp4W1OjoqZ1`f1c!Xb>x$t{u2iu#(o`Ej-SPu@En;8tsQy zZx*PEKY9CbET~nc8_BNe;38=i_*5I|WHYh#BB~e{LZ=N}H+u(qrptUs!+x}Z63R># zD&^<L!GX#5Wm8vw4XH@lpd@zq;z0xFXp0RHja+Q31}8m$2oy?xT<iFVN1blHN~xd2 zpQO`rc(V5r5Tf;Ue|hl-^4aGh25u?WdGWw6*;{I7=oG~IySoGCrmbQx41kjT#fy}v zq@A+7gmJ)XT^L9gf|L5X(E&^1!u9oypySM9s+M)KmS<sBp2=vuhV9cnEi-l=E4k3U zj6B>X%hrz2S{n7ryxIMUSa)&3fi+X^gyve1(7WHTJzqgdxPA532-BmZ0pF)nM8zQT z$|yexz9Ey5`be@Gx*m)r+OC)25DCIUX4^rYU+6GF#O=sZ=>9D>`MFGCAPjUK201eZ zwyU#C`0!)#m=rTd27+`GESdAuMFEf9yW)C}s?;gM&-r<KUQ+5yAtSx)wF;3<X~ACo zJvk;ONnr9G@_c2+?2m53QheEtK<B}+aOy^#J6@PQ-SXt~R*))69n=>dh%16NCwFge z;Ev!0CyVmV747xP`VEhlngFH@-&IcMWSMZTeJbyW0=B34apd4-K>gm~vN9zRq=Xk3 zFHDws{AL9c?zv3*F)FojOk}Onj8;q{!jqAx_k&$EIQStxGLq^2=uvZ$??O!b*5=k$ zAo0p~j?0W}<BQ*0W+aLp2cmuyMh-mWbBWt6HB=xt+&}xi+lj>d(YDoe0BNb2p9y*4 zD<LgZXwpoO5q3BamL81d>D)TfQZB<=ae23Xcefs(->NaJMP;&ujY;DrmMy<Y!91J1 zfkr-p*X3ckz7fQ8dalFomR@p^Nh%@q=h4KJLB*SqwO|&B*pJbbHW6B?s}IWatlZtb z5B5e#V2kS=lK`N_V9P-+0H&26<^eV@AxG+QmphoFoNcdjXaEPAbtopjH5*-=;+k!q za@gkOOC(<F)J!FOmFj4C`A$KRxg<&Kci6|$MdI|A9vmE2IFx;%)0%-2fbz<28u5!J zgB~2Al6hDWQLF7<xztef69fxtl}viB+qa6=G{7F`i?cx?9pfa_Y<*oYp0ecJ;Hhf2 z!RU&u*ktt_nJTv!`Y*Gscga-Glhe{HrhM7L=z)Ukrff_+8fkBDilwcbDh7+C$w%CP z>O33th;3EUMHa|IZZd`e=TA|RIuy`d;HvtT2oMw<#0NV)lYjA{jiw}(S3y<7^2qo8 z2QIbyxgX$B7YDtQOZj4GW)M-WbY|hmj8A<%eImnlg&C(@=4ViYie+E809ZuB2`W%6 zc3Gv6$JrE4>v-Hne9LToT1jwCrFB-vRE_h^$kU@GR*j!ZRGzo?_q0@%SK}_T@r2d| zF6x@xGUk@vNDZWubQ>yMd#<}+@%3_bl319t7n(xcwmjyI6BJrkkb&GwdTtXg;b-H{ zDSbEd5zzmHg}$`dBaH?`{(2>e%OW380BIs%7;P)y<RA0EVULJby!yb^=340OoE3M2 z0)3tsj?tAoZp}Pgk5z6?ZoXn2G!QJa!oxL^AG;PLz-_Lt+h$SQakRo`Yfp345Rx(p zq%!c}aPcYtiU8yWfKVeHK8O$MIf1O{3##)sW;dmnm?0XVpB|LPAf)c??4hS*fo2#5 zc0|iqS|2qR>bS9IyG3f^PpGkcM-4_zG6iS$*q9oOSVA(GT#shR9r+%y@xn=P(tt~d z+tSci(C@+K=;AU1lFQwavNaqVSJvbiPObFYg|0xb|Hk7^nmnvxGhwB6_=QsP8O{O6 z<iJ%s)35h6dt!{(>FJAvI(jHh6tXD>K7e)dUcdE_jLP3Av3@i8@QTEgIT4sv3OGV@ zGCge8k?;qNg&wDKbOYA$Y(OLz#Vp0UKRh<(y7{5gw8lxW{63(RD+bePnIG6M7@8Ia zPx-9l(|W8fG5)|Ps!gGfVkt`tH{JRBSxIX{J0ZYc0l<Y2kf`hxn_)3`7wFcizpEn- zExBU@`~z|T#jkb>;rjO(riZj^^F{?9B4$FzTs8B%J#?b5E<d-FdI$)hQ~-D@H7#U! zPnH9`uijg9w`WlU;N6fW`}|J3rKKO&Q{^w7N7uN7|ExyD$1!5yyycqv(I5p>di8bG z4eChmo#3IZ%uaoTKYwds*1|;(Sc>r(HKmxk=Eu)C2=crC=P9N^L)A|Xuu-wj?9c>< z59q`F9k37M)N@(}4($=WFkf$Xf&Ia*a)wc!p%EUyZ&a-Vz;Svy^*wNyp*|vQ7-<a% zEz<PQ&RWW_V8gvaiFy6iFe_7CF2WA1p7v(1@;jwW(SlD%S+$XcMVc9o_v0Ryjb_FZ z6H>hJ+udU>lkIIj1|)5mI1Wgi5^Uc~7cIVfX=?y02#9eg5LAJWUxLa)P5SwaeIOP2 z0}v{1OGiW>62FToy(0R6+xF#zY;^|6nIBP%{dp#kl}VytHZX&UZ=XEQK`AF9SEC^X z+#J_)TL5z=>$iI2c*PCZXs$90q!;emb#P3uoJWtfwwC)mO<_=7$2`$hZ1x2}Krho^ zuLJ#A*d4XyyHs&9th&5$%(=6J&*E~Q6k!={tVZ-6#zB!ih!@Ep3Ppd{R2T}St-N8@ zoAGIiPb;Wndh{RLy1<ad9-gk_qJ~r+JKtMuX_gJ;ylusxl;J&d`FqN{Rx3UHM+=`e zl%A}}Iqc7Fv&od@`K0&?elepw9Y)1D&)>|bWAB4MRMY5fwbN^#vxC_4cvb}+t;Z$> zUwjyoY`%|NNL0xg&AK95jOlffI_hvxqBUl4!qtg%1Z39b{~R>vl`OVmyTE)2NcMn8 z)9TLKs3^@lkAHng(mty9MB|aNAwy8{*nza}fdNk+9{`k^u+d98&Eq&OUk|<Q>7LOr zlyz5R@pPuS=p=-<V;_?+1HBaiNyH`;@;+^Bu{d5&<}>v$4e}hwubcc8bP`m6gs`}% zD3rc4hP6<x+Jk`uviiE+pEN-3lw*eOe`vOQWO>bv!^X`Ky&x2o><=0EiW#&?O#2a9 z2~hEAc{u<SYG`PH&a$UmSNQpKsW{ixB&>`A0wq3JHbvCNbksfr<hzb)3Mea9j9Rzz zyQ}-m`HI>5U)4*6NMx$EBl?pcK{~@W2510w5@D~6=rsP#Xt@B*&kw+8J??r1w0?-G z8_iOnw~8H<dG?r-fP?^L7PtT)>p+-ge_h;b&ATgtKAl-KFR|fhD*1_w)Rre<zV_`j ze%730z8|A25#~Hz+skfz7O_{;3N$%<U4u+Y_wH2>NjMztcSP?wn?7&ItEN7N;Dg7x zDqQw^^lZgU04dxtI}E@xaKaZAr>Sc7$Zh4&_;t+;^&CEyx66Iq47&mK-0#c#pd@fg zsjsiC+mi#t=WA2y!n3A&#bq_|;kD7=)QVhlVS$_ZYNtlBxM?_nnb?hZF|s=3&B5x> zo6EehdxFNjyW^E-ii?*tkPAwKSeJt>B@m-QN?hxP23AGo<&NL-b^4{Yezi7ZS$$vO zfhBNG%Sd9Xf5}pF%J5ZGhwb2~MteKp|3OwNG4K(ubDv5_(m#UN{OeDh!rZsGJ>O#x z#LECMNsuW!&U<-6@<8l~t>~IThC8_!th`XTdA-VuWEscA%csi<f-%*3_Vc5khFJ~( zTTl>I!p%tC9+9=7^a=nOd~S|_80lC|ExzOon1#i>JmkUl_9?GJdzt!%ppB-zkOqb_ zIFr8=^4Xo0b|4+lA+Z@*BJV1L9{n(SN)oQn`mcf5JXF}Iy8_=fv(Y!T`C%1f*Y+R@ z<#wD<v0p5eOc5qW)5xQi0$PVQ4)=|)8dzr6CET_ds9EThykFs_#khvsM~em2v+s&@ zoU}Ctvj=OeB>&<`SOJiA0<Pu~kff&zvLwzjmRN7!G|=nvg*C37JedhJEiPMOKkfnP zh@-Zgl+(cvpx;zg<>BY&2T09*%_b1e10PT1FI(+vf4xs)i3YiJsYQKJOD>08kax&S z;NMga0MydpkX*%$>GrJ%to1zK#Llu4LHjlxaBl(A6F_KVW1FCkqrD>P`|Fh`Pxbbp zvvJB;G2hKD;N}(6=U)LW4gUR8W3<eY%z(OhRn7q6p<99goC9`<u~Il%7q*QV(O<#F zX<$7Nfkd{6M$A<vBPno_G4N!4`R1~$=XCZp19?lIr61)5F^WK4?q>A+zriUqfR4hC zy1k{JpN#9h*uXfFbzJY3S~Y(P*34JUI83*s&BiQ>w5mh04~%NBi0X0^EXyRfO0C*Q z8oBjJU8BO#J<+v*OmK}r-<b)x5Re1`FcoA$-~~aoH39)CAbgCD?imnM18Akh4?in# zh60hl^8Gg#m3}NQr^)+#VI6#8H+1zfXS{K7OWN_(-c?ow3N&C5H`zav1wJ%pz+as^ zmX|RMbVP_%LoUm!k1|%cw4el+S=NJ<bWqBhfpz_$IjHi8gaJK}zHe}>00{y0HnTlH zJlVLxeSl%G1-J_i0~aYmgrVT#-e@}@FXjkGh$eq6-?36fn5@rIB~ZeG%^r-gK02G+ z=$9%BRiFCGa{5DDlJtJwdTw7(N9&LWct}8T%bO7%irjjnt7{4;2CpB|ZI3CO9RfDd zql#)+mz4vwct$|?P<O!Rx92HdzIg;M&@GTGGVxgU4FnW*gzb2-C4OyQ#(5ivn>!PZ z6oAfV+5`hiwPYg^c_&Xm9SrSIfWpueP;+R$inV<Vd{<}TwneU?W7G$@eDZmlr@HH> zAks&H`c0G008vU0J`1%3tN#owqyV?1W{QncK^{5f_sjVl{3;t-09gWfD2z(1ia`&^ zB6;Yv_P$SdMe3TSr;o^_ULdV=1TtK}vVqC-DAV-tus6oGmQr*1KSe{(+EPCM=@Z!L z@H6$rpcHB4?3Zt90!b+i5N>#R;%6GYIHfm&=IghSod*|{vN6BO7$|`S^~nJ8H!_BZ z13V#Vea1vmD7M3jOY!Izj{Pq%aBj{(Kl_1(CK?G{1}gWjU#>aXYm}O|0655v^i%w5 zlg|eL(<o*B{t^35fG7fq?V~|Gq8&4zxpRR{{fifJGYRS%%^QTgbrM!8U&TKZkz#f? zxD{j`exT6U2-1yPrw7Hd9Sq=ywdtURd(&y+5qD)nS}+jX?Z6sqAx*^L-_!rdcpHk1 zS_N3qEvI=GxAn(sDWRuJtM2!}eNxT?^DZ#*;zxT1a%86$?5ZWf=#iL{gEX?WZuKDL zcQE#U?EVS}^}w%(+`Ya1YRw+x?Fbuy=n6osN|sUp=L2|@Y0;X<J>&)@#O-X=9{TF# zX%Mcgg15E)!s19oN2m4g`2ZdTSR8&k0?fsDA8Qw<ago3eV0&f}k*)ZBhVQK@l{w=& z1v1A^#orvu{-Ql<=3C~Q>T1G%2F%_D0-gUk7v^Pu#m54yK@gLw=;x0t;R?bDQtbs* z-;ms>rFS&Uf1W5iYsh%FIR~GCvzw$H$ch85_mdNog~#15V>-<GrimJw-@9^{k1Z%N zW9wYyQ}%XgIHTJ+vTyOxoTFt>N|g!T9_!av4^gM_DmcShuTOE}j!!r5AH9+eKW_r; z*&n|>BU@WpAy!;m1Vl4YfPed~RvN%<Q$Pc58|&SfD3X@Cl3yj#nEd&j1~_Awo_^jc zH8m|u)@Nn1QhQMiFeQVByRzw3LqEqkkeT%V=|}Yw2&=`-x3qTfd|@_cfP5h_E{RiL z>4yH8;g}e|iKQhTXyAQajv$~#>oltsO(4x#R{-?Y(LY(P=?7Z@BURib)Sr)NPkbDE zur0=y<$X-Ne10)haQ65Q|FpyI-)>L)7gWv1nyzZCcRII^zvOZEU&rPC8^;y@BNfya zPJF&{C5ip`L;iV}U75crhVuvQ?|!;6=fBRcJ#K<Je*O3Db^qe}|5aDsKYQC9&8}+g z_c}7iU;IdzLTUc)@t?{Z<o?}*n*Z_6|JhgkuiVhpyCp6!9{vvwg#Nd$>+{q9g(v>c z?)zEyTS&(BzfatM+VT1S`-z{u2S)8p#c_Y@iO3Gn%L`tA8yFOiDaVz?q+|cv6Mvt9 z&jQu=*_2$*{{jB(naaZNQ?vj7Ew%sYRQ=mL`p8vJR6F*K1}}lj|I-%M%4`^`(o4?Y zF3<nhi2T!-Li4FQK}Y7wZzt&9e;mPo`t$$diHdl5;$okEICp&E#v*w7<5B)!SsVWb z9sM;HlE#(ge*BG}-~abh@$(CZb=wcFzZ;|fi)Q72aif2mVTp9b6eHpS^2c9lEcrjZ zUpuvyd8g=(Gp7Qm|NUnz@an(pJN~!h!T;m5{KvQDpQ%6PHZ?~f3l7ETIc&7U?WyJ| zb_<oRtwn^)&T67EFhTpx8Fu|biq$^%c1m1WdJd;JYdXOR3r^xtaD;h6tagDSkUQ?5 z4qL6z2QIT#LHGh-uec*gC<jM{!_kdL-@q9PqiU`3yn=%LJ;2+!rOai&1lSBTc#+c8 z;#k0-V=qQFD^HXwH*OAnq<;eJ0Dyz!nkR*6#baW#nGp)E9DY_T?F~4l)^(;X5StaN z46gOlT?T8wHmuB@XBjy@n^~sL&5Yz~Ay5izR-Pq4w3EPQ=AC|%XbzzPXU3DFSi~#7 z9JA41!_V0zj8kUaKTFuykR%5M2KoymlOmBB!i~rK^`D`qZ6G${Pj((_>daI52Egcn zA2~5#tkkQSoD7vbx9!YooH7_`_-kouy<qE`nAqN`8(d(2wzYK*94AuI3rqpd03Hsd ztW97!e4HjAbT>!0B#}hUHP}L{0`DdR@;-s+?q>v72wb}djMMhKoF8_cfFpahfcJ09 zA(qBWs<{4xw-~u2Z0k&?uN!8kcMu~l7x3ikOWGbgFJLwYRT5s@l;&&$rwRaLA5ZCB zR22Ui@UAP0z8_w4)l@LcJUu>YT-NL0&LrUni_ryOs!kXoS+)DT9+Ty<<y90Z!%SPj z<$RpslhxU)2?M~*e-~ISyG(rUow!jHY+P=Iv9!hXkqMm@Ujpz+oniD*%o0V9%<2A5 zZRZ)*#MZWLo^1gH0k;Jd6%YX_Ql!^tXi}9fEl7=k5FymiR03G&#fT)ZX;K49ZvmCw zLI;tm5PFRS2oUnF?eqQpj^q9FuAh@xvvSOuS!J&KJ}*PA@{sO~0*muW#H-Zh!_uSR zw8Cl!&>jAWnfEB!ZRoFUV2dsMuZ>Q0$j;ZWjj1{^fL(Prrb?|RRIGM_-cbzt_0M(X zT(TjLs`qyQ&ahDoJDA3cqExm5SIrLqd9#XsH+WngSmUBO5DmKy<8NT7<K;7YA-_rO z&L%uq1#=9!wAiB0Q}i9N2^%c3ZZ!yOr$4GG)e4SOdUq}*s)0V#U){U#cCzp@DV@`{ z(c1vn1Ova*OVAFdGJq`)2EOVf`0n=hv3qkN85b4+Kt{lUpu$bjt)(BJd)cnuv6{0| z3)sU8xfqHbBI>J*Ajf;%-`}$V*cfUYbCz4~z5L-K@Fya1vYugOI>X8(?=qk0ESetl zvoh<KgR1v0(z4>=7*CzwhUsn$&>#SL7to_s54Lim@_HsK;TbyX$r6ymt%0ab`j!g< z0rBkVP$LBGa4P^1?9BE4(g)*v>ZjS)Mk|q<$LcX-z6O<kx~DQij;1Sw*;8m1f=SDm zD8LIU<LDk5QfHD{+>7W_rPbJob3*m8k_+94Mi39Uav5mdjAz$MkFgmUO{m@jzVOqg z{xJx`HkqaGc&NY_@P&axcq76j!ymFg%qx(scK~i3kb0Ha{r7;2P9dbov=A7F!RmrF zuW_8=Yl|)5;%MAjOG>GKS)7=i?FfLRJ?cq<SJhC#KeL>nOn||hc&dD&>h<uu4qyZi z0;kghk4IJ(G{i9yur2GTUBEl>_4T!sp^w36k$^p3y5SeHe;lS3OoyDF5eBdf=Yhx6 z_kQhmt0H?la|;UxfS_!Ux}7XlsO{^o8-c&YbM_2haq$i-lXcY-*e-RNz{;m#^`jT? zYOVkTEXNJWFHL$jYalLXSh}TEOMZ)N8U`cysl#CD*GYD2R-(Uwb3IKC9@-T%`~jn% zvV4N!@y%W<EluAw5%e=J3KylHwi>llk*peq-+lT$XYtE`d<jgY#@&&sX{F)!bVP7r z|0@oY*mqy7<aqMaYs8a)WVkv4NC8>jUQSed-oz<>Nb#x`lMP~QXKd5&tVwGO`dxS_ z;abQE=v6GX)J`qTX~sOY$8COIi0oa~1(97@Te;3LnDsfXDd{c9kyn989J+L+v<zv# zy$~^Iy)x3TEYlF99j@iK8>{)|CAPRnl#`fiQ~M7{Pk1-z<vaMAULIp@UhQ^%Xc*E$ z{F=!N**qZ4=L~7<=^j&pyix={&Q&SY*U2MBsuHR*K#~lA9-FsKb$7x`Y;^~7&B1R` zk=3sA>x;8XHpVu|xWG*^wOrVOh@s8Grc}A71?ybz0)%t>Q3Lijvyiv|?i^Ic^$N#m z9id+PL<$FeW*XNn>zf<G0MWV6%gn*M7UU$fw!v+#i7nK8HufXd5s!0K{!LWY<Fu}< zO#5x9jH~YcuIXOsi$8?jYk8@6QC@ERp5I^gEaN%>^qOa9^?3iewRPN>ag>0a3?dTx zm_G<DP9g=&Nd7}6Ddf>}dz><7@}k9I7uxO13l;&0tGJ}3)<+m$TN@#=eVKpdopwaT zn*t%qU}WuY&f0*}0n|wS*Ri(c8zjOZyUxl=jI61JgzaY(J}+*+;62rU!)1_EN~1Kr z*B9h-q7;&L#@z8$9?cWhN8#B}exa~(S`f;y*+U<an9_~uhi8th$|I;95CxIowc#On zpGky`_+I#J?kMpNQS;JDBv~!vy*{Sca_^3B3>KHP*94guMPhzfb-vtphBfkKgi$N) zH$;*uOHiIT45CAM(<8Tgv85-+LE$0y^t8j`JZ+?!eFOV>d5XOt`)_UiD;jw|*`rV7 z5Y$^@ZfDHk<W{@WC^R6;aLYHy1rCN^es59gtItF8YZtHE8aL}+S~Pukf4m&zX8xM_ zArfX!E4o4d<Xkk`;e^LA-$w2h=b_Rmyf@TGHrGL_1Qkgb1>_b<XnF6__W(}+gxcCu zNu3q5+o~GJAW8)3#pz22ab^Z_G3-pQe_1oX*Ei=GdX?pP{x9|R@iW&HuOctKb$0ex z<-DqhoHl05E6p9iO%dQnE(vKE_BceV!{-_mJ#EfC<{?Mil**ynDU%P<pS=Z>E~*Mm z%iqFwSA*#DV7=8Z{a!<kbCzPG&u_TsB8eN*QY_}Lj#`5C+y#?bU65<nY}+2BotF)C zX(BAF@V&A8<PaV9DmUeMt3#^wvuoHXLH)Q&fA4EfeMHM8&a0hs)>4*YdhTf*uOCoP zM#gNjrz#y@4$`)emW%3Ls0pO%r_p-;$%|9Hm;DUg|14x+PKd|>m9bh+MZOlrNPLvP z-xPTG)grhu5|w2HqT{TG-72l{#NO_{-foB&S)b>u$K;V3B}Ro``Y?i03TsN#r%46W z)JH^~oaybby1=82IBHI(`Me{yS#L)3Z~_wyLxTRJn&(z)Ej#>{bvM&P8xPxQK5r<8 z7RQH%sKS0?EXN&pmx`hyJu@?k<T9q$S}hBZRQ%dYAdTd|ZI74XcInC)8cgH6lwEl{ z`dh^)b*7)csk^(-*Et&rJZ*QCbJHFiQ)=y@?n;j8r68SRVoW)I(bb{^#7Z!p-ailh zbxDQxBQ4F!%83=EOEtt&vou=;e0CKc@_5qbm$psN@i{CYULYell%iWWInh0rpb=R@ zchGe!r2y~{Yr?l6e?1oOOC>0s(ZPV@@9Ek#^_4M_PbX!d_g(D`Lw7xL8%A^=bN?+n zKG5oTRH3*SyEgb_c&F_z>rAU${U)rbwONVrt}HGuSLXvJ6=q?b`^3XuGW9QO`)B(a zjBt5+e15UDMa(*Bj_2EBN!>Hv<Z^`Y{2jT8$scW_6Y`Hr$M!;Aew2YbkiZqqvl{~i zYU{F+<Ne_BrJuHk*4J=<LEA}_)RCQ6lnLyqIEWNV++MQG(-z-gmv36}A@y^FVad<A zkFSqfMo0o97jxT)nD*)q9IBYsJ4vRPneLi_!Qs11=e{#({)cZJM`5pkU-TZYOfL7W zOkq9UEH4>-#onc?=gj8R?XKR3A|yX(-u93q-UIEKu6A*cMSIjPe&8NgTSxHz!K*ec z&4+pY)6=2k9m_&s<~g)eAkZQq2`^u^O*9erJ$g60;(hyeLGdkRf#scQyO7-|iaSA7 zwQdBl6#VN{T|>oAsF4>l&HV9mNO(Ml7l$qRH}z&SiYNrjnK^Tg@$AlhXe+ztozVFu zuR0q(%uFL~w)-Gw+tGmeLuR#{=Q*W7Zng9es(s(#*)#0XnJk>f`QPeFTwxBsGz%LH zCPp7W!}#f4@7swycv5Fg1&@yP>LJ@z2i7C5XjeD4P|x0jvNCTJ=Gx5q#=d|5HwPW) z)$sV&bL~pX%0>}Ed-N8rr$=$uAv&0`;o(8j5m5o+<ixsKTC$NFs<QRv1iQ)>*I?9V zI){PSrmu8@on-jed=b$`UxC`nTBEU#9*MdoHVVS-o=!-G>o@40^?7*$?=F%GQ^<|% zv)+TRe>Lb^CYgfshVpYO&BnyjJrQH|HGz9U=-SI;q}vATN;s|D{L%vb2YSh-DU@rM z!HAOU-Gwje++#t?h(u`Riivg+e5rr&Y0L{<f7o*1L2QS#^hD#l_+=rhA8kg9$ChQ> z%zQ1kV}>=LucE5$covlfdC{$RiVAKS=&6X~@q>kCR+WW~Rpd4ah@QYm`06<DJv2?Z z=sF@2qnnCcw6H|-r#Zqbt>V4-&BWbDt1Cyw%okiHdC}j0D96?`;RfWOPilzpgWidq z{YSdGZhCK{>uh?7qjG{S3#r8Ml!+=2c9wGz(P=XYQIE*Y&{q4*U#-kun~3rKjM6Fu zYB4<hEKoiMh8_z0`ci;T<S<fHR1f;<=ZKdt#rC6t-pxeDCMBj~M%2wn*$f5Lmq#)H z@foGl^rYfPWSiDO?N95G5m~L!B(B8&?7i^QtuB{DRR|6(``o@`dGDSPm_iz72ze!| z*!dHXYg0SB+{25DVCwMO_@Um%IkM~n-0!a2WLtTp*{i$7wDI;tN5$z^AIScIt$^<s zTwYHjV$tz~FP}C;2{1dW`14Ahg?IwLR1MZ3+kC`4CDj;Td#dlj)t~b#t<`06(vCwU zn?^I9pp=V?iuFMcUZq=O(}eLwMio`>11|k}rLFKE$)O4MI%a{NweV%L<QkPmV?KE) z2b!FakB<OaLmzui%1f&caUodr9?znvk5A_5P#&{Bk@>QZk>Ycg%NDdmUwD`WdX0TM z4Q0Z>6@RHMW{dDSNpk63Y9Eqlk9(Uqx~uk~A$a+Q5}&ENjJsX1z}6f+1}7~lW4g9Z zQq-FFaOD3-B$&i50Xq;_hmvzQUPw!yXDU96ga(DDsXiQgSXt4rgy@^{JoR&S_AVq( zREl<=)qUecTsya*?U0L;Ygan;=R@u%c|OW4%`6Fw^Y|F+#)F0WP<bFO|La}pHFX7g z-$^6j*~8hF)N3qnVEQ_;SI4;@L-Uut=LxvhW{tMw1MuZb>#7_W+l_A3Nu19z?Eva_ z3FZilgC;BUWHC6=&h0B{FSvV4w;^3bm*vNgipG0C9rJoz${tz8)RlZJy9p`U6dP_? z&@Z+rSaNQ?kP9VBRX;}dq@1aJeQvc{5y`^ha0DkcT73AYBxa5Bka4X1N=n&;3yKiS zk+orE*y|5O==)3=Il@Uo0jQd^GUumjPp!Gr+CB=_q3cZJLTis(XF_(4T~??S1xZ1I zXmq?{IsCekHx{+APFh}-Zu=w$z3*oz9^(GuyJC5gc#et!L%4E>v-6B}@n|xCXBRP5 z$@y=ynx`a0kZMEwUBoBW3vU(gT)K6|CQro>(C}e<-w*|1|DkUWTw3vr$w4ZnX1=9w z#er@4m%B!K=65Wo=olIKYDs5*ycU=Px5cdMO5!_7mgk@qr!lEUF{#ENUJZQ;V`pJ< zuUBQ*O=f)^bvpc9^@@O2m<4v&G<noC`A({s=nFh9JgK@gz)gR0-CbCKYRNu>6;46c zz9W#Z!Ae&?Y8P)V<fDxHc#4V&xSr&hVCY_f@5&b1w1>*Gr}C|weW-)2f}WlB<#U{V zJv~QTG=qsIs>AZHeGad90wKOv4wzQ3v2F#$%cN1#<(l?3CZx(U$|~lgUWHeM{Z^!j z>S;Qg`R%GgJAh5ta!iIDf!ylrj`s5dUp;sls)a@FU_;+py>Yy&?Y-Z@T(<?upu3MJ zp48T6l$+?8hH>3sv${a<S)?B?Qp?-xaxTvV^WksjUhh+_|CMkO3)4^JxFh5uC_CWw z9z2vPp%D?SO+M4=iNyY#vu78H0&K2FQDIJCvlpEideixHT^M{Qe+13p{-Xa`@$1$* zNbfy4=RK_gG{>)XAvrN8$@j3vd+7K!R3|SRnCA7EI_rGRL<&ap%}l#imR82geY1s% z#$@G3G4pUc9W`LF%*+~u?xol&rZsy}cBI6-wmH0dZky^x81wOHv_#7a;fn;(`zIsW zZhSM=k>zU<$}j!Is@WH7lMP4rPfn_Aq%wAA6w_%LY&@z19%=sahyV(Sa&3IB3|LvM z^P!oFPcgG_-W0QWT)e=&T#dTz@8hHJY40$d#1lqNHO%8juZ;(7QAb3Zzd@P!o>q;I zvQLj6d{v&3o35t!<A}1{29QM6L$;DoKShe{)HJMSz579s=h2o$Jp~B!aM#7FQ>5-o z5}OUrrM)LB%E)hiQWY<QJ9%!RX+o7B^})U~v$-8b#D`RD^PEcnFYc0R%)oNR6<G{? zd3H@OW%!}=0TZ9MWw~y_thHrSOh$T!uSwCsqlq)E2}!r>VQ819dxPJuW_*#f=#w%^ zf?u4UH1D#$jrV9VO2T`rRahBlx_;$lGs`vQfc^!|0xKD_imsko8;dxpujkGmPI<ZM z+o;<bc#uK@-QSvL|0GizU;NBjZRlF6W!^RPjBG{;%E5I>$)8PJK96HRbQwcmB^ANH z?=Pd{6NzuP^`jp(^<E^o?4Lx}q7L-aWt(^pV~cAu4T?zQ+o!6a>_&G3bwZsNb<<TJ z)ZUcnmY1AtwUzN8ew!qkX@O<WjW91Sm|%)Hn`Yk)zF_hK<eFYwd<Tgvtr}^Pj~MZR zDumi3-=DWNHvZvX3H;iW16Q8*c>{VbZG)h?Y0w1U{K~Vtwz+SlTLiXZ>l-*b?)vbf z2T^e}$|kqI%DrZOS9f>o&ny1QjWmaY3gHKmpb52I45Z1eYb3h4J$pTw4=jsVE~c1m zc$P$F6lKQJU%djO#B(XIzDrkoG30nYACtK9rlQ3W9pBKiv&B51_QHN=DakxrT!Q$U z>wN#_#_gEF;xvqUyTR{WmfhW;Pi^(E()!eQ!<!-VL1tLYvQ*p5$WZ&Ud^|ZcGrYY1 z=Nk!CODkrqjcWKeAs^AczB<ZQZ|b8!y(H7Tp%|Rf#HUZ0jdBoag5!yy8>0xMZs2Mu zhG_VHo14?$sE_-EdCEnKSJ#=^HPlMq`K(2yx&VbbpIX{Q!keClJ7Rx-6GEhZU1xlN zQ_C|I3Gz%zO-aJoam>z0F(aviXgvM*@+!9+P6_Eb+H?8b&rG6W>@M5xI*O1}qQ=j^ zx;1bfu$rZ+VmsP;H|Z$V5L%sVCZ7XaREUH;qMgXIyAE-xG4Q}UO-t*6y#OI#;M=RM zhsv3@!2HNW6!@zyq!Sp2#QkeWdY;E>{OFJWG(Z0Ry`|o}7H!Q)Wkn@POEFhMMM=pq z%=0*RxO=CfIn%^iG?k}%htfn3B<C<!Rmp|eF{=i%=9{E5;S8&hV{u@IszqoBl9yH% z+LLMt+t)q~M)CK6S4lw;lF~4zFmQzuv*fhQp-SrM2y3f}3fD?s*_83>lA5<i29pHd zMMI<`0r3!x3ztr7HYzfuRHg)4%BOL!F#2O-j5~9YQQ^%(KbWrdet%k9Obs>iv?t=I z-LR#g_KKXj>sbtNd5Ol9FVVf`!WUyGm72AehvUc8<-isKg%e*t`aIjAQ<Co3b2~sp z(>+k<9?V5aR*|^#Ds|AtfJDog3knJ62Yns*&K#J#>IS+avn#T0Hi3moQxn_G43$}- zSRWs+>e=neE53Rr>N=r*As!?Bl(ml5ea}K<DdGtK<tn|*ho9pS=c0cP#^lz8>sgOm zPDb80bpmkg*tZ9;AmsUwuzy9a=k0wjyVI(DJd#WkgAaJKq`J6x_*#0K4`P_1C)Kxw z9VKmSvGNVu@+-L@y4h!*OYJGBB`MZ;dQQ2Mo{i>UxLzLu3FYLL?*8Po7k7vvP<X%z z3}2cZZ=7UkHrH9E;ps;gy#77*obTm1=yQAR(lHBDa{=4?)b{oahk$?auIUOX#$NML z5*$%Ro%>mLA|9E7?gHhpOmp%d-Hn0aCi>42hUcKkKPCRZvJeBq-+#n9usGB_s98UG zV&IR4$H3Jp2?a!5Q2zfl?*6|s816Iuw-N(0-=8WBy#Lj`{x{A3-(2LMdised#@RBx Tr592E{v{nvLyZ#X<Cp&fecYnu literal 0 HcmV?d00001 diff --git a/html/english/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/english/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..946c6f53b0 --- /dev/null +++ b/html/english/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,205 @@ +--- +category: general +date: 2026-09-19 +description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: en +lastmod: 2026-09-19 +og_description: Convert local HTML file to PDF using Python. Learn the best way to + convert html to pdf python with Aspose.HTML, including font embedding and error + handling. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Convert a local HTML file to PDF with Python – full guide +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: How to convert a local HTML file to PDF with Python +url: /python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to convert a local HTML file to PDF with Python + +If you need to **convert local HTML file to PDF** in a Python project, this tutorial shows you a ready‑to‑run solution. You’ll see how to set up the Aspose.HTML library, configure PDF options, and execute the conversion in just a few lines of code. The guide also explains **convert html to pdf python** best practices, so you can adapt the code to your own workflows. + +The steps below cover everything you need to know: installing the SDK, preparing the save options, handling common pitfalls, and verifying the output. By the end of the article you will have a reusable function that you can drop into any Python application. + +## Prerequisites + +Before you start, make sure you have: + +* Python 3.8 or newer installed on your machine. +* An active Aspose.HTML for Python license (the free trial works for evaluation). +* A local HTML file you want to turn into a PDF (e.g., `page.html`). + +You do not need any additional system‑level dependencies; the SDK bundles everything required for PDF generation. + +## Install the Aspose.HTML package + +The Aspose.HTML SDK is distributed via PyPI. Install it with `pip` in your virtual environment: + +```bash +pip install aspose-html +``` + +Running the command prints the installed version, confirming that the package is available for import. + +## Step 1: Import the required classes + +The conversion workflow relies on two main classes: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` provides the static `convert_html` method that performs the actual transformation. +* `PDFSaveOptions` lets you fine‑tune the PDF output, such as embedding standard fonts. + +## Step 2: Create PDF save options and enable embedding of standard fonts + +Embedding fonts guarantees that the generated PDF looks the same on every device, even if the viewer does not have the fonts installed locally. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Setting `embed_standard_fonts` to `True` is recommended for most production scenarios because it eliminates font‑substitution warnings in PDF readers. + +## Step 3: Convert the HTML file to PDF using the configured options + +Now call `Converter.convert_html`, passing the source HTML path, the destination PDF path, and the options object you prepared: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +If the conversion succeeds, the method returns `None` and the PDF file appears at the location you specified. + +## Full example in a reusable function + +Wrapping the logic in a function makes it easy to reuse across multiple projects: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Why the function helps + +* **Input validation** – The `FileNotFoundError` makes debugging easier when the HTML path is wrong. +* **Automatic directory creation** – `os.makedirs(..., exist_ok=True)` prevents “directory does not exist” errors. +* **Configurable font embedding** – You can switch off font embedding for smaller files if you know the target environment already has the required fonts. + +## Common edge cases and how to handle them + +| Situation | Recommended handling | +|-----------|----------------------| +| **HTML contains external CSS or images** | Use absolute URLs or copy the resources next to the HTML file; Aspose.HTML follows the same rules as a browser. | +| **Large HTML files (>10 MB)** | Increase the default memory limit by setting `pdf_options.memory_limit` if you encounter `OutOfMemoryException`. | +| **You need password‑protected PDFs** | Set `pdf_options.encryption_details` with a user password before calling `convert_html`. | +| **Running in a headless server** | No additional configuration is required; the SDK does not rely on a GUI. | + +Addressing these scenarios up front saves you from unexpected runtime errors. + +## Verifying the conversion result + +After the script finishes, open the generated PDF with any viewer (Adobe Reader, Chrome, etc.). The visual layout should match the original HTML, and all fonts should appear correctly because they were embedded. + +You can also programmatically confirm that the file exists and has a non‑zero size: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Pro tips for production use + +* **Batch processing** – Loop over a list of HTML files and call `html_to_pdf` for each; reuse a single `PDFSaveOptions` instance to reduce object creation overhead. +* **Logging** – Integrate Python’s `logging` module to capture conversion timestamps and any exceptions. +* **Performance** – When converting many files, consider running conversions in parallel using `concurrent.futures.ThreadPoolExecutor`, but keep in mind the SDK is thread‑safe only for separate `Converter` calls. + +## Conclusion + +You now have a complete, production‑ready method to **convert local HTML file to PDF** using Python. The solution covers the essential steps—installing Aspose.HTML, configuring PDF options, handling common edge cases, and verifying the output—while also demonstrating the broader **convert html to pdf python** workflow. + +From here you can explore advanced features such as PDF encryption, custom page sizes, or adding watermarks, all of which are supported by the same SDK. Experiment with the options that best fit your project, and you’ll be able to automate HTML‑to‑PDF conversion reliably in any Python environment. + +--- + + +## 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 PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [Convert HTML to PDF in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /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/how-to-convert-a-local-html-file-to-pdf-with-python/og-image.png b/html/english/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..e78bd3fd5f5a52f7b28f25f7722d6a0013facf01 GIT binary patch literal 43951 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 F{{tR$3`qb0 literal 0 HcmV?d00001 diff --git a/html/english/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/english/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..91d90f3f7c --- /dev/null +++ b/html/english/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,221 @@ +--- +category: general +date: 2026-09-19 +description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: en +lastmod: 2026-09-19 +og_description: Convert HTML to Markdown with Python. Follow this guide to save HTML + as Markdown, generate Markdown from HTML, and create an HTML to Markdown file. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Convert HTML to Markdown in Python – complete programming guide +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: How to convert HTML to Markdown with Python – step‑by‑step guide +url: /python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to convert HTML to Markdown with Python – step‑by‑step guide + +If you need to **convert HTML to Markdown**, this guide walks you through the entire process. You’ll see how to **save HTML as Markdown**, generate Markdown from HTML, and produce an *html to markdown file* that can be used in static‑site generators, documentation pipelines, or any workflow that prefers plain‑text markup. + +The tutorial covers everything from installing the required library to handling edge cases such as embedded images and custom formatting. By the end, you’ll have a ready‑to‑run script and a clear understanding of why each step matters. + +## Prerequisites + +Before you start, make sure you have: + +- Python 3.8 or newer installed on your machine. +- Basic familiarity with Python scripting. +- Access to a terminal or command prompt. +- The `aspose.html` library (or any compatible HTML‑to‑Markdown package). This tutorial uses **Aspose.HTML for Python via .NET**, which provides the `HTMLDocument`, `MarkdownSaveOptions`, and `Converter` classes shown in the code example. + +> **Pro tip:** If you prefer a pure‑Python solution, you can replace `aspose.html` with the `html2text` package. The overall flow remains the same. + +## Step 1: Install the conversion library + +First, install the library that supplies `HTMLDocument`, `MarkdownSaveOptions`, and `Converter`. Run the following command: + +```bash +pip install aspose-html +``` + +The package bundles the native engine needed to **generate markdown from html** quickly and with high fidelity. Installation typically finishes in under a minute on a standard broadband connection. + +## Step 2: Load the source HTML document + +Loading the HTML file is the first concrete action in the conversion pipeline. The `HTMLDocument` class parses the file and builds an in‑memory DOM, which the converter later walks to produce Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Why this matters:** By creating an `HTMLDocument` object, you ensure that complex structures—tables, lists, and inline styles—are correctly interpreted before conversion. Skipping this step would force the converter to read raw text, leading to lost formatting. + +## Step 3: Configure Markdown save options + +The `MarkdownSaveOptions` object lets you fine‑tune the output format. To produce **Git‑flavored Markdown**, set the `formatter` property to `"GIT"`. This matches the syntax used by platforms like GitHub, GitLab, and Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +You can also adjust other settings, such as `preserve_links` or `code_block_style`, depending on how you plan to **save html as markdown** in downstream tools. + +## Step 4: Convert the HTML to Markdown and save the result + +With the document loaded and options configured, invoke the static `convert_html` method. This method reads the DOM, applies the chosen formatter, and writes the output file. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +After running the script, you’ll find a new file named `output.md` in the specified directory. Opening it reveals clean, Git‑compatible Markdown ready for version control or publishing. + +## Step 5: Verify the generated markdown file + +A quick sanity check helps you confirm that the conversion succeeded and that the **html to markdown file** contains the expected content. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Typical output for a simple HTML page looks like: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +If you notice missing headings or malformed lists, revisit **Step 3** and experiment with different `formatter` values (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Advanced: Handling images and relative paths + +When the source HTML contains images, the converter can either embed them as data URIs or preserve the original `src` attributes. To keep the **generate markdown from html** process lightweight, you may want to copy image files to a parallel folder and adjust paths. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +After conversion, the Markdown will reference images like `![Alt text](images/picture.png)`. This approach works well when you later **save html as markdown** in a static‑site generator that expects assets in a dedicated folder. + +## Full script you can copy‑paste + +Below is the complete, runnable script that incorporates all the steps discussed. Save it as `convert_html_to_md.py` and execute with `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Expected output + +Running the script prints a confirmation message followed by the first ten lines of the Markdown file, as shown earlier. The generated `output.md` can be opened in any text editor, previewed in VS Code, or committed to a Git repository. + +## Common questions and edge‑case handling + +| Question | Answer | +|----------|--------| +| **What if the HTML file is large (> 10 MB)?** | The `HTMLDocument` class streams the input, so memory usage stays moderate. However, consider increasing the Python process’s memory limit if you encounter `MemoryError`. | +| **Can I convert a string of HTML instead of a file?** | Yes. Use `HTMLDocument.from_string(html_string)` (or the equivalent constructor) before calling `Converter.convert_html`. | +| **How do I keep original HTML comments?** | Set `md_options.preserve_comments = True`. The comments will appear as HTML comments (`<!-- … -->`) inside the Markdown file. | +| **Is it possible to target a different Markdown dialect?** | Change `md_options.formatter` to `"COMMONMARK"` or `"MARKDOWN_EXTRA"` depending on the target platform. | +| **Do I need to install .NET runtime separately?** | The `aspose-html` package bundles the required runtime for most platforms. On Linux, ensure `libgdiplus` is installed (`sudo apt-get install libgdiplus`). | + +## Conclusion + +You now know how to **convert HTML to Markdown** using Python, how to **save html as markdown**, and how to **generate markdown from html** with fine‑grained control over formatting and assets. The script demonstrates the full workflow—from loading the source file to producing a clean *html to markdown file* ready for version control or publishing. + +Next, explore related topics such as **batch converting multiple HTML files**, integrating the conversion step into a CI/CD pipeline, or customizing the Markdown output for specific static‑site generators like Hugo or Jekyll. Experiment with the various `MarkdownSaveOptions` settings to tailor the result to your project's style guide. + +Happy converting! + + +## 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 .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/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/how-to-convert-html-to-markdown-with-python-step-by-step-gui/og-image.png b/html/english/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..746baa0a9b8c7dfe2c9790f9821df8d08f5444a4 GIT binary patch literal 44156 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 literal 0 HcmV?d00001 diff --git a/html/english/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/english/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..062f2c495a --- /dev/null +++ b/html/english/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,221 @@ +--- +category: general +date: 2026-09-19 +description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature control. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: en +lastmod: 2026-09-19 +og_description: How to enable features while converting HTML to Markdown. This guide + shows you step‑by‑step how to convert an HTML document and save HTML as Markdown + with fine‑grained control. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: How to enable features while converting HTML to Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: How to enable features while converting HTML to Markdown +url: /python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to enable features while converting HTML to Markdown + +If you need to **how to enable features** during a conversion, this guide gives you a complete, runnable solution. You’ll see exactly how to convert HTML to Markdown, control which Markdown features are emitted, and save HTML as Markdown in a single pass. + +The example uses the popular **GroupDocs.Conversion** Python SDK, but the concepts apply to any library that lets you configure feature sets. By the end of this tutorial you can convert an HTML document, keep only links and paragraphs, and avoid unwanted tables, images, or code blocks. + +## What you’ll achieve + +* **how to enable features** in the Markdown save options +* a clear **convert html to markdown** workflow +* the ability to **how to convert html** with selective output +* a ready‑to‑run script that **convert html document** and **save html as markdown** + +### Prerequisites + +* Python 3.8+ installed +* `groupdocs-conversion` package (install with `pip install groupdocs-conversion`) +* A sample HTML file (`sample.html`) in a known directory + +--- + +## How to enable features in Markdown conversion + +The first step is to create a `MarkdownSaveOptions` object and tell the converter which elements you want to keep. In this tutorial we enable only **links** and **paragraphs**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Why this works:** +* `HTMLDocument` wraps the source file so the converter can read it. +* `MarkdownSaveOptions` holds all conversion settings; the `features` list is the key property that **how to enable features**. +* By assigning `["Link", "Paragraph"]` you tell the engine to emit only Markdown links (`[text](url)`) and plain paragraphs, discarding images, tables, and other markup. +* `Converter.convert_html` performs the actual **convert html to markdown** operation and writes the result to `sample.md`. + +--- + +## How to convert HTML document with custom options + +If you later need to add more feature flags—such as `"Header"` or `"Bold"`—just extend the list: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +The same call to `Converter.convert_html` will now include those additional elements. This pattern lets you **how to convert html** in a highly configurable way without writing custom parsers. + +--- + +## How to save HTML as Markdown in a specific folder + +The `convert_html` method accepts an absolute or relative output path. To **save html as markdown** in a sub‑folder called `output`, adjust the third argument: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Running the script creates the `output` directory (if it doesn’t exist) and writes the Markdown file there. This approach keeps your source HTML and generated Markdown neatly organized. + +--- + +## Full script you can copy‑paste + +Below is the entire program, ready to run. Replace `YOUR_DIRECTORY` with the path that holds `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Expected output** (printed to the console): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Open `sample.md` and you’ll see only Markdown links and plain paragraphs, for example: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +All other HTML elements have been omitted because **how to enable features** limited the output to the two selected types. + +--- + +## Common questions and edge cases + +| Question | Answer | +|----------|--------| +| *What if the HTML file contains no links?* | The converter still writes the paragraphs; the output will contain plain text without link syntax. | +| *Can I disable all features?* | Setting `markdown_options.features = []` results in an empty Markdown file. Use this only for testing. | +| *How does the SDK handle invalid HTML?* | The parser attempts to clean malformed markup before applying the feature filter. Errors are logged but do not halt conversion. | +| *Is it possible to keep images while dropping tables?* | Yes. Set `markdown_options.features = ["Link", "Paragraph", "Image"]`. The feature list is additive, not exclusive. | +| *What if I need to convert many files in a folder?* | Wrap the conversion logic in a loop that iterates over `Path.glob("*.html")`. The same **how to enable features** configuration can be reused for each file. | + +**Pro tip:** When processing large batches, instantiate `MarkdownSaveOptions` once and reuse it. This reduces object‑creation overhead and keeps the **convert html to markdown** pipeline fast. + +--- + +## Conclusion + +You now know **how to enable features** when you **convert html to markdown**, how to **how to convert html** with selective output, and how to **convert html document** and **save html as markdown** using a concise Python script. By configuring `MarkdownSaveOptions.features`, you gain full control over the Markdown elements that appear in the final file. + +### Next steps + +* Explore additional feature flags such as `"Header"`, `"Bold"`, and `"Italic"` to enrich your Markdown output. +* Combine this script with a file‑watcher (e.g., `watchdog`) to automatically convert new HTML files as they arrive. +* Review the [GroupDocs.Conversion Python SDK documentation](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) for advanced scenarios like PDF‑to‑Markdown or DOCX‑to‑HTML conversions. + +Feel free to experiment with different feature sets and share your findings with the community. Happy converting! + + +## 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/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /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/how-to-enable-features-while-converting-html-to-markdown/og-image.png b/html/english/python/general/how-to-enable-features-while-converting-html-to-markdown/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..846db8f9cd9d4c351633c4b9bb6835ba3552b91a GIT binary patch literal 48045 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 literal 0 HcmV?d00001 diff --git a/html/english/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/english/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..df1bb89bba --- /dev/null +++ b/html/english/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,244 @@ +--- +category: general +date: 2026-09-19 +description: Learn how to limit nested resources in Aspose.HTML for Python using ResourceHandlingOptions. + Control max handling depth and avoid infinite loops. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: en +lastmod: 2026-09-19 +og_description: Limit nested resources in Aspose.HTML for Python using ResourceHandlingOptions. + Set max handling depth to prevent deep recursion and improve performance. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: How to limit nested resources in Aspose.HTML for Python – step‑by‑step guide +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: How to limit nested resources when processing HTML with Aspose.HTML for Python +url: /python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to limit nested resources when processing HTML with Aspose.HTML for Python + +If you need to **limit nested resources** while rendering or converting HTML, this guide shows you the exact steps to configure Aspose.HTML for Python. Controlling the depth of resource handling prevents runaway recursion when a page includes many layers of CSS, JavaScript, or image references. + +Limiting nested resources is especially important for large‑scale crawlers, email rendering pipelines, or any automated workflow that must stay within memory and time budgets. In the following sections you’ll learn why you should set a depth limit, how to use the `ResourceHandlingOptions` class, and how to verify that the limit works as expected. + +## Why you should limit nested resources + +HTML documents often reference other resources—stylesheets, scripts, images, fonts, or even other HTML files. Each of those resources can, in turn, reference additional files, forming a tree of dependencies. Without a guard, the tree can become arbitrarily deep: + +* A page loads a CSS file that imports another CSS file, which imports another, and so on. +* JavaScript may dynamically load additional scripts. +* An email template may embed images that reference external URLs that redirect to more assets. + +When the recursion depth grows unchecked, you risk: + +* **Excessive memory consumption** – each fetched resource occupies buffers. +* **Longer processing times** – network latency multiplies with each level. +* **Potential infinite loops** – circular references can cause the engine to never return. + +Setting a **max handling depth** tells Aspose.HTML to stop following resource links after a given number of levels, ensuring predictable performance. + +## How to limit nested resources in Aspose.HTML for Python + +Aspose.HTML provides the `ResourceHandlingOptions` class, which contains a `max_handling_depth` property. By assigning a numeric value (e.g., `3`), you instruct the engine to stop after three nested levels. + +Below is a complete, runnable example that demonstrates the entire workflow: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Explanation of each step + +1. **Install the package** – The `aspose-html` wheel is required. The `pip install` command is shown as a comment for completeness. +2. **Import classes** – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, and `HtmlLoadOptions` ties the two together. +3. **Create the options object** – Instantiating `ResourceHandlingOptions` gives you a mutable container. +4. **Set `max_handling_depth`** – Assign `3` (or any integer) to restrict the engine to three levels of nested resources. This is the core of **limit nested resources**. +5. **Attach options to load configuration** – `HtmlLoadOptions` lets you pass the `resource_options` to the loader. +6. **Load the HTML** – The constructor of `HtmlDocument` accepts a URL or a file path along with `load_options`. The engine now respects the depth limit. +7. **Verify** – By iterating over `document.resources`, you can see how many resources were actually fetched and the deepest level encountered. If the deepest level is `3` or lower, the limit succeeded. +8. **Save** – Persist the processed document. The saved file contains only the resources up to the allowed depth. + +#### Expected output + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +The numbers will vary depending on the source page, but the deepest level should never exceed `3` because we set `max_handling_depth = 3`. + +## Common variations and edge cases + +### Changing the depth limit + +You might need a deeper or shallower limit based on your environment: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Disabling the limit completely + +Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Only do this when you are sure the source HTML is well‑behaved. + +### Handling circular references + +Even with a depth limit, circular references can still appear at the same level. Aspose.HTML detects cycles and stops loading a resource that has already been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` reduces the chance of hitting a cycle in the first place. + +### Using the limit with local files + +The same approach works for local HTML files: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +The engine treats relative `href` or `src` attributes the same way as remote URLs, applying the depth limit to file system resources as well. + +### Integrating with other Aspose.HTML features + +If you also need to control **resource download timeout**, you can combine `ResourceHandlingOptions` with `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Both options are independent, so you can fine‑tune performance and safety simultaneously. + +## Pro tips for production use + +* **Log the resource tree** – When debugging, iterate over `document.resources` and log each resource’s URL and depth. This helps you understand why a particular page exceeds your expectations. +* **Cache fetched resources** – If you process the same external assets repeatedly, enable caching to avoid redundant network calls. +* **Combine with a whitelist** – If only certain domains are trusted, filter `document.resources` after loading and discard any that fall outside the whitelist. +* **Test with edge‑case pages** – Create a synthetic HTML file that imports a chain of 10 CSS files. Verify that your limit truncates the chain as intended. + +## Conclusion + +You now know how to **limit nested resources** in Aspose.HTML for Python by configuring `ResourceHandlingOptions.max_handling_depth`. Setting a depth limit protects your application from excessive memory use, long processing times, and potential infinite loops caused by deeply nested or circular resource references. + +From this point you can: + +* Adjust the depth to match your performance budget (`resource_handling_options.max_handling_depth`). +* Combine the limit with network timeouts, caching, or domain whitelists for robust pipelines. +* Explore related topics such as **resource handling options**, **max handling depth**, and **nested resource handling** to further tighten control over HTML processing. + +Experiment with different depth values and observe how the loaded resource count changes. When you’re ready, integrate this pattern into your larger HTML conversion or rendering service to ensure predictable, safe, and efficient execution. + + +## 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. + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /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/how-to-limit-nested-resources-when-processing-html-with-aspo/og-image.png b/html/english/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..37d501f1e2405ea57bbd86747411828155a073eb GIT binary patch literal 49334 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 V^PTcM2t1urQPg}=EdMg_p8(&BM?e4o literal 0 HcmV?d00001 diff --git a/html/english/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/english/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..90f4396010 --- /dev/null +++ b/html/english/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,262 @@ +--- +category: general +date: 2026-09-19 +description: Learn an html to pdf tutorial in Python that shows how to generate pdf + from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: en +lastmod: 2026-09-19 +og_description: 'html to pdf tutorial: Convert any HTML page to a PDF file using Python + and Aspose.HTML. This guide shows how to generate pdf from html in minutes.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: html to pdf tutorial in Python – complete step‑by‑step guide +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: How to perform an html to pdf tutorial using Python +url: /python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# How to perform an html to pdf tutorial using Python + +If you need an **html to pdf tutorial**, this guide shows you exactly how to generate a PDF from HTML with just a few lines of Python code. Whether you are automating report creation or exporting web content for offline reading, the Aspose.HTML library makes the conversion painless. + +In this tutorial you will learn how to set up the environment, write the conversion script, and handle common edge cases such as missing files or custom page settings. By the end you can **how to generate pdf** files from any HTML source without leaving the Python ecosystem. + +## What you’ll need + +Before you start, make sure you have: + +* Python 3.8 or newer installed +* An active Aspose.HTML for Python license (a free trial works for evaluation) +* `pip` access to install the `aspose-html` package +* A simple HTML file you want to convert (e.g., `input.html`) + +> **Pro tip:** Keep your HTML and assets (images, CSS) in the same directory to avoid path‑resolution problems during conversion. + +## Step 1: Install the Aspose.HTML package + +Open a terminal and run the following command: + +```bash +pip install aspose-html +``` + +The `aspose-html` wheel bundles the native libraries needed for high‑quality rendering, so no additional system dependencies are required. + +## Step 2: Create a minimal Python script + +Create a new file named `convert_html_to_pdf.py` and paste the code below. This script follows the **html to pdf tutorial** pattern of a three‑step process: import, define paths, and invoke the conversion. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Why this works + +* **Importing `Converter`** gives you access to a high‑level API that abstracts away the rendering engine. +* **Defining absolute paths** prevents relative‑path bugs when the script runs from a different working directory. +* **`Converter.convert_html`** performs the entire rendering pipeline—HTML parsing, CSS layout, and PDF serialization—in one call, which is the recommended way **how to generate pdf** quickly. + +## Step 3: Run the script and verify the output + +Execute the script from the terminal: + +```bash +python convert_html_to_pdf.py +``` + +If everything is set up correctly, you will see: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Open `output.pdf` with any PDF viewer. The document should look identical to the original HTML page, including fonts, images, and basic CSS styling. + +![Generated PDF preview](https://example.com/images/pdf-preview.png "Screenshot of generated PDF from HTML using Python"){: .center-image alt="Screenshot of a PDF generated from an HTML file using Python"} + +## Step 4: Customizing the conversion (optional) + +The basic **html to pdf tutorial** covers a one‑to‑one conversion, but real‑world scenarios often require tweaks: + +| Requirement | How to achieve it with Aspose.HTML | +|-------------|------------------------------------| +| Set page size (A4, Letter) | Pass a `PdfSaveOptions` object to `convert_html` | +| Add margins or headers/footers | Use `PdfPageSettings` inside the options | +| Embed custom fonts | Ensure the font files are reachable and set `FontSettings` | + +Below is an example that sets the page size to A4 and adds a 1‑inch margin: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Note:** Using custom options is the preferred **generate pdf from html** technique when you need precise control over layout. + +## Step 5: Handling multiple HTML files (batch conversion) + +If you have a folder full of HTML reports, you can loop through them: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +This snippet demonstrates a scalable **python convert html pdf** workflow that fits into CI pipelines or scheduled jobs. + +## Common pitfalls and how to avoid them + +| Issue | Cause | Fix | +|-------|-------|-----| +| Missing images in PDF | Relative image paths that break when the script runs from a different folder | Use absolute paths or set `base_uri` in `Converter` options | +| CSS not applied | External stylesheet referenced with a URL that requires internet access | Download the stylesheet locally and reference it with a relative path | +| Font substitution | Font not installed on the host machine | Include the font file in the project and configure `FontSettings` | + +Addressing these edge cases ensures your **export html as pdf** process is robust across environments. + +## Full, runnable example + +Below is the complete script that includes optional settings, error handling, and batch processing logic. Copy it into `full_html_to_pdf.py` and run it as shown earlier. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Running this script produces a PDF for every HTML file in the target directory, applying consistent page settings—a complete **python convert html pdf** solution ready for production. + +## Conclusion + +You now have a practical **html to pdf tutorial** that shows how to generate PDF files from HTML using Python and Aspose.HTML. The guide covered environment setup, a minimal conversion script, optional customization, batch processing, and troubleshooting tips. + +From here you can explore related topics such as **how to generate pdf** with watermarks, merging multiple PDFs, or converting HTML to other formats like DOCX. Experiment with the `PdfSaveOptions` API to fine‑tune output, and integrate the script into web services or automated reporting pipelines. + +Happy coding, and enjoy turning your HTML content into polished PDFs! + + +## 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 PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [How to Convert HTML to PDF Java – Using Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /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/how-to-perform-an-html-to-pdf-tutorial-using-python/og-image.png b/html/english/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b884fc4fce63ba897cef4f75cb16e394195f81 GIT binary patch literal 45064 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 literal 0 HcmV?d00001 diff --git a/html/french/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/french/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..4c37f63d20 --- /dev/null +++ b/html/french/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-09-19 +description: Apprenez à modifier le titre dans un fichier HTML avec Python. Ce guide + couvre la lecture du HTML, la mise à jour de la balise <title> et l’enregistrement + du HTML modifié. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: fr +lastmod: 2026-09-19 +og_description: Comment changer le titre dans un fichier HTML avec Python. Suivez + cet exemple complet pour lire le HTML, mettre à jour la balise <title> et enregistrer + le document modifié. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Comment modifier le titre dans un fichier HTML avec Python – guide étape + par étape +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Comment changer le titre dans un fichier HTML avec Python +url: /fr/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Comment changer le titre dans un fichier HTML avec Python + +Si vous avez besoin de **how to change title** dans un document HTML de façon programmatique, Python rend la tâche simple. Dans ce tutoriel, vous lirez un fichier HTML, mettrez à jour l'élément `<title>`, et enregistrerez le HTML modifié sur le disque — le tout avec du code clair et exécutable. + +Changer le titre de la page est une étape courante lorsque vous générez des sites statiques, personnalisez des pages récupérées, ou automatisez des mises à jour SEO. À la fin de ce guide, vous saurez comment **update html title**, comment **read html with python**, et comment **save modified html** en toute sécurité. + +## Prérequis + +- Python 3.8 ou version plus récente installé +- Le paquet `beautifulsoup4` (`pip install beautifulsoup4`) +- Un fichier HTML que vous souhaitez modifier (l'exemple utilise `index.html` dans un dossier de votre choix) + +Aucun service externe n'est requis ; tout s'exécute localement. + +## Étape 1 : Charger le fichier HTML avec Python + +La première tâche consiste à **load html file python**‑style. Utiliser `BeautifulSoup` vous fournit un analyseur tolérant qui fonctionne avec un balisage imparfait. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Pourquoi cette étape est importante :* +`BeautifulSoup` construit une représentation arborescente, vous permettant de requêter et de modifier des éléments sans manipulation manuelle de chaînes. Le `html.parser` intégré est rapide et ne nécessite aucun binaire supplémentaire. + +## Étape 2 : Localiser l'élément `<title>` + +Les documents HTML contiennent généralement une seule balise `<title>` à l'intérieur de `<head>`. Nous récupérons la première occurrence, ce qui satisfait le besoin de **update html title**. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Pourquoi nous vérifions `None`* : +Certains fragments HTML omettent le titre. L'ajouter automatiquement évite des erreurs ultérieures et rend le script robuste. + +## Étape 3 : Modifier le texte du titre + +Nous **update html title** maintenant en assignant un nouveau texte à la chaîne de la balise. C’est le cœur de l’opération **how to change title**. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +L'attribut `string` représente le nœud texte à l'intérieur de `<title>`. Le remplacer met à jour le DOM en mémoire. + +## Étape 4 : Enregistrer le HTML modifié + +Enfin, écrivez le document modifié dans un nouveau fichier. Cela satisfait l'étape **save modified html** et laisse l'original intact. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` formate la sortie avec des indentations, rendant le fichier facile à lire après la modification. + +### Résultat attendu + +Exécuter le script sur un `index.html` d'exemple contenant initialement : + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +produit une sortie console similaire à : + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +Le fichier `index_modified.html` enregistré commencera maintenant par : + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Script complet pour copier‑coller rapidement + +Ci-dessous le programme complet, prêt à l'exécution, qui combine les quatre étapes. Enregistrez‑le sous `change_title.py` et ajustez `YOUR_DIRECTORY` selon vos besoins. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Exécutez le script : + +```bash +python change_title.py +``` + +Vous verrez les messages console et un nouveau fichier `index_modified.html` avec le titre mis à jour. + +## Astuces supplémentaires et cas particuliers + +| Situation | À faire | +|-----------|------------| +| **Multiple `<title>` tags** | `soup.find_all("title")` renvoie une liste ; mettez à jour le premier élément ou itérez si vous devez tous les modifier. | +| **Encoding problems** | Ouvrez les fichiers avec `encoding="utf-8-sig"` si un BOM est présent, ou détectez l'encodage avec `chardet`. | +| **Large HTML files** | Utilisez le parseur `lxml` (`BeautifulSoup(html_content, "lxml")`) pour de meilleures performances. | +| **Preserving original formatting** | Si vous devez conserver les espaces exacts, écrivez `str(soup)` au lieu de `prettify()`. | +| **Automating across many files** | Encapsulez la logique dans une fonction et bouclez sur `Path.rglob("*.html")`. | + +Ces variantes conservent la logique centrale **how to change title** tout en s'adaptant aux projets du monde réel. + +## Conclusion + +Vous savez maintenant comment **how to change title** dans n'importe quel document HTML avec Python. Le tutoriel a couvert la lecture du HTML, la localisation de la balise `<title>`, la mise à jour de son texte, et le **save modified html** en toute sécurité. Avec le script complet, vous pouvez intégrer ce modèle dans des générateurs de sites statiques, des pipelines SEO, ou toute automatisation nécessitant des changements de titre dynamiques. + +Ensuite, explorez des sujets connexes tels que **read html with python** pour extraire les méta‑tags, ou les techniques **load html file python** pour gérer un balisage malformé. Expérimentez le traitement par lots pour mettre à jour les titres sur l'ensemble d'un site — votre nouvelle compétence est la base de nombreuses tâches d'automatisation web. Bon codage ! + +## Que devriez‑vous apprendre ensuite ? + +Les tutoriels suivants couvrent des sujets étroitement liés qui s'appuient sur les techniques démontrées dans ce guide. Chaque ressource inclut des exemples de code complets et fonctionnels avec des explications étape par étape pour vous aider à maîtriser des fonctionnalités d'API supplémentaires et explorer des approches d'implémentation alternatives dans vos propres projets. + +- [Comment enregistrer du HTML avec Aspose.Html – Guide complet C#](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [Comment enregistrer du HTML en C# – Guide complet avec un gestionnaire de ressources personnalisé](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [Comment rendre du HTML en PNG – Guide complet étape par étape](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/french/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/french/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..5de7170036 --- /dev/null +++ b/html/french/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,206 @@ +--- +category: general +date: 2026-09-19 +description: Convertir un fichier HTML local en PDF avec Python et Aspose.HTML – un + guide complet étape par étape qui couvre également les options de conversion HTML + en PDF avec Python. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: fr +lastmod: 2026-09-19 +og_description: Convertir un fichier HTML local en PDF avec Python. Découvrez la meilleure + façon de convertir HTML en PDF avec Python grâce à Aspose.HTML, y compris l’intégration + des polices et la gestion des erreurs. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Convertir un fichier HTML local en PDF avec Python – guide complet +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Comment convertir un fichier HTML local en PDF avec Python +url: /fr/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Comment convertir un fichier HTML local en PDF avec Python + +Si vous devez **convert local HTML file to PDF** dans un projet Python, ce tutoriel vous propose une solution prête à l’emploi. Vous verrez comment installer la bibliothèque Aspose.HTML, configurer les options PDF et exécuter la conversion en quelques lignes de code seulement. Le guide explique également les meilleures pratiques **convert html to pdf python**, afin que vous puissiez adapter le code à vos propres flux de travail. + +Les étapes ci‑dessous couvrent tout ce qu’il faut savoir : installation du SDK, préparation des options de sauvegarde, gestion des pièges courants et vérification du résultat. À la fin de l’article, vous disposerez d’une fonction réutilisable que vous pourrez intégrer à n’importe quelle application Python. + +## Prérequis + +Avant de commencer, assurez‑vous d’avoir : + +* Python 3.8 ou une version plus récente installé sur votre machine. +* Une licence active d’Aspose.HTML for Python (l’essai gratuit suffit pour l’évaluation). +* Un fichier HTML local que vous souhaitez transformer en PDF (par ex., `page.html`). + +Aucune dépendance système supplémentaire n’est requise ; le SDK regroupe tout le nécessaire pour la génération de PDF. + +## Installer le package Aspose.HTML + +Le SDK Aspose.HTML est distribué via PyPI. Installez‑le avec `pip` dans votre environnement virtuel : + +```bash +pip install aspose-html +``` + +L’exécution de la commande affiche la version installée, confirmant que le package est disponible pour l’importation. + +## Étape 1 : Importer les classes requises + +Le flux de conversion repose sur deux classes principales : + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` fournit la méthode statique `convert_html` qui réalise la transformation réelle. +* `PDFSaveOptions` vous permet d’ajuster finement la sortie PDF, comme l’incorporation des polices standard. + +## Étape 2 : Créer les options de sauvegarde PDF et activer l’incorporation des polices standard + +Incorporer les polices garantit que le PDF généré aura le même aspect sur chaque appareil, même si le lecteur ne possède pas les polices installées localement. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Définir `embed_standard_fonts` à `True` est recommandé dans la plupart des scénarios de production, car cela élimine les avertissements de substitution de police dans les lecteurs PDF. + +## Étape 3 : Convertir le fichier HTML en PDF en utilisant les options configurées + +Appelez maintenant `Converter.convert_html`, en passant le chemin du HTML source, le chemin du PDF de destination et l’objet d’options que vous avez préparé : + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Si la conversion réussit, la méthode renvoie `None` et le fichier PDF apparaît à l’emplacement indiqué. + +## Exemple complet dans une fonction réutilisable + +Encapsuler la logique dans une fonction facilite la réutilisation dans plusieurs projets : + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Pourquoi la fonction est utile + +* **Validation des entrées** – Le `FileNotFoundError` simplifie le débogage lorsque le chemin du HTML est incorrect. +* **Création automatique de répertoires** – `os.makedirs(..., exist_ok=True)` évite les erreurs « directory does not exist ». +* **Incorporation de police configurable** – Vous pouvez désactiver l’incorporation de police pour obtenir des fichiers plus légers si vous savez que l’environnement cible possède déjà les polices requises. + +## Cas limites courants et comment les gérer + +| Situation | Gestion recommandée | +|-----------|----------------------| +| **HTML contient du CSS ou des images externes** | Utilisez des URL absolues ou copiez les ressources à côté du fichier HTML ; Aspose.HTML suit les mêmes règles qu’un navigateur. | +| **Fichiers HTML volumineux (>10 Mo)** | Augmentez la limite de mémoire par défaut en définissant `pdf_options.memory_limit` si vous rencontrez `OutOfMemoryException`. | +| **Vous avez besoin de PDF protégés par mot de passe** | Définissez `pdf_options.encryption_details` avec un mot de passe utilisateur avant d’appeler `convert_html`. | +| **Exécution sur un serveur sans interface graphique** | Aucune configuration supplémentaire n’est requise ; le SDK ne dépend pas d’une GUI. | + +Anticiper ces scénarios vous évite des erreurs d’exécution inattendues. + +## Vérifier le résultat de la conversion + +Une fois le script terminé, ouvrez le PDF généré avec n’importe quel lecteur (Adobe Reader, Chrome, etc.). La mise en page visuelle doit correspondre à celle du HTML d’origine, et toutes les polices doivent s’afficher correctement grâce à leur incorporation. + +Vous pouvez également confirmer programmatique que le fichier existe et possède une taille non nulle : + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Astuces avancées pour la production + +* **Traitement par lots** – Parcourez une liste de fichiers HTML et appelez `html_to_pdf` pour chacun ; réutilisez une même instance de `PDFSaveOptions` afin de réduire la surcharge de création d’objets. +* **Journalisation** – Intégrez le module `logging` de Python pour capturer les horodatages de conversion et les éventuelles exceptions. +* **Performance** – Lors de la conversion de nombreux fichiers, envisagez d’exécuter les conversions en parallèle avec `concurrent.futures.ThreadPoolExecutor`, en gardant à l’esprit que le SDK n’est thread‑safe que pour des appels `Converter` séparés. + +## Conclusion + +Vous disposez maintenant d’une méthode complète et prête pour la production afin de **convert local HTML file to PDF** avec Python. La solution couvre les étapes essentielles — installation d’Aspose.HTML, configuration des options PDF, gestion des cas limites courants et vérification du résultat — tout en illustrant le flux plus large **convert html to pdf python**. + +À partir d’ici, vous pouvez explorer des fonctionnalités avancées telles que le chiffrement PDF, les tailles de page personnalisées ou l’ajout de filigranes, toutes prises en charge par le même SDK. Expérimentez avec les options qui correspondent le mieux à votre projet, et vous pourrez automatiser la conversion HTML‑vers‑PDF de façon fiable dans n’importe quel environnement Python. + +--- + + +## Que devriez‑vous apprendre ensuite ? + + +Les tutoriels suivants abordent des sujets étroitement liés qui s’appuient sur les techniques démontrées dans ce guide. Chaque ressource comprend des exemples de code complets et fonctionnels avec des explications pas à pas pour vous aider à maîtriser d’autres fonctionnalités de l’API et à explorer des approches d’implémentation alternatives dans vos propres projets. + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [Convert HTML to PDF in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/french/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/french/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..54635915ed --- /dev/null +++ b/html/french/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,219 @@ +--- +category: general +date: 2026-09-19 +description: Apprenez à convertir le HTML en Markdown avec Python. Ce tutoriel montre + comment enregistrer le HTML en Markdown et générer du Markdown à partir du HTML + rapidement. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: fr +lastmod: 2026-09-19 +og_description: Convertissez le HTML en Markdown avec Python. Suivez ce guide pour + enregistrer le HTML en Markdown, générer du Markdown à partir du HTML et créer un + fichier de conversion HTML → Markdown. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Convertir le HTML en Markdown en Python – guide complet de programmation +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Comment convertir du HTML en Markdown avec Python – guide étape par étape +url: /fr/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Comment convertir du HTML en Markdown avec Python – guide étape par étape + +Si vous devez **convertir du HTML en Markdown**, ce guide vous accompagne tout au long du processus. Vous verrez comment **enregistrer du HTML en Markdown**, générer du Markdown à partir du HTML, et produire un *html to markdown file* qui peut être utilisé dans les générateurs de sites statiques, les pipelines de documentation, ou tout flux de travail qui préfère le balisage en texte brut. + +Le tutoriel couvre tout, de l'installation de la bibliothèque requise à la gestion des cas particuliers tels que les images intégrées et le formatage personnalisé. À la fin, vous disposerez d'un script prêt à l'emploi et d'une compréhension claire de l'importance de chaque étape. + +## Prérequis + +- Python 3.8 ou une version plus récente installé sur votre machine. +- Familiarité de base avec le scripting Python. +- Accès à un terminal ou à l'invite de commandes. +- La bibliothèque `aspose.html` (ou tout package compatible HTML‑to‑Markdown). Ce tutoriel utilise **Aspose.HTML for Python via .NET**, qui fournit les classes `HTMLDocument`, `MarkdownSaveOptions` et `Converter` présentées dans l'exemple de code. + +> **Astuce :** Si vous préférez une solution pure Python, vous pouvez remplacer `aspose.html` par le package `html2text`. Le flux global reste le même. + +## Étape 1 : Installer la bibliothèque de conversion + +Tout d'abord, installez la bibliothèque qui fournit `HTMLDocument`, `MarkdownSaveOptions` et `Converter`. Exécutez la commande suivante : + +```bash +pip install aspose-html +``` + +Le package regroupe le moteur natif nécessaire pour **générer du markdown à partir du html** rapidement et avec une grande fidélité. L'installation se termine généralement en moins d'une minute sur une connexion haut débit standard. + +## Étape 2 : Charger le document HTML source + +Charger le fichier HTML est la première action concrète dans le pipeline de conversion. La classe `HTMLDocument` analyse le fichier et construit un DOM en mémoire, que le convertisseur parcourt ensuite pour produire du Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Pourquoi c'est important :** En créant un objet `HTMLDocument`, vous vous assurez que les structures complexes — tableaux, listes et styles en ligne — sont correctement interprétées avant la conversion. Ignorer cette étape obligerait le convertisseur à lire du texte brut, entraînant une perte de formatage. + +## Étape 3 : Configurer les options d'enregistrement Markdown + +L'objet `MarkdownSaveOptions` vous permet d'ajuster finement le format de sortie. Pour produire du **Markdown de type Git**, définissez la propriété `formatter` sur `"GIT"`. Cela correspond à la syntaxe utilisée par des plateformes comme GitHub, GitLab et Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Vous pouvez également ajuster d'autres paramètres, tels que `preserve_links` ou `code_block_style`, selon la façon dont vous prévoyez de **save html as markdown** dans les outils en aval. + +## Étape 4 : Convertir le HTML en Markdown et enregistrer le résultat + +Avec le document chargé et les options configurées, appelez la méthode statique `convert_html`. Cette méthode lit le DOM, applique le formatteur choisi et écrit le fichier de sortie. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Après l'exécution du script, vous trouverez un nouveau fichier nommé `output.md` dans le répertoire spécifié. L'ouvrir révèle un Markdown propre et compatible Git, prêt pour le contrôle de version ou la publication. + +## Étape 5 : Vérifier le fichier Markdown généré + +Une vérification rapide vous aide à confirmer que la conversion a réussi et que le **html to markdown file** contient le contenu attendu. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Un exemple de sortie pour une page HTML simple ressemble à : + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Si vous remarquez des titres manquants ou des listes mal formées, revenez à **l’Étape 3** et expérimentez avec différentes valeurs de `formatter` (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Avancé : Gestion des images et des chemins relatifs + +Lorsque le HTML source contient des images, le convertisseur peut soit les incorporer sous forme de data URIs, soit conserver les attributs `src` d'origine. Pour garder le processus **generate markdown from html** léger, vous pouvez copier les fichiers image dans un dossier parallèle et ajuster les chemins. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Après la conversion, le Markdown fera référence aux images comme `![Alt text](images/picture.png)`. Cette approche fonctionne bien lorsque vous **save html as markdown** plus tard dans un générateur de site statique qui attend des ressources dans un dossier dédié. + +## Script complet à copier‑coller + +Ci-dessous le script complet et exécutable qui intègre toutes les étapes abordées. Enregistrez‑le sous le nom `convert_html_to_md.py` et exécutez‑le avec `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Sortie attendue + +L'exécution du script affiche un message de confirmation suivi des dix premières lignes du fichier Markdown, comme montré précédemment. Le `output.md` généré peut être ouvert dans n'importe quel éditeur de texte, prévisualisé dans VS Code, ou commité dans un dépôt Git. + +## Questions fréquentes et gestion des cas particuliers + +| Question | Réponse | +|----------|--------| +| **Et si le fichier HTML est volumineux (> 10 Mo) ?** | La classe `HTMLDocument` lit le flux d'entrée, de sorte que l'utilisation de la mémoire reste modérée. Cependant, envisagez d'augmenter la limite de mémoire du processus Python si vous rencontrez une `MemoryError`. | +| **Puis‑je convertir une chaîne HTML au lieu d'un fichier ?** | Oui. Utilisez `HTMLDocument.from_string(html_string)` (ou le constructeur équivalent) avant d'appeler `Converter.convert_html`. | +| **Comment conserver les commentaires HTML d'origine ?** | Définissez `md_options.preserve_comments = True`. Les commentaires apparaîtront sous forme de commentaires HTML (`<!-- … -->`) dans le fichier Markdown. | +| **Est‑il possible de cibler un dialecte Markdown différent ?** | Modifiez `md_options.formatter` en `"COMMONMARK"` ou `"MARKDOWN_EXTRA"` selon la plateforme cible. | +| **Dois‑je installer le runtime .NET séparément ?** | Le package `aspose-html` regroupe le runtime requis pour la plupart des plateformes. Sous Linux, assurez‑vous que `libgdiplus` est installé (`sudo apt-get install libgdiplus`). | + +## Conclusion + +Vous savez maintenant comment **convertir du HTML en Markdown** avec Python, comment **save html as markdown**, et comment **generate markdown from html** avec un contrôle fin du formatage et des ressources. Le script montre le flux complet — du chargement du fichier source à la production d'un *html to markdown file* propre, prêt pour le contrôle de version ou la publication. + +Ensuite, explorez des sujets connexes tels que **la conversion par lots de plusieurs fichiers HTML**, l'intégration de l'étape de conversion dans un pipeline CI/CD, ou la personnalisation de la sortie Markdown pour des générateurs de sites statiques spécifiques comme Hugo ou Jekyll. Expérimentez avec les différents paramètres de `MarkdownSaveOptions` pour adapter le résultat au guide de style de votre projet. + +Bonne conversion ! + +## Que devriez‑vous apprendre ensuite ? + +Les tutoriels suivants couvrent des sujets étroitement liés qui s’appuient sur les techniques présentées dans ce guide. Chaque ressource comprend des exemples de code complets avec des explications pas à pas pour vous aider à maîtriser d’autres fonctionnalités de l’API et à explorer des approches d’implémentation alternatives dans vos propres projets. + +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/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/french/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/french/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..4823b02172 --- /dev/null +++ b/html/french/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Comment activer les fonctionnalités lors de la conversion de HTML en + Markdown avec Python. Apprenez à convertir un document HTML et à enregistrer le + HTML au format Markdown avec un contrôle précis des fonctionnalités. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: fr +lastmod: 2026-09-19 +og_description: Comment activer les fonctionnalités lors de la conversion de HTML + en Markdown. Ce guide vous montre, étape par étape, comment convertir un document + HTML et enregistrer le HTML en Markdown avec un contrôle granulaire. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Comment activer les fonctionnalités lors de la conversion du HTML en Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Comment activer les fonctionnalités lors de la conversion de HTML en Markdown +url: /fr/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Comment activer les fonctionnalités lors de la conversion de HTML en Markdown + +Si vous devez **how to enable features** pendant une conversion, ce guide vous fournit une solution complète et exécutable. Vous verrez exactement comment convertir du HTML en Markdown, contrôler quelles fonctionnalités Markdown sont émises, et enregistrer le HTML en Markdown en une seule passe. + +L'exemple utilise le populaire **GroupDocs.Conversion** Python SDK, mais les concepts s'appliquent à toute bibliothèque qui vous permet de configurer des ensembles de fonctionnalités. À la fin de ce tutoriel, vous pourrez convertir un document HTML, ne conserver que les liens et les paragraphes, et éviter les tables, images ou blocs de code indésirables. + +## Ce que vous allez réaliser + +* **how to enable features** dans les options d'enregistrement Markdown +* un flux de travail clair **convert html to markdown** +* la capacité de **how to convert html** avec une sortie sélective +* un script prêt à l'exécution qui **convert html document** et **save html as markdown** + +### Prérequis + +* Python 3.8+ installé +* package `groupdocs-conversion` (installer avec `pip install groupdocs-conversion`) +* Un fichier HTML d'exemple (`sample.html`) dans un répertoire connu + +--- + +## Comment activer les fonctionnalités dans la conversion Markdown + +La première étape consiste à créer un objet `MarkdownSaveOptions` et à indiquer au convertisseur quels éléments vous souhaitez conserver. Dans ce tutoriel, nous activons uniquement les **links** et les **paragraphs**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Pourquoi cela fonctionne :** +* `HTMLDocument` encapsule le fichier source afin que le convertisseur puisse le lire. +* `MarkdownSaveOptions` contient tous les paramètres de conversion ; la liste `features` est la propriété clé qui **how to enable features**. +* En assignant `["Link", "Paragraph"]`, vous indiquez au moteur d'émettre uniquement les liens Markdown (`[text](url)`) et les paragraphes simples, en excluant les images, tables et autres balises. +* `Converter.convert_html` effectue l'opération réelle **convert html to markdown** et écrit le résultat dans `sample.md`. + +--- + +## Comment convertir un document HTML avec des options personnalisées + +Si vous avez besoin plus tard d'ajouter d'autres indicateurs de fonctionnalité — comme `"Header"` ou `"Bold"` — il suffit d'étendre la liste : + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +Le même appel à `Converter.convert_html` inclura désormais ces éléments supplémentaires. Ce modèle vous permet de **how to convert html** de manière hautement configurable sans écrire de parseurs personnalisés. + +--- + +## Comment enregistrer le HTML en Markdown dans un dossier spécifique + +La méthode `convert_html` accepte un chemin de sortie absolu ou relatif. Pour **save html as markdown** dans un sous‑dossier nommé `output`, ajustez le troisième argument : + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +L'exécution du script crée le répertoire `output` (s'il n'existe pas) et y écrit le fichier Markdown. Cette approche garde votre HTML source et le Markdown généré bien organisés. + +--- + +## Script complet à copier‑coller + +Voici le programme complet, prêt à être exécuté. Remplacez `YOUR_DIRECTORY` par le chemin contenant `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Sortie attendue** (affichée dans la console) : + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Ouvrez `sample.md` et vous verrez uniquement des liens Markdown et des paragraphes simples, par exemple : + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Tous les autres éléments HTML ont été omis parce que **how to enable features** a limité la sortie aux deux types sélectionnés. + +--- + +## Questions fréquentes et cas particuliers + +| Question | Réponse | +|----------|--------| +| *Que se passe-t-il si le fichier HTML ne contient aucun lien ?* | Le convertisseur écrit toujours les paragraphes ; la sortie contiendra du texte brut sans syntaxe de lien. | +| *Puis-je désactiver toutes les fonctionnalités ?* | Définir `markdown_options.features = []` donne un fichier Markdown vide. Utilisez cela uniquement pour les tests. | +| *Comment le SDK gère-t-il le HTML invalide ?* | L'analyseur tente de nettoyer le balisage malformé avant d'appliquer le filtre de fonctionnalités. Les erreurs sont enregistrées mais n'arrêtent pas la conversion. | +| *Est-il possible de conserver les images tout en supprimant les tables ?* | Oui. Définissez `markdown_options.features = ["Link", "Paragraph", "Image"]`. La liste des fonctionnalités est additive, pas exclusive. | +| *Que faire si je dois convertir de nombreux fichiers dans un dossier ?* | Enveloppez la logique de conversion dans une boucle qui itère sur `Path.glob("*.html")`. La même configuration **how to enable features** peut être réutilisée pour chaque fichier. | + +**Astuce :** Lors du traitement de gros lots, instanciez `MarkdownSaveOptions` une fois et réutilisez‑le. Cela réduit la surcharge de création d'objets et maintient le pipeline **convert html to markdown** rapide. + +--- + +## Conclusion + +Vous savez maintenant **how to enable features** lorsque vous **convert html to markdown**, comment **how to convert html** avec une sortie sélective, et comment **convert html document** et **save html as markdown** à l'aide d'un script Python concis. En configurant `MarkdownSaveOptions.features`, vous obtenez un contrôle complet sur les éléments Markdown qui apparaissent dans le fichier final. + +### Prochaines étapes + +* Explorez des indicateurs de fonctionnalités supplémentaires tels que `"Header"`, `"Bold"` et `"Italic"` pour enrichir votre sortie Markdown. +* Combinez ce script avec un observateur de fichiers (par ex., `watchdog`) pour convertir automatiquement les nouveaux fichiers HTML dès leur arrivée. +* Consultez la [documentation du GroupDocs.Conversion Python SDK](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) pour des scénarios avancés comme les conversions PDF‑to‑Markdown ou DOCX‑to‑HTML. + +N'hésitez pas à expérimenter avec différents ensembles de fonctionnalités et à partager vos découvertes avec la communauté. Bonne conversion ! + +## Que devriez‑vous apprendre ensuite ? + +Les tutoriels suivants couvrent des sujets étroitement liés qui s'appuient sur les techniques démontrées dans ce guide. Chaque ressource comprend des exemples de code fonctionnels complets avec des explications étape par étape pour vous aider à maîtriser des fonctionnalités d'API supplémentaires et explorer des approches d'implémentation alternatives dans vos propres projets. + +- [Convertir le HTML en Markdown avec Aspose.HTML pour Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown vers HTML Java - Convertir avec Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [Comment activer JavaScript dans Aspose HTML – Charger le HTML & obtenir le texte](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/french/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/french/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..66fccd2b44 --- /dev/null +++ b/html/french/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,246 @@ +--- +category: general +date: 2026-09-19 +description: Apprenez à limiter les ressources imbriquées dans Aspose.HTML pour Python + en utilisant ResourceHandlingOptions. Contrôlez la profondeur maximale de traitement + et évitez les boucles infinies. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: fr +lastmod: 2026-09-19 +og_description: Limitez les ressources imbriquées dans Aspose.HTML pour Python en + utilisant ResourceHandlingOptions. Définissez la profondeur maximale de gestion + pour éviter une récursion profonde et améliorer les performances. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Comment limiter les ressources imbriquées dans Aspose.HTML pour Python – + guide étape par étape +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Comment limiter les ressources imbriquées lors du traitement du HTML avec Aspose.HTML + pour Python +url: /fr/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Comment limiter les ressources imbriquées lors du traitement du HTML avec Aspose.HTML pour Python + +Si vous devez **limiter les ressources imbriquées** lors du rendu ou de la conversion du HTML, ce guide vous montre les étapes exactes pour configurer Aspose.HTML pour Python. Contrôler la profondeur de la gestion des ressources empêche une récursion incontrôlée lorsqu’une page inclut de nombreuses couches de CSS, JavaScript ou de références d’images. + +Limiter les ressources imbriquées est particulièrement important pour les crawlers à grande échelle, les pipelines de rendu d’e‑mail, ou tout flux de travail automatisé qui doit rester dans les limites de mémoire et de temps. Dans les sections suivantes, vous apprendrez pourquoi vous devez définir une limite de profondeur, comment utiliser la classe `ResourceHandlingOptions`, et comment vérifier que la limite fonctionne comme prévu. + +## Pourquoi vous devriez limiter les ressources imbriquées + +Les documents HTML font souvent référence à d’autres ressources — feuilles de style, scripts, images, polices, ou même d’autres fichiers HTML. Chacune de ces ressources peut, à son tour, référencer des fichiers supplémentaires, formant un arbre de dépendances. Sans protection, l’arbre peut devenir arbitrairement profond : + +* Une page charge un fichier CSS qui importe un autre fichier CSS, qui en importe un autre, et ainsi de suite. +* Le JavaScript peut charger dynamiquement des scripts supplémentaires. +* Un modèle d’e‑mail peut intégrer des images qui référencent des URL externes redirigeant vers d’autres ressources. + +Lorsque la profondeur de récursion augmente sans contrôle, vous risquez : + +* **Consommation excessive de mémoire** – chaque ressource récupérée occupe des tampons. +* **Temps de traitement plus longs** – la latence réseau se multiplie à chaque niveau. +* **Boucles infinies potentielles** – les références circulaires peuvent empêcher le moteur de revenir. + +Définir une **profondeur maximale de traitement** indique à Aspose.HTML d’arrêter de suivre les liens de ressources après un nombre donné de niveaux, garantissant des performances prévisibles. + +## Comment limiter les ressources imbriquées dans Aspose.HTML pour Python + +Aspose.HTML fournit la classe `ResourceHandlingOptions`, qui contient une propriété `max_handling_depth`. En lui attribuant une valeur numérique (par ex. `3`), vous indiquez au moteur de s’arrêter après trois niveaux imbriqués. + +Voici un exemple complet et exécutable qui montre l’ensemble du flux de travail : + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Explication de chaque étape + +1. **Installer le package** – La roue `aspose-html` est requise. La commande `pip install` est affichée en commentaire à titre d’exemple. +2. **Importer les classes** – `HtmlDocument` charge la page, `ResourceHandlingOptions` contient la limite, et `HtmlLoadOptions` les associe. +3. **Créer l’objet d’options** – Instancier `ResourceHandlingOptions` vous fournit un conteneur mutable. +4. **Définir `max_handling_depth`** – Assigner `3` (ou tout entier) pour restreindre le moteur à trois niveaux de ressources imbriquées. C’est le cœur de la **limitation des ressources imbriquées**. +5. **Attacher les options à la configuration de chargement** – `HtmlLoadOptions` vous permet de transmettre les `resource_options` au chargeur. +6. **Charger le HTML** – Le constructeur de `HtmlDocument` accepte une URL ou un chemin de fichier ainsi que `load_options`. Le moteur respecte désormais la limite de profondeur. +7. **Vérifier** – En parcourant `document.resources`, vous pouvez voir combien de ressources ont réellement été récupérées et le niveau le plus profond rencontré. Si le niveau le plus profond est `3` ou inférieur, la limite a réussi. +8. **Enregistrer** – Persister le document traité. Le fichier enregistré ne contient que les ressources jusqu’à la profondeur autorisée. + +#### Sortie attendue + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +Les nombres varieront selon la page source, mais le niveau le plus profond ne doit jamais dépasser `3` car nous avons défini `max_handling_depth = 3`. + +## Variations courantes et cas limites + +### Modifier la limite de profondeur + +Vous pourriez avoir besoin d’une limite plus profonde ou plus superficielle selon votre environnement : + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Désactiver complètement la limite + +Définir la propriété à `0` indique à Aspose.HTML de **supprimer toute restriction de profondeur** : + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Ne faites cela que si vous êtes certain que le HTML source est bien comporté. + +### Gestion des références circulaires + +Même avec une limite de profondeur, des références circulaires peuvent encore apparaître au même niveau. Aspose.HTML détecte les cycles et arrête le chargement d’une ressource déjà traitée, quel que soit le réglage de profondeur. Cependant, définir un `max_handling_depth` plus bas réduit la probabilité de rencontrer un cycle dès le départ. + +### Utiliser la limite avec des fichiers locaux + +La même approche fonctionne pour les fichiers HTML locaux : + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +Le moteur traite les attributs `href` ou `src` relatifs de la même manière que les URL distantes, appliquant la limite de profondeur également aux ressources du système de fichiers. + +### Intégration avec d’autres fonctionnalités d’Aspose.HTML + +Si vous devez également contrôler le **délai d’attente du téléchargement des ressources**, vous pouvez combiner `ResourceHandlingOptions` avec `NetworkOptions` : + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Les deux options sont indépendantes, vous pouvez donc affiner les performances et la sécurité simultanément. + +## Conseils pro pour la production + +* **Journaliser l’arbre des ressources** – Lors du débogage, parcourez `document.resources` et consignez l’URL et la profondeur de chaque ressource. Cela vous aide à comprendre pourquoi une page particulière dépasse vos attentes. +* **Mettre en cache les ressources récupérées** – Si vous traitez les mêmes actifs externes de façon répétée, activez le cache pour éviter les appels réseau redondants. +* **Combiner avec une liste blanche** – Si seuls certains domaines sont fiables, filtrez `document.resources` après le chargement et éliminez ceux qui sont hors de la liste blanche. +* **Tester avec des pages limites** – Créez un fichier HTML synthétique qui importe une chaîne de 10 fichiers CSS. Vérifiez que votre limite tronque la chaîne comme prévu. + +## Conclusion + +Vous savez maintenant comment **limiter les ressources imbriquées** dans Aspose.HTML pour Python en configurant `ResourceHandlingOptions.max_handling_depth`. Définir une limite de profondeur protège votre application d’une utilisation excessive de mémoire, de temps de traitement longs et de boucles infinies potentielles causées par des références de ressources profondément imbriquées ou circulaires. + +À partir de maintenant, vous pouvez : + +* Ajuster la profondeur pour correspondre à votre budget de performance (`resource_handling_options.max_handling_depth`). +* Combiner la limite avec des délais d’attente réseau, le cache ou des listes blanches de domaines pour des pipelines robustes. +* Explorer des sujets connexes tels que **resource handling options**, **max handling depth** et **nested resource handling** pour renforcer davantage le contrôle du traitement HTML. + +Expérimentez avec différentes valeurs de profondeur et observez comment le nombre de ressources chargées change. Lorsque vous êtes prêt, intégrez ce modèle dans votre service de conversion ou de rendu HTML plus vaste afin d’assurer une exécution prévisible, sûre et efficace. + +## Que devriez‑vous apprendre ensuite ? + +Les tutoriels suivants couvrent des sujets étroitement liés qui s’appuient sur les techniques démontrées dans ce guide. Chaque ressource comprend des exemples de code complets et fonctionnels avec des explications pas à pas pour vous aider à maîtriser des fonctionnalités d’API supplémentaires et explorer des approches d’implémentation alternatives dans vos propres projets. + +- [Gestion des messages et du réseau dans Aspose.HTML pour Java](/html/english/java/message-handling-networking/) +- [Filtre de schéma personnalisé et gestion des messages dans Aspose.HTML pour Java](/html/english/java/custom-schema-message-handling/) +- [Gestion des données et gestion des flux dans Aspose.HTML pour Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/french/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/french/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..e3935b7347 --- /dev/null +++ b/html/french/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,260 @@ +--- +category: general +date: 2026-09-19 +description: Apprenez un tutoriel HTML vers PDF en Python qui montre comment générer + rapidement un PDF à partir de HTML avec Aspose.HTML. Suivez le guide étape par étape + dès maintenant. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: fr +lastmod: 2026-09-19 +og_description: 'Tutoriel html vers pdf : convertissez n’importe quelle page HTML + en fichier PDF à l’aide de Python et d’Aspose.HTML. Ce guide montre comment générer + un PDF à partir de HTML en quelques minutes.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Tutoriel HTML vers PDF en Python – guide complet étape par étape +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Comment réaliser un tutoriel HTML vers PDF avec Python +url: /fr/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Comment réaliser un tutoriel html vers pdf avec Python + +Si vous avez besoin d'un **html to pdf tutorial**, ce guide vous montre exactement comment générer un PDF à partir de HTML avec seulement quelques lignes de code Python. Que vous automatisiez la création de rapports ou exportiez du contenu web pour une lecture hors ligne, la bibliothèque Aspose.HTML rend la conversion indolore. + +Dans ce tutoriel, vous apprendrez à configurer l'environnement, écrire le script de conversion et gérer les cas limites courants tels que les fichiers manquants ou les paramètres de page personnalisés. À la fin, vous pourrez **how to generate pdf** des fichiers à partir de n'importe quelle source HTML sans quitter l'écosystème Python. + +## Ce dont vous avez besoin + +* Python 3.8 ou version supérieure installé +* Une licence active d'Aspose.HTML for Python (un essai gratuit suffit pour l'évaluation) +* Accès à `pip` pour installer le package `aspose-html` +* Un fichier HTML simple que vous souhaitez convertir (par ex., `input.html`) + +> **Conseil pro :** Conservez votre HTML et vos ressources (images, CSS) dans le même répertoire pour éviter les problèmes de résolution de chemins lors de la conversion. + +## Étape 1 : Installer le package Aspose.HTML + +Ouvrez un terminal et exécutez la commande suivante : + +```bash +pip install aspose-html +``` + +Le wheel `aspose-html` regroupe les bibliothèques natives nécessaires à un rendu de haute qualité, aucune dépendance système supplémentaire n'est requise. + +## Étape 2 : Créer un script Python minimal + +Créez un nouveau fichier nommé `convert_html_to_pdf.py` et collez le code ci‑dessous. Ce script suit le modèle du **html to pdf tutorial** en trois étapes : importation, définition des chemins et appel de la conversion. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Pourquoi cela fonctionne + +* **Importer `Converter`** vous donne accès à une API de haut niveau qui abstrait le moteur de rendu. +* **Définir des chemins absolus** évite les bugs de chemins relatifs lorsque le script s'exécute depuis un répertoire de travail différent. +* **`Converter.convert_html`** exécute l'ensemble du pipeline de rendu — analyse HTML, mise en page CSS et sérialisation PDF—en un seul appel, ce qui est la méthode recommandée pour **how to generate pdf** rapidement. + +## Étape 3 : Exécuter le script et vérifier la sortie + +Exécutez le script depuis le terminal : + +```bash +python convert_html_to_pdf.py +``` + +Si tout est correctement configuré, vous verrez : + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Ouvrez `output.pdf` avec n'importe quel lecteur PDF. Le document devrait être identique à la page HTML d'origine, y compris les polices, les images et le style CSS de base. + +![Aperçu du PDF généré](https://example.com/images/pdf-preview.png "Capture d'écran du PDF généré à partir de HTML avec Python"){: .center-image alt="Capture d'écran d'un PDF généré à partir d'un fichier HTML avec Python"} + +## Étape 4 : Personnaliser la conversion (optionnel) + +Le **html to pdf tutorial** de base couvre une conversion un à un, mais les scénarios réels nécessitent souvent des ajustements : + +| Exigence | Comment l'obtenir avec Aspose.HTML | +|----------|------------------------------------| +| Définir la taille de la page (A4, Letter) | Pass a `PdfSaveOptions` object to `convert_html` | +| Ajouter des marges ou en-têtes/pieds de page | Use `PdfPageSettings` inside the options | +| Intégrer des polices personnalisées | Ensure the font files are reachable and set `FontSettings` | + +Voici un exemple qui définit la taille de la page à A4 et ajoute une marge de 1 pouce : + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Note :** Utiliser des options personnalisées est la technique préférée pour **generate pdf from html** lorsque vous avez besoin d'un contrôle précis sur la mise en page. + +## Étape 5 : Gérer plusieurs fichiers HTML (conversion par lots) + +Si vous avez un dossier rempli de rapports HTML, vous pouvez les parcourir : + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Cet extrait montre un flux de travail **python convert html pdf** évolutif qui s'intègre aux pipelines CI ou aux tâches planifiées. + +## Pièges courants et comment les éviter + +| Problème | Cause | Solution | +|----------|-------|----------| +| Images manquantes dans le PDF | Chemins d'images relatifs qui se cassent lorsque le script s'exécute depuis un autre dossier | Utilisez des chemins absolus ou définissez `base_uri` dans les options de `Converter` | +| CSS non appliqué | Feuille de style externe référencée avec une URL nécessitant un accès Internet | Téléchargez la feuille de style localement et référencez‑la avec un chemin relatif | +| Substitution de police | Police non installée sur la machine hôte | Incluez le fichier de police dans le projet et configurez `FontSettings` | + +Traiter ces cas limites garantit que votre processus **export html as pdf** est robuste sur tous les environnements. + +## Exemple complet et exécutable + +Voici le script complet qui inclut les paramètres optionnels, la gestion des erreurs et la logique de traitement par lots. Copiez‑le dans `full_html_to_pdf.py` et exécutez‑le comme indiqué précédemment. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +L'exécution de ce script génère un PDF pour chaque fichier HTML du répertoire cible, en appliquant des paramètres de page cohérents — une solution **python convert html pdf** complète prête pour la production. + +## Conclusion + +Vous disposez maintenant d'un **html to pdf tutorial** pratique qui montre comment générer des fichiers PDF à partir de HTML en utilisant Python et Aspose.HTML. Le guide a couvert la configuration de l'environnement, un script de conversion minimal, la personnalisation optionnelle, le traitement par lots et des astuces de dépannage. + +À partir de là, vous pouvez explorer des sujets connexes tels que **how to generate pdf** avec filigranes, la fusion de plusieurs PDFs, ou la conversion de HTML vers d'autres formats comme DOCX. Expérimentez avec l'API `PdfSaveOptions` pour affiner la sortie, et intégrez le script aux services web ou aux pipelines de reporting automatisés. + +Bon codage, et profitez de transformer votre contenu HTML en PDFs soignés ! + +## Que devriez‑vous apprendre ensuite ? + +Les tutoriels suivants couvrent des sujets étroitement liés qui s'appuient sur les techniques démontrées dans ce guide. Chaque ressource comprend des exemples de code complets et fonctionnels avec des explications étape par étape pour vous aider à maîtriser des fonctionnalités API supplémentaires et explorer des approches d'implémentation alternatives dans vos propres projets. + +- [Convertir HTML en PDF avec Aspose.HTML – Guide complet étape par étape](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convertir HTML en PDF avec Aspose.HTML – Guide complet de manipulation](/html/english/) +- [Comment convertir HTML en PDF Java – Utilisation d'Aspose.HTML pour Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/german/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/german/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..7b2e869e3c --- /dev/null +++ b/html/german/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,266 @@ +--- +category: general +date: 2026-09-19 +description: Erfahren Sie, wie Sie den Titel in einer HTML‑Datei mit Python ändern. + Dieser Leitfaden behandelt das Lesen von HTML, das Aktualisieren des Title‑Tags + und das Speichern des modifizierten HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: de +lastmod: 2026-09-19 +og_description: Wie man den Titel in einer HTML‑Datei mit Python ändert. Folgen Sie + diesem vollständigen Beispiel, um HTML zu lesen, das Title‑Tag zu aktualisieren + und das geänderte Dokument zu speichern. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Wie man den Titel in einer HTML-Datei mit Python ändert – Schritt‑für‑Schritt‑Anleitung +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Wie man den Titel einer HTML-Datei mit Python ändert +url: /de/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Wie man den Titel in einer HTML‑Datei mit Python ändert + +Wenn Sie **wie man den Titel ändert** in einem HTML‑Dokument programmgesteuert benötigen, macht Python die Aufgabe unkompliziert. In diesem Tutorial lesen Sie eine HTML‑Datei, aktualisieren das `<title>`‑Element und speichern das modifizierte HTML wieder auf der Festplatte – alles mit klarem, ausführbarem Code. + +Den Seitentitel zu ändern ist ein gängiger Schritt, wenn Sie statische Websites erzeugen, gescrapte Seiten anpassen oder SEO‑Updates automatisieren. Am Ende dieses Leitfadens wissen Sie, wie man **html title aktualisiert**, wie man **html mit python liest** und wie man **modifiziertes html sicher speichert**. + +## Voraussetzungen + +Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben: + +- Python 3.8 oder neuer installiert +- Das Paket `beautifulsoup4` (`pip install beautifulsoup4`) +- Eine HTML‑Datei, die Sie bearbeiten möchten (im Beispiel wird `index.html` in einem von Ihnen gewählten Ordner verwendet) + +Es werden keine externen Dienste benötigt; alles läuft lokal. + +## Schritt 1: Die HTML‑Datei mit Python laden + +Die erste Aufgabe besteht darin, **html file python**‑artig zu **laden**. Die Verwendung von `BeautifulSoup` liefert Ihnen einen fehlertoleranten Parser, der mit unvollständigem Markup funktioniert. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Warum dieser Schritt wichtig ist:* +`BeautifulSoup` erstellt eine Baumdarstellung, mit der Sie Elemente abfragen und ändern können, ohne manuelle String‑Verarbeitung. Der eingebaute `html.parser` ist schnell und erfordert keine zusätzlichen Binärdateien. + +## Schritt 2: Das `<title>`‑Element finden + +HTML‑Dokumente enthalten in der Regel ein einzelnes `<title>`‑Tag im `<head>`. Wir holen das erste Vorkommen, das die Anforderung **update html title** erfüllt. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Warum wir auf `None` prüfen:* +Einige HTML‑Fragmente lassen das Title‑Tag weg. Es automatisch hinzuzufügen verhindert spätere Fehler und hält das Skript robust. + +## Schritt 3: Den Titeltext ändern + +Jetzt **update html title** wir, indem wir dem Tag einen neuen Text zuweisen. Das ist der Kern der **how to change title**‑Operation. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +Das Attribut `string` repräsentiert den Textknoten innerhalb von `<title>`. Durch das Überschreiben wird das DOM im Speicher aktualisiert. + +## Schritt 4: Das modifizierte HTML speichern + +Abschließend schreiben wir das geänderte Dokument in eine neue Datei. Damit wird der Schritt **save modified html** abgeschlossen und das Original bleibt unverändert. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` formatiert die Ausgabe mit Einrückungen, sodass die Datei nach der Änderung leicht lesbar ist. + +### Erwartete Ausgabe + +Das Ausführen des Skripts auf einer Beispiel‑`index.html`, die ursprünglich folgendes enthält: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +liefert eine Konsolenausgabe ähnlich wie: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +Die gespeicherte `index_modified.html` beginnt nun mit: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Vollständiges Skript zum schnellen Kopieren‑Einfügen + +Unten finden Sie das komplette, sofort ausführbare Programm, das alle vier Schritte kombiniert. Speichern Sie es als `change_title.py` und passen Sie `YOUR_DIRECTORY` nach Bedarf an. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Skript ausführen: + +```bash +python change_title.py +``` + +Sie sehen die Konsolennachrichten und eine neue `index_modified.html`‑Datei mit dem aktualisierten Titel. + +## Zusätzliche Tipps und Sonderfälle + +| Situation | Was zu tun ist | +|-----------|----------------| +| **Mehrere `<title>`‑Tags** | `soup.find_all("title")` gibt eine Liste zurück; aktualisieren Sie das erste Element oder iterieren Sie, wenn Sie alle ändern müssen. | +| **Kodierungsprobleme** | Öffnen Sie Dateien mit `encoding="utf-8-sig"`, wenn ein BOM vorhanden ist, oder erkennen Sie die Kodierung mit `chardet`. | +| **Große HTML‑Dateien** | Verwenden Sie den `lxml`‑Parser (`BeautifulSoup(html_content, "lxml")`) für bessere Performance. | +| **Originalformatierung beibehalten** | Wenn Sie exakt die gleiche Whitespace‑Struktur benötigen, schreiben Sie `str(soup)` statt `prettify()`. | +| **Automatisierung über viele Dateien** | Packen Sie die Logik in eine Funktion und iterieren Sie über `Path.rglob("*.html")`. | + +Diese Varianten erhalten die Kernlogik von **how to change title**, passen sie jedoch an reale Projektanforderungen an. + +## Fazit + +Sie wissen jetzt, **wie man den Titel ändert** in jedem HTML‑Dokument mithilfe von Python. Das Tutorial behandelte das Lesen von HTML, das Finden des `<title>`‑Tags, das Aktualisieren seines Textes und das **sichere Speichern von modifiziertem html**. Mit dem vollständigen Skript können Sie dieses Muster in statische Site‑Generatoren, SEO‑Pipelines oder jede Automatisierung einbinden, die dynamische Titeländerungen erfordert. + +Als Nächstes können Sie verwandte Themen wie **read html with python** erkunden, um Meta‑Tags zu extrahieren, oder **load html file python**‑Techniken für den Umgang mit fehlerhaftem Markup. Experimentieren Sie mit Batch‑Verarbeitung, um Titel einer gesamten Website zu aktualisieren – Ihre neue Fähigkeit ist die Basis für viele Web‑Automatisierungsaufgaben. Viel Spaß beim Coden! + + +## Was sollten Sie als Nächstes lernen? + + +Die folgenden Tutorials behandeln eng verwandte Themen, die auf den in diesem Leitfaden gezeigten Techniken aufbauen. Jede Ressource enthält vollständige, funktionierende Code‑Beispiele mit Schritt‑für‑Schritt‑Erklärungen, um Ihnen zu helfen, weitere API‑Funktionen zu meistern und alternative Implementierungsansätze in Ihren eigenen Projekten zu erkunden. + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/german/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/german/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..3dfaa08110 --- /dev/null +++ b/html/german/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,206 @@ +--- +category: general +date: 2026-09-19 +description: Lokale HTML-Datei mit Python und Aspose.HTML in PDF konvertieren – ein + vollständiger Schritt‑für‑Schritt‑Leitfaden, der auch Optionen zur Konvertierung + von HTML zu PDF mit Python abdeckt. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: de +lastmod: 2026-09-19 +og_description: Konvertieren Sie lokale HTML-Datei in PDF mit Python. Erfahren Sie + den besten Weg, HTML mit Python und Aspose.HTML in PDF zu konvertieren, einschließlich + Schriftart‑Einbettung und Fehlerbehandlung. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Lokale HTML-Datei mit Python in PDF konvertieren – vollständige Anleitung +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Wie man eine lokale HTML-Datei mit Python in PDF konvertiert +url: /de/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Wie man eine lokale HTML‑Datei mit Python in PDF konvertiert + +Wenn Sie **lokale HTML‑Dateien in PDF konvertieren** müssen – in einem Python‑Projekt – zeigt Ihnen dieses Tutorial eine sofort einsatzbereite Lösung. Sie sehen, wie Sie die Aspose.HTML‑Bibliothek einrichten, PDF‑Optionen konfigurieren und die Konvertierung in nur wenigen Code‑Zeilen ausführen. Der Leitfaden erklärt außerdem bewährte Methoden für **convert html to pdf python**, sodass Sie den Code an Ihre eigenen Workflows anpassen können. + +Die nachfolgenden Schritte decken alles ab, was Sie wissen müssen: Installation des SDK, Vorbereitung der Speicheroptionen, Umgang mit häufigen Stolpersteinen und Überprüfung des Ergebnisses. Am Ende des Artikels besitzen Sie eine wiederverwendbare Funktion, die Sie in jede Python‑Anwendung einbinden können. + +## Voraussetzungen + +Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben: + +* Python 3.8 oder neuer, installiert auf Ihrem Rechner. +* Eine aktive Aspose.HTML‑für‑Python‑Lizenz (die kostenlose Testversion reicht für Evaluierungen). +* Eine lokale HTML‑Datei, die Sie in ein PDF umwandeln möchten (z. B. `page.html`). + +Sie benötigen keine zusätzlichen System‑Abhängigkeiten; das SDK enthält alles, was für die PDF‑Erstellung erforderlich ist. + +## Aspose.HTML‑Paket installieren + +Das Aspose.HTML‑SDK wird über PyPI bereitgestellt. Installieren Sie es mit `pip` in Ihrer virtuellen Umgebung: + +```bash +pip install aspose-html +``` + +Die Ausgabe des Befehls zeigt die installierte Version und bestätigt, dass das Paket importierbar ist. + +## Schritt 1: Die benötigten Klassen importieren + +Der Konvertierungs‑Workflow basiert auf zwei Hauptklassen: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` stellt die statische Methode `convert_html` bereit, die die eigentliche Transformation ausführt. +* `PDFSaveOptions` ermöglicht das Feintuning der PDF‑Ausgabe, z. B. das Einbetten von Standardschriften. + +## Schritt 2: PDF‑Speicheroptionen erstellen und Einbetten von Standardschriften aktivieren + +Das Einbetten von Schriften stellt sicher, dass das erzeugte PDF auf jedem Gerät gleich aussieht, selbst wenn der Betrachter die Schriften nicht lokal installiert hat. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Das Setzen von `embed_standard_fonts` auf `True` wird für die meisten Produktionsszenarien empfohlen, da es Warnungen wegen Schrift‑Substitution in PDF‑Readern eliminiert. + +## Schritt 3: Die HTML‑Datei mit den konfigurierten Optionen in PDF konvertieren + +Rufen Sie nun `Converter.convert_html` auf und übergeben Sie den Pfad zur Quell‑HTML, den Ziel‑PDF‑Pfad sowie das zuvor erstellte Options‑Objekt: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Wenn die Konvertierung erfolgreich ist, gibt die Methode `None` zurück und die PDF‑Datei erscheint an dem von Ihnen angegebenen Ort. + +## Vollständiges Beispiel in einer wiederverwendbaren Funktion + +Die Logik in einer Funktion zu kapseln erleichtert die Wiederverwendung in mehreren Projekten: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Warum die Funktion hilfreich ist + +* **Eingabevalidierung** – Der `FileNotFoundError` erleichtert das Debuggen, wenn der HTML‑Pfad falsch ist. +* **Automatisches Erstellen von Verzeichnissen** – `os.makedirs(..., exist_ok=True)` verhindert Fehler wie „Verzeichnis existiert nicht“. +* **Konfigurierbares Schrift‑Einbetten** – Sie können das Einbetten von Schriften deaktivieren, um kleinere Dateien zu erhalten, wenn Sie wissen, dass die Zielumgebung die benötigten Schriften bereits bereitstellt. + +## Häufige Randfälle und deren Handhabung + +| Situation | Empfohlene Vorgehensweise | +|-----------|---------------------------| +| **HTML enthält externes CSS oder Bilder** | Verwenden Sie absolute URLs oder kopieren Sie die Ressourcen neben die HTML‑Datei; Aspose.HTML folgt denselben Regeln wie ein Browser. | +| **Große HTML‑Dateien (>10 MB)** | Erhöhen Sie das Standard‑Speicherlimit, indem Sie `pdf_options.memory_limit` setzen, falls Sie `OutOfMemoryException` erhalten. | +| **Passwortgeschützte PDFs benötigt** | Setzen Sie `pdf_options.encryption_details` mit einem Benutzer‑Passwort, bevor Sie `convert_html` aufrufen. | +| **Ausführung auf einem headless Server** | Keine zusätzliche Konfiguration nötig; das SDK benötigt keine GUI. | + +Das frühzeitige Berücksichtigen dieser Szenarien verhindert unerwartete Laufzeitfehler. + +## Ergebnis der Konvertierung überprüfen + +Nachdem das Skript beendet ist, öffnen Sie das erzeugte PDF mit einem beliebigen Viewer (Adobe Reader, Chrome usw.). Das visuelle Layout sollte dem ursprünglichen HTML entsprechen, und alle Schriften sollten korrekt angezeigt werden, weil sie eingebettet wurden. + +Sie können zudem programmgesteuert prüfen, ob die Datei existiert und eine Größe größer 0 hat: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Profi‑Tipps für den Produktionseinsatz + +* **Batch‑Verarbeitung** – Durchlaufen Sie eine Liste von HTML‑Dateien und rufen Sie `html_to_pdf` für jede auf; verwenden Sie eine einzige `PDFSaveOptions`‑Instanz, um den Overhead bei der Objekterstellung zu reduzieren. +* **Logging** – Integrieren Sie das Python‑Modul `logging`, um Konvertierungszeitpunkte und etwaige Ausnahmen zu protokollieren. +* **Performance** – Beim Konvertieren vieler Dateien sollten Sie parallele Ausführungen mit `concurrent.futures.ThreadPoolExecutor` in Betracht ziehen, wobei zu beachten ist, dass das SDK nur für separate `Converter`‑Aufrufe thread‑sicher ist. + +## Fazit + +Sie verfügen nun über eine vollständige, produktionsreife Methode, um **lokale HTML‑Dateien mit Python in PDF zu konvertieren**. Die Lösung deckt die wesentlichen Schritte – Installation von Aspose.HTML, Konfiguration der PDF‑Optionen, Umgang mit gängigen Randfällen und Ergebnis‑Verifizierung – und demonstriert zugleich den umfassenderen **convert html to pdf python**‑Workflow. + +Ab hier können Sie erweiterte Funktionen wie PDF‑Verschlüsselung, benutzerdefinierte Seitengrößen oder Wasserzeichen erkunden, die alle vom selben SDK unterstützt werden. Experimentieren Sie mit den Optionen, die am besten zu Ihrem Projekt passen, und Sie werden HTML‑zu‑PDF‑Konvertierungen zuverlässig in jeder Python‑Umgebung automatisieren können. + +--- + + +## Was sollten Sie als Nächstes lernen? + + +Die folgenden Tutorials behandeln eng verwandte Themen, die auf den in diesem Leitfaden gezeigten Techniken aufbauen. Jede Ressource enthält vollständige, funktionierende Code‑Beispiele mit Schritt‑für‑Schritt‑Erklärungen, damit Sie weitere API‑Funktionen meistern und alternative Implementierungsansätze in Ihren eigenen Projekten erkunden können. + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [Convert HTML to PDF in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/german/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/german/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..2da8141983 --- /dev/null +++ b/html/german/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,218 @@ +--- +category: general +date: 2026-09-19 +description: Lerne, HTML in Markdown mit Python zu konvertieren. Dieses Tutorial zeigt, + wie man HTML als Markdown speichert und Markdown schnell aus HTML generiert. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: de +lastmod: 2026-09-19 +og_description: HTML mit Python in Markdown konvertieren. Folgen Sie dieser Anleitung, + um HTML als Markdown zu speichern, Markdown aus HTML zu erzeugen und eine HTML‑zu‑Markdown‑Datei + zu erstellen. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: HTML in Markdown mit Python konvertieren – vollständiger Programmierleitfaden +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Wie man HTML mit Python in Markdown konvertiert – Schritt‑für‑Schritt‑Anleitung +url: /de/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Wie man HTML mit Python in Markdown konvertiert – Schritt‑für‑Schritt‑Anleitung + +Wenn Sie **HTML in Markdown konvertieren** müssen, führt Sie diese Anleitung durch den gesamten Prozess. Sie sehen, wie Sie **HTML als Markdown speichern**, Markdown aus HTML erzeugen und eine *html to markdown file* erstellen, die in Static‑Site‑Generatoren, Dokumentations‑Pipelines oder jedem Workflow verwendet werden kann, der reinen Text‑Markup bevorzugt. + +Das Tutorial deckt alles ab, von der Installation der erforderlichen Bibliothek bis hin zur Behandlung von Sonderfällen wie eingebetteten Bildern und benutzerdefiniertem Formatting. Am Ende haben Sie ein einsatzbereites Skript und ein klares Verständnis dafür, warum jeder Schritt wichtig ist. + +## Voraussetzungen + +- Python 3.8 oder neuer, auf Ihrem Rechner installiert. +- Grundlegende Kenntnisse im Python‑Scripting. +- Zugriff auf ein Terminal oder die Eingabeaufforderung. +- Die `aspose.html`‑Bibliothek (oder ein kompatibles HTML‑to‑Markdown‑Paket). Dieses Tutorial verwendet **Aspose.HTML for Python via .NET**, das die im Code‑Beispiel gezeigten Klassen `HTMLDocument`, `MarkdownSaveOptions` und `Converter` bereitstellt. + +> **Pro‑Tipp:** Wenn Sie eine reine Python‑Lösung bevorzugen, können Sie `aspose.html` durch das Paket `html2text` ersetzen. Der gesamte Ablauf bleibt derselbe. + +## Schritt 1: Installieren der Konvertierungsbibliothek + +Zuerst installieren Sie die Bibliothek, die `HTMLDocument`, `MarkdownSaveOptions` und `Converter` bereitstellt. Führen Sie den folgenden Befehl aus: + +```bash +pip install aspose-html +``` + +Das Paket bündelt die native Engine, die nötig ist, um **generate markdown from html** schnell und mit hoher Treue zu erzeugen. Die Installation ist in der Regel in weniger als einer Minute bei einer normalen Breitbandverbindung abgeschlossen. + +## Schritt 2: Laden des Quell‑HTML‑Dokuments + +Das Laden der HTML‑Datei ist die erste konkrete Aktion in der Konvertierungspipeline. Die Klasse `HTMLDocument` analysiert die Datei und erstellt ein DOM im Speicher, das der Konverter später durchläuft, um Markdown zu erzeugen. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Warum das wichtig ist:** Durch das Erstellen eines `HTMLDocument`‑Objekts stellen Sie sicher, dass komplexe Strukturen – Tabellen, Listen und Inline‑Styles – vor der Konvertierung korrekt interpretiert werden. Das Überspringen dieses Schrittes würde den Konverter zwingen, Rohtext zu lesen, was zu verlorenem Formatting führt. + +## Schritt 3: Konfigurieren der Markdown‑Speicheroptionen + +Das Objekt `MarkdownSaveOptions` ermöglicht es Ihnen, das Ausgabeformat fein abzustimmen. Um **Git‑flavored Markdown** zu erzeugen, setzen Sie die Eigenschaft `formatter` auf `"GIT"`. Das entspricht der Syntax, die von Plattformen wie GitHub, GitLab und Bitbucket verwendet wird. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Sie können auch andere Einstellungen anpassen, wie `preserve_links` oder `code_block_style`, je nachdem, wie Sie **save html as markdown** in nachgelagerten Tools verwenden möchten. + +## Schritt 4: Konvertieren des HTML in Markdown und Speichern des Ergebnisses + +Nachdem das Dokument geladen und die Optionen konfiguriert wurden, rufen Sie die statische Methode `convert_html` auf. Diese Methode liest das DOM, wendet den gewählten Formatter an und schreibt die Ausgabedatei. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Nach dem Ausführen des Skripts finden Sie eine neue Datei namens `output.md` im angegebenen Verzeichnis. Beim Öffnen zeigt sie sauberes, Git‑kompatibles Markdown, das bereit für Versionskontrolle oder Veröffentlichung ist. + +## Schritt 5: Überprüfen der erzeugten Markdown‑Datei + +Ein kurzer Plausibilitätstest hilft Ihnen zu bestätigen, dass die Konvertierung erfolgreich war und dass die **html to markdown file** den erwarteten Inhalt enthält. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Typische Ausgabe für eine einfache HTML‑Seite sieht folgendermaßen aus: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Wenn Sie fehlende Überschriften oder fehlerhafte Listen bemerken, gehen Sie zurück zu **Step 3** und experimentieren Sie mit verschiedenen `formatter`‑Werten (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Fortgeschritten: Umgang mit Bildern und relativen Pfaden + +Wenn das Quell‑HTML Bilder enthält, kann der Konverter diese entweder als Data‑URIs einbetten oder die ursprünglichen `src`‑Attribute beibehalten. Um den **generate markdown from html** Prozess leichtgewichtig zu halten, möchten Sie möglicherweise Bilddateien in einen parallelen Ordner kopieren und Pfade anpassen. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Nach der Konvertierung wird das Markdown Bilder referenzieren wie `![Alt text](images/picture.png)`. Dieser Ansatz funktioniert gut, wenn Sie später **save html as markdown** in einem Static‑Site‑Generator verwenden, der Assets in einem eigenen Ordner erwartet. + +## Vollständiges Skript zum Kopieren und Einfügen + +Unten finden Sie das vollständige, ausführbare Skript, das alle besprochenen Schritte integriert. Speichern Sie es als `convert_html_to_md.py` und führen Sie es mit `python convert_html_to_md.py` aus. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Erwartete Ausgabe + +Das Ausführen des Skripts gibt eine Bestätigungsnachricht aus, gefolgt von den ersten zehn Zeilen der Markdown‑Datei, wie oben gezeigt. Die erzeugte `output.md` kann in jedem Texteditor geöffnet, in VS Code vorgespielt oder in ein Git‑Repository eingecheckt werden. + +## Häufige Fragen und Umgang mit Sonderfällen + +| Frage | Antwort | +|----------|--------| +| **Was, wenn die HTML‑Datei groß ist (> 10 MB)?** | Die Klasse `HTMLDocument` streamt die Eingabe, sodass der Speicherverbrauch moderat bleibt. Erwägen Sie jedoch, das Speicherlimit des Python‑Prozesses zu erhöhen, falls Sie auf `MemoryError` stoßen. | +| **Kann ich einen HTML‑String anstelle einer Datei konvertieren?** | Ja. Verwenden Sie `HTMLDocument.from_string(html_string)` (oder den entsprechenden Konstruktor), bevor Sie `Converter.convert_html` aufrufen. | +| **Wie behalte ich originale HTML‑Kommentare bei?** | Setzen Sie `md_options.preserve_comments = True`. Die Kommentare erscheinen als HTML‑Kommentare (`<!-- … -->`) innerhalb der Markdown‑Datei. | +| **Ist es möglich, ein anderes Markdown‑Dialekt zu verwenden?** | Ändern Sie `md_options.formatter` zu `"COMMONMARK"` oder `"MARKDOWN_EXTRA"`, je nach Zielplattform. | +| **Muss ich die .NET‑Runtime separat installieren?** | Das Paket `aspose-html` enthält die benötigte Runtime für die meisten Plattformen. Unter Linux stellen Sie sicher, dass `libgdiplus` installiert ist (`sudo apt-get install libgdiplus`). | + +## Fazit + +Sie wissen jetzt, wie man **convert HTML to Markdown** mit Python verwendet, wie man **save html as markdown** durchführt und wie man **generate markdown from html** mit feiner Kontrolle über Formatierung und Assets erzeugt. Das Skript demonstriert den gesamten Workflow – vom Laden der Quelldatei bis zur Erzeugung einer sauberen *html to markdown file*, die bereit für Versionskontrolle oder Veröffentlichung ist. + +Als Nächstes erkunden Sie verwandte Themen wie **batch converting multiple HTML files**, die Integration des Konvertierungsschritts in eine CI/CD‑Pipeline oder die Anpassung der Markdown‑Ausgabe für bestimmte Static‑Site‑Generatoren wie Hugo oder Jekyll. Experimentieren Sie mit den verschiedenen `MarkdownSaveOptions`‑Einstellungen, um das Ergebnis an den Style‑Guide Ihres Projekts anzupassen. + +Viel Spaß beim Konvertieren! + +## Was sollten Sie als Nächstes lernen? + +Die folgenden Tutorials behandeln eng verwandte Themen, die auf den in diesem Leitfaden gezeigten Techniken aufbauen. Jede Ressource enthält vollständige, funktionierende Code‑Beispiele mit Schritt‑für‑Schritt‑Erklärungen, um Ihnen zu helfen, zusätzliche API‑Funktionen zu meistern und alternative Implementierungsansätze in Ihren eigenen Projekten zu erkunden. + +- [HTML in Markdown konvertieren in .NET mit Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [HTML in Markdown konvertieren in Aspose.HTML für Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown zu HTML Java – Konvertieren mit 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/german/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/german/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..e0fe175bb4 --- /dev/null +++ b/html/german/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Wie man Funktionen beim Konvertieren von HTML zu Markdown mit Python + aktiviert. Lernen Sie, ein HTML‑Dokument zu konvertieren und HTML als Markdown mit + präziser Funktionssteuerung zu speichern. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: de +lastmod: 2026-09-19 +og_description: Wie man Funktionen beim Konvertieren von HTML zu Markdown aktiviert. + Dieser Leitfaden zeigt Ihnen Schritt für Schritt, wie Sie ein HTML‑Dokument konvertieren + und HTML als Markdown mit feinkörniger Kontrolle speichern. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Wie man Funktionen beim Konvertieren von HTML nach Markdown aktiviert +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Wie man Funktionen beim Konvertieren von HTML in Markdown aktiviert +url: /de/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Wie man Funktionen beim Konvertieren von HTML zu Markdown aktiviert + +Wenn Sie **wie man Funktionen aktiviert** während einer Konvertierung benötigen, bietet Ihnen dieser Leitfaden eine vollständige, ausführbare Lösung. Sie sehen genau, wie man HTML zu Markdown konvertiert, welche Markdown‑Funktionen ausgegeben werden und HTML in einem Durchgang als Markdown speichert. + +Das Beispiel verwendet das beliebte **GroupDocs.Conversion** Python SDK, aber die Konzepte gelten für jede Bibliothek, die das Konfigurieren von Funktionssätzen erlaubt. Am Ende dieses Tutorials können Sie ein HTML‑Dokument konvertieren, nur Links und Absätze behalten und unerwünschte Tabellen, Bilder oder Codeblöcke vermeiden. + +## Was Sie erreichen werden + +* **wie man Funktionen aktiviert** in den Markdown‑Speicheroptionen +* ein klarer **HTML zu Markdown konvertieren**‑Arbeitsablauf +* die Fähigkeit, **wie man HTML konvertiert** mit selektiver Ausgabe +* ein sofort ausführbares Skript, das **HTML‑Dokument konvertiert** und **HTML als Markdown speichert** + +### Voraussetzungen + +* Python 3.8+ installiert +* `groupdocs-conversion`‑Paket (installieren mit `pip install groupdocs-conversion`) +* Eine Beispiel‑HTML‑Datei (`sample.html`) in einem bekannten Verzeichnis + +--- + +## Wie man Funktionen in der Markdown‑Konvertierung aktiviert + +Der erste Schritt besteht darin, ein `MarkdownSaveOptions`‑Objekt zu erstellen und dem Konverter mitzuteilen, welche Elemente Sie behalten möchten. In diesem Tutorial aktivieren wir nur **Links** und **Absätze**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Warum das funktioniert:** +* `HTMLDocument` umschließt die Quelldatei, sodass der Konverter sie lesen kann. +* `MarkdownSaveOptions` enthält alle Konvertierungseinstellungen; die `features`‑Liste ist die Schlüsseleigenschaft, die **wie man Funktionen aktiviert**. +* Durch Zuweisung von `["Link", "Paragraph"]` teilen Sie der Engine mit, nur Markdown‑Links (`[text](url)`) und einfache Absätze auszugeben und Bilder, Tabellen sowie andere Markups zu verwerfen. +* `Converter.convert_html` führt die eigentliche **HTML zu Markdown konvertieren**‑Operation aus und schreibt das Ergebnis in `sample.md`. + +--- + +## Wie man ein HTML‑Dokument mit benutzerdefinierten Optionen konvertiert + +Falls Sie später weitere Funktions‑Flags hinzufügen müssen – z. B. `"Header"` oder `"Bold"` – erweitern Sie einfach die Liste: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +Der gleiche Aufruf von `Converter.convert_html` wird nun diese zusätzlichen Elemente einbeziehen. Dieses Muster ermöglicht es Ihnen, **wie man HTML konvertiert** auf hoch konfigurierbare Weise, ohne eigene Parser zu schreiben. + +--- + +## Wie man HTML als Markdown in einem bestimmten Ordner speichert + +Die Methode `convert_html` akzeptiert einen absoluten oder relativen Ausgabepfad. Um **HTML als Markdown zu speichern** in einem Unterordner namens `output`, passen Sie das dritte Argument an: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Das Ausführen des Skripts erstellt das Verzeichnis `output` (falls es nicht existiert) und schreibt die Markdown‑Datei dorthin. Dieser Ansatz hält Ihr Quell‑HTML und das erzeugte Markdown sauber organisiert. + +--- + +## Vollständiges Skript zum Kopieren und Einfügen + +Unten finden Sie das gesamte Programm, bereit zum Ausführen. Ersetzen Sie `YOUR_DIRECTORY` durch den Pfad, der `sample.html` enthält. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Erwartete Ausgabe** (in der Konsole ausgegeben): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Öffnen Sie `sample.md` und Sie sehen nur Markdown‑Links und einfache Absätze, zum Beispiel: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Alle anderen HTML‑Elemente wurden weggelassen, weil **wie man Funktionen aktiviert** die Ausgabe auf die beiden ausgewählten Typen beschränkt hat. + +--- + +## Häufige Fragen und Sonderfälle + +| Frage | Antwort | +|----------|--------| +| *Was ist, wenn die HTML‑Datei keine Links enthält?* | Der Konverter schreibt weiterhin die Absätze; die Ausgabe enthält reinen Text ohne Link‑Syntax. | +| *Kann ich alle Funktionen deaktivieren?* | Durch das Setzen von `markdown_options.features = []` entsteht eine leere Markdown‑Datei. Verwenden Sie dies nur zu Testzwecken. | +| *Wie geht das SDK mit ungültigem HTML um?* | Der Parser versucht, fehlerhaftes Markup zu bereinigen, bevor der Funktionsfilter angewendet wird. Fehler werden protokolliert, stoppen jedoch nicht die Konvertierung. | +| *Ist es möglich, Bilder zu behalten und Tabellen zu entfernen?* | Ja. Setzen Sie `markdown_options.features = ["Link", "Paragraph", "Image"]`. Die Funktionsliste ist additiv, nicht exklusiv. | +| *Was ist, wenn ich viele Dateien in einem Ordner konvertieren muss?* | Kapseln Sie die Konvertierungslogik in einer Schleife, die über `Path.glob("*.html")` iteriert. Die gleiche **wie man Funktionen aktiviert**‑Konfiguration kann für jede Datei wiederverwendet werden. | + +**Pro‑Tipp:** Beim Verarbeiten großer Stapel sollten Sie `MarkdownSaveOptions` einmal instanziieren und wiederverwenden. Das reduziert den Overhead bei der Objekterstellung und hält die **HTML zu Markdown konvertieren**‑Pipeline schnell. + +--- + +## Fazit + +Sie wissen jetzt, **wie man Funktionen aktiviert**, wenn Sie **HTML zu Markdown konvertieren**, wie man **wie man HTML konvertiert** mit selektiver Ausgabe, und wie man **HTML‑Dokument konvertiert** und **HTML als Markdown speichert** mithilfe eines knappen Python‑Skripts. Durch die Konfiguration von `MarkdownSaveOptions.features` erhalten Sie die volle Kontrolle über die Markdown‑Elemente, die in der endgültigen Datei erscheinen. + +### Nächste Schritte + +* Untersuchen Sie zusätzliche Funktions‑Flags wie `"Header"`, `"Bold"` und `"Italic"`, um Ihre Markdown‑Ausgabe zu erweitern. +* Kombinieren Sie dieses Skript mit einem Datei‑Watcher (z. B. `watchdog`), um neue HTML‑Dateien automatisch zu konvertieren, sobald sie eintreffen. +* Lesen Sie die [GroupDocs.Conversion Python SDK Dokumentation](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) für erweiterte Szenarien wie PDF‑zu‑Markdown oder DOCX‑zu‑HTML‑Konvertierungen. + +Fühlen Sie sich frei, mit verschiedenen Funktions‑Sets zu experimentieren und Ihre Erkenntnisse mit der Community zu teilen. Viel Spaß beim Konvertieren! + +## Was sollten Sie als Nächstes lernen? + +Die folgenden Tutorials behandeln eng verwandte Themen, die auf den in diesem Leitfaden gezeigten Techniken aufbauen. Jede Ressource enthält vollständige, funktionierende Code‑Beispiele mit Schritt‑für‑Schritt‑Erklärungen, um Ihnen zu helfen, zusätzliche API‑Funktionen zu meistern und alternative Implementierungsansätze in Ihren eigenen Projekten zu erkunden. + +- [HTML zu Markdown konvertieren in Aspose.HTML für Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown zu HTML Java – Konvertieren mit Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [Wie man JavaScript in Aspose HTML aktiviert – HTML laden & Text erhalten](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/german/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/german/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..0b3a6d7e70 --- /dev/null +++ b/html/german/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,247 @@ +--- +category: general +date: 2026-09-19 +description: Erfahren Sie, wie Sie verschachtelte Ressourcen in Aspose.HTML für Python + mit ResourceHandlingOptions begrenzen können. Steuern Sie die maximale Verarbeitungstiefe + und vermeiden Sie Endlosschleifen. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: de +lastmod: 2026-09-19 +og_description: Begrenzen Sie verschachtelte Ressourcen in Aspose.HTML für Python + mithilfe von ResourceHandlingOptions. Legen Sie die maximale Verarbeitungstiefe + fest, um tiefe Rekursion zu verhindern und die Leistung zu verbessern. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Wie man verschachtelte Ressourcen in Aspose.HTML für Python einschränkt + – Schritt‑für‑Schritt‑Anleitung +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Wie man verschachtelte Ressourcen beim Verarbeiten von HTML mit Aspose.HTML + für Python begrenzt +url: /de/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Wie man verschachtelte Ressourcen beim Verarbeiten von HTML mit Aspose.HTML für Python begrenzt + +Wenn Sie **verschachtelte Ressourcen** beim Rendern oder Konvertieren von HTML **begrenzen** müssen, zeigt Ihnen diese Anleitung die genauen Schritte zur Konfiguration von Aspose.HTML für Python. Die Kontrolle der Tiefe der Ressourcenverarbeitung verhindert unkontrollierte Rekursion, wenn eine Seite viele Ebenen von CSS-, JavaScript‑ oder Bildreferenzen enthält. + +Das Begrenzen verschachtelter Ressourcen ist besonders wichtig für groß angelegte Crawler, E‑Mail‑Render‑Pipelines oder jede automatisierte Arbeitsablauf, der innerhalb von Speicher‑ und Zeitbudgets bleiben muss. In den folgenden Abschnitten erfahren Sie, warum Sie ein Tiefenlimit setzen sollten, wie Sie die Klasse `ResourceHandlingOptions` verwenden und wie Sie überprüfen, dass das Limit wie erwartet funktioniert. + +## Warum Sie verschachtelte Ressourcen begrenzen sollten + +HTML‑Dokumente verweisen häufig auf andere Ressourcen – Stylesheets, Skripte, Bilder, Schriftarten oder sogar andere HTML‑Dateien. Jede dieser Ressourcen kann wiederum weitere Dateien referenzieren und so einen Abhängigkeitsbaum bilden. Ohne Schutz kann dieser Baum beliebig tief werden: + +* Eine Seite lädt eine CSS‑Datei, die eine weitere CSS‑Datei importiert, die wiederum eine weitere importiert usw. +* JavaScript kann dynamisch zusätzliche Skripte laden. +* Eine E‑Mail‑Vorlage kann Bilder einbetten, die externe URLs referenzieren, die wiederum auf weitere Assets weiterleiten. + +Wenn die Rekursionstiefe unkontrolliert wächst, riskieren Sie: + +* **Exzessiven Speicherverbrauch** – jede abgerufene Ressource belegt Puffer. +* **Längere Verarbeitungszeiten** – die Netzwerklatenz multipliziert sich mit jeder Ebene. +* **Mögliche Endlosschleifen** – zirkuläre Referenzen können dazu führen, dass die Engine nie zurückkehrt. + +Das Setzen einer **maximalen Verarbeitungstiefe** weist Aspose.HTML an, nach einer bestimmten Anzahl von Ebenen keine weiteren Ressourcen‑Links mehr zu folgen, wodurch eine vorhersehbare Leistung gewährleistet wird. + +## Wie Sie verschachtelte Ressourcen in Aspose.HTML für Python begrenzen + +Aspose.HTML stellt die Klasse `ResourceHandlingOptions` bereit, die eine Eigenschaft `max_handling_depth` enthält. Durch Zuweisung eines numerischen Werts (z. B. `3`) weisen Sie die Engine an, nach drei verschachtelten Ebenen aufzuhören. + +Im Folgenden finden Sie ein vollständiges, ausführbares Beispiel, das den gesamten Workflow demonstriert: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Erklärung der einzelnen Schritte + +1. **Paket installieren** – Das `aspose-html`‑Wheel wird benötigt. Der `pip install`‑Befehl ist als Kommentar zur Vollständigkeit angegeben. +2. **Klassen importieren** – `HtmlDocument` lädt die Seite, `ResourceHandlingOptions` hält das Limit, und `HtmlLoadOptions` verbindet beides. +3. **Options‑Objekt erstellen** – Durch Instanziieren von `ResourceHandlingOptions` erhalten Sie einen veränderbaren Container. +4. **`max_handling_depth` setzen** – Weisen Sie `3` (oder eine beliebige ganze Zahl) zu, um die Engine auf drei Ebenen verschachtelter Ressourcen zu beschränken. Dies ist der Kern von **verschachtelte Ressourcen begrenzen**. +5. **Optionen der Laderkonfiguration zuweisen** – `HtmlLoadOptions` ermöglicht das Übergeben von `resource_options` an den Loader. +6. **HTML laden** – Der Konstruktor von `HtmlDocument` akzeptiert eine URL oder einen Dateipfad zusammen mit `load_options`. Die Engine beachtet nun das Tiefenlimit. +7. **Überprüfen** – Durch Iterieren über `document.resources` können Sie sehen, wie viele Ressourcen tatsächlich abgerufen wurden und welche tiefste Ebene erreicht wurde. Wenn die tiefste Ebene `3` oder niedriger ist, war das Limit erfolgreich. +8. **Speichern** – Das verarbeitete Dokument persistieren. Die gespeicherte Datei enthält nur die Ressourcen bis zur erlaubten Tiefe. + +#### Erwartete Ausgabe + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +Die Zahlen variieren je nach Quellseite, aber die tiefste Ebene sollte niemals `3` überschreiten, da wir `max_handling_depth = 3` gesetzt haben. + +## Häufige Varianten und Sonderfälle + +### Ändern des Tiefenlimits + +Je nach Umgebung benötigen Sie möglicherweise ein tieferes oder flacheres Limit: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Das Limit vollständig deaktivieren + +Setzt man die Eigenschaft auf `0`, entfernt Aspose.HTML **jede Tiefenbeschränkung**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Tun Sie dies nur, wenn Sie sicher sind, dass das Quell‑HTML sich korrekt verhält. + +### Umgang mit zirkulären Referenzen + +Selbst bei einem Tiefenlimit können zirkuläre Referenzen auf derselben Ebene auftreten. Aspose.HTML erkennt Zyklen und stoppt das Laden einer Ressource, die bereits verarbeitet wurde, unabhängig von der Tiefeneinstellung. Ein niedrigeres `max_handling_depth` reduziert jedoch die Wahrscheinlichkeit, überhaupt in einen Zyklus zu geraten. + +### Verwendung des Limits mit lokalen Dateien + +Der gleiche Ansatz funktioniert für lokale HTML‑Dateien: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +Die Engine behandelt relative `href`‑ oder `src`‑Attribute genauso wie entfernte URLs und wendet das Tiefenlimit auch auf Dateisystem‑Ressourcen an. + +### Integration mit anderen Aspose.HTML‑Funktionen + +Wenn Sie zusätzlich **Ressourcen‑Download‑Timeouts** steuern müssen, können Sie `ResourceHandlingOptions` mit `NetworkOptions` kombinieren: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Beide Optionen sind unabhängig, sodass Sie Leistung und Sicherheit gleichzeitig feinjustieren können. + +## Profi‑Tipps für den Produktionseinsatz + +* **Ressourcen‑Baum protokollieren** – Beim Debuggen iterieren Sie über `document.resources` und loggen die URL sowie die Tiefe jeder Ressource. Das hilft zu verstehen, warum eine bestimmte Seite Ihre Erwartungen überschreitet. +* **Abgerufene Ressourcen cachen** – Wenn Sie dieselben externen Assets wiederholt verarbeiten, aktivieren Sie Caching, um redundante Netzwerkaufrufe zu vermeiden. +* **Mit einer Whitelist kombinieren** – Wenn nur bestimmte Domains vertrauenswürdig sind, filtern Sie `document.resources` nach dem Laden und verwerfen Sie alle, die außerhalb der Whitelist liegen. +* **Mit Randfällen testen** – Erstellen Sie eine synthetische HTML‑Datei, die eine Kette von 10 CSS‑Dateien importiert. Verifizieren Sie, dass Ihr Limit die Kette wie gewünscht abschneidet. + +## Fazit + +Sie wissen jetzt, wie Sie **verschachtelte Ressourcen** in Aspose.HTML für Python durch Konfiguration von `ResourceHandlingOptions.max_handling_depth` begrenzen. Das Setzen eines Tiefenlimits schützt Ihre Anwendung vor übermäßigem Speicherverbrauch, langen Verarbeitungszeiten und potenziellen Endlosschleifen, die durch tief verschachtelte oder zirkuläre Ressourcenreferenzen entstehen. + +Ab jetzt können Sie: + +* Die Tiefe an Ihr Leistungsbudget anpassen (`resource_handling_options.max_handling_depth`). +* Das Limit mit Netzwerk‑Timeouts, Caching oder Domain‑Whitelists kombinieren, um robuste Pipelines zu bauen. +* Verwandte Themen wie **resource handling options**, **max handling depth** und **nested resource handling** erkunden, um die Kontrolle über die HTML‑Verarbeitung weiter zu verfeinern. + +Experimentieren Sie mit verschiedenen Tiefenwerten und beobachten Sie, wie sich die Anzahl geladener Ressourcen ändert. Wenn Sie bereit sind, integrieren Sie dieses Muster in Ihren größeren HTML‑Konvertierungs‑ oder Rendering‑Service, um vorhersehbare, sichere und effiziente Ausführungen zu gewährleisten. + +## Was sollten Sie als Nächstes lernen? + + +Die folgenden Tutorials behandeln eng verwandte Themen, die auf den in diesem Leitfaden gezeigten Techniken aufbauen. Jede Ressource enthält vollständige, funktionierende Code‑Beispiele mit Schritt‑für‑Schritt‑Erklärungen, damit Sie weitere API‑Funktionen meistern und alternative Implementierungsansätze in Ihren eigenen Projekten erkunden können. + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/german/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/german/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..50f849592f --- /dev/null +++ b/html/german/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,259 @@ +--- +category: general +date: 2026-09-19 +description: Lernen Sie ein HTML‑zu‑PDF‑Tutorial in Python, das zeigt, wie man PDF + schnell aus HTML mit Aspose.HTML generiert. Folgen Sie jetzt der Schritt‑für‑Schritt‑Anleitung. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: de +lastmod: 2026-09-19 +og_description: 'HTML-zu-PDF-Tutorial: Konvertieren Sie jede HTML-Seite in eine PDF-Datei + mit Python und Aspose.HTML. Dieser Leitfaden zeigt, wie Sie in wenigen Minuten PDF + aus HTML erzeugen.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: HTML‑zu‑PDF‑Tutorial in Python – vollständige Schritt‑für‑Schritt‑Anleitung +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Wie man ein HTML-zu-PDF-Tutorial mit Python durchführt +url: /de/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Wie man ein HTML‑zu‑PDF‑Tutorial mit Python durchführt + +Wenn Sie ein **HTML‑zu‑PDF‑Tutorial** benötigen, zeigt Ihnen dieser Leitfaden genau, wie Sie mit nur wenigen Zeilen Python‑Code ein PDF aus HTML erzeugen können. Egal, ob Sie die Berichtserstellung automatisieren oder Web‑Inhalte für die Offline‑Anzeige exportieren, die Aspose.HTML‑Bibliothek macht die Konvertierung mühelos. + +In diesem Tutorial lernen Sie, wie Sie die Umgebung einrichten, das Konvertierungsskript schreiben und gängige Sonderfälle wie fehlende Dateien oder benutzerdefinierte Seiteneinstellungen behandeln. Am Ende können Sie **PDFs erzeugen** aus jeder HTML‑Quelle, ohne das Python‑Ökosystem zu verlassen. + +## Was Sie benötigen + +* Python 3.8 oder neuer installiert +* Eine aktive Aspose.HTML‑für‑Python‑Lizenz (eine kostenlose Testversion reicht für die Evaluierung) +* `pip`‑Zugriff, um das `aspose-html`‑Paket zu installieren +* Eine einfache HTML‑Datei, die Sie konvertieren möchten (z. B. `input.html`) + +> **Pro‑Tipp:** Bewahren Sie Ihr HTML und die zugehörigen Assets (Bilder, CSS) im selben Verzeichnis auf, um Pfadauflösungsprobleme während der Konvertierung zu vermeiden. + +## Schritt 1: Das Aspose.HTML‑Paket installieren + +Öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus: + +```bash +pip install aspose-html +``` + +Das `aspose-html`‑Wheel enthält die nativen Bibliotheken, die für ein Rendering in hoher Qualität erforderlich sind, sodass keine zusätzlichen Systemabhängigkeiten nötig sind. + +## Schritt 2: Ein minimales Python‑Skript erstellen + +Erstellen Sie eine neue Datei mit dem Namen `convert_html_to_pdf.py` und fügen Sie den untenstehenden Code ein. Dieses Skript folgt dem **HTML‑zu‑PDF‑Tutorial**‑Muster eines dreischrittigen Prozesses: Import, Pfade definieren und die Konvertierung aufrufen. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Warum das funktioniert + +* **Importieren von `Converter`** gibt Ihnen Zugriff auf eine High‑Level‑API, die die Rendering‑Engine abstrahiert. +* **Definieren absoluter Pfade** verhindert Fehler durch relative Pfade, wenn das Skript aus einem anderen Arbeitsverzeichnis ausgeführt wird. +* **`Converter.convert_html`** führt die gesamte Rendering‑Pipeline – HTML‑Parsing, CSS‑Layout und PDF‑Serialisierung – in einem Aufruf aus, was die empfohlene Methode ist, **PDFs schnell zu erzeugen**. + +## Schritt 3: Das Skript ausführen und die Ausgabe überprüfen + +Führen Sie das Skript im Terminal aus: + +```bash +python convert_html_to_pdf.py +``` + +Wenn alles korrekt eingerichtet ist, sehen Sie: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Öffnen Sie `output.pdf` mit einem beliebigen PDF‑Betrachter. Das Dokument sollte identisch zur ursprünglichen HTML‑Seite aussehen, einschließlich Schriftarten, Bildern und grundlegender CSS‑Formatierung. + +![Generated PDF preview](https://example.com/images/pdf-preview.png "Screenshot des erzeugten PDFs aus HTML mit Python"){: .center-image alt="Screenshot eines PDFs, das aus einer HTML‑Datei mit Python erzeugt wurde"} + +## Schritt 4: Anpassung der Konvertierung (optional) + +Das grundlegende **HTML‑zu‑PDF‑Tutorial** behandelt eine 1‑zu‑1‑Konvertierung, aber reale Szenarien erfordern häufig Anpassungen: + +| Anforderung | Wie man es mit Aspose.HTML erreicht | +|-------------|--------------------------------------| +| Seitengröße festlegen (A4, Letter) | Ein `PdfSaveOptions`‑Objekt an `convert_html` übergeben | +| Ränder oder Kopf‑/Fußzeilen hinzufügen | `PdfPageSettings` innerhalb der Optionen verwenden | +| Benutzerdefinierte Schriftarten einbetten | Sicherstellen, dass die Schriftdateien erreichbar sind, und `FontSettings` setzen | + +Unten finden Sie ein Beispiel, das die Seitengröße auf A4 setzt und einen Rand von 1 Zoll hinzufügt: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Hinweis:** Die Verwendung benutzerdefinierter Optionen ist die bevorzugte **PDF‑Erzeugung aus HTML**‑Technik, wenn Sie eine präzise Kontrolle über das Layout benötigen. + +## Schritt 5: Umgang mit mehreren HTML‑Dateien (Batch‑Konvertierung) + +Wenn Sie einen Ordner voller HTML‑Berichte haben, können Sie diese durchlaufen: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Dieses Snippet demonstriert einen skalierbaren **Python‑HTML‑zu‑PDF‑**Workflow, der in CI‑Pipelines oder geplante Jobs passt. + +## Häufige Fallstricke und wie man sie vermeidet + +| Problem | Ursache | Lösung | +|-------|-------|-----| +| Fehlende Bilder im PDF | Relative Bildpfade, die brechen, wenn das Skript aus einem anderen Ordner ausgeführt wird | Absolute Pfade verwenden oder `base_uri` in den `Converter`‑Optionen setzen | +| CSS wird nicht angewendet | Externes Stylesheet, das über eine URL referenziert wird und Internetzugang erfordert | Das Stylesheet lokal herunterladen und mit einem relativen Pfad referenzieren | +| Schriftart‑Ersetzung | Schriftart nicht auf dem Host‑System installiert | Schriftdatei ins Projekt einbinden und `FontSettings` konfigurieren | + +Die Behandlung dieser Sonderfälle stellt sicher, dass Ihr **HTML‑Export als PDF**‑Prozess in verschiedenen Umgebungen robust ist. + +## Vollständiges, ausführbares Beispiel + +Unten finden Sie das vollständige Skript, das optionale Einstellungen, Fehlerbehandlung und Batch‑Verarbeitungslogik enthält. Kopieren Sie es in `full_html_to_pdf.py` und führen Sie es wie zuvor gezeigt aus. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Durch das Ausführen dieses Skripts wird für jede HTML‑Datei im Zielverzeichnis ein PDF erzeugt, wobei konsistente Seiteneinstellungen angewendet werden – eine vollständige **Python‑HTML‑zu‑PDF**‑Lösung, die produktionsreif ist. + +## Fazit + +Sie haben nun ein praktisches **HTML‑zu‑PDF‑Tutorial**, das zeigt, wie man PDF‑Dateien aus HTML mit Python und Aspose.HTML erzeugt. Der Leitfaden behandelte die Einrichtung der Umgebung, ein minimales Konvertierungsskript, optionale Anpassungen, Batch‑Verarbeitung und Tipps zur Fehlersuche. + +Ab hier können Sie verwandte Themen erkunden, wie **PDFs mit Wasserzeichen erzeugen**, mehrere PDFs zusammenführen oder HTML in andere Formate wie DOCX konvertieren. Experimentieren Sie mit der `PdfSaveOptions`‑API, um die Ausgabe fein abzustimmen, und integrieren Sie das Skript in Web‑Services oder automatisierte Reporting‑Pipelines. + +Viel Spaß beim Programmieren und beim Umwandeln Ihrer HTML‑Inhalte in professionelle PDFs! + +## Was Sie als Nächstes lernen sollten + +Die folgenden Tutorials behandeln eng verwandte Themen, die auf den in diesem Leitfaden gezeigten Techniken aufbauen. Jede Ressource enthält vollständige funktionierende Code‑Beispiele mit Schritt‑für‑Schritt‑Erklärungen, um Ihnen zu helfen, weitere API‑Funktionen zu meistern und alternative Implementierungsansätze in Ihren eigenen Projekten zu erkunden. + +- [HTML zu PDF mit Aspose.HTML – Vollständige Schritt‑für‑Schritt‑Anleitung](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [HTML zu PDF mit Aspose.HTML – Vollständiger Manipulations‑Leitfaden](/html/english/) +- [Wie man HTML zu PDF in Java konvertiert – Mit Aspose.HTML für Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/greek/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/greek/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..52d5bfc56b --- /dev/null +++ b/html/greek/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,265 @@ +--- +category: general +date: 2026-09-19 +description: Μάθετε πώς να αλλάξετε τον τίτλο σε ένα αρχείο HTML με την Python. Αυτός + ο οδηγός καλύπτει την ανάγνωση του HTML, την ενημέρωση της ετικέτας τίτλου και την + αποθήκευση του τροποποιημένου HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: el +lastmod: 2026-09-19 +og_description: Πώς να αλλάξετε τον τίτλο σε ένα αρχείο HTML με Python. Ακολουθήστε + αυτό το πλήρες παράδειγμα για να διαβάσετε το HTML, να ενημερώσετε την ετικέτα title + και να αποθηκεύσετε το τροποποιημένο έγγραφο. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Πώς να αλλάξετε τον τίτλο σε ένα αρχείο HTML χρησιμοποιώντας Python – βήμα‑βήμα + οδηγός +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Πώς να αλλάξετε τον τίτλο σε ένα αρχείο HTML χρησιμοποιώντας Python +url: /el/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Πώς να αλλάξετε τον τίτλο σε ένα αρχείο HTML χρησιμοποιώντας Python + +Αν χρειάζεστε **πώς να αλλάξετε τον τίτλο** σε ένα έγγραφο HTML προγραμματιστικά, η Python κάνει τη δουλειά απλή. Σε αυτό το tutorial θα διαβάσετε ένα αρχείο HTML, θα ενημερώσετε το στοιχείο `<title>` και θα αποθηκεύσετε το τροποποιημένο HTML ξανά στο δίσκο — όλα με σαφή, εκτελέσιμο κώδικα. + +Η αλλαγή του τίτλου της σελίδας είναι ένα συνηθισμένο βήμα όταν δημιουργείτε στατικές ιστοσελίδες, προσαρμόζετε σελίδες που έχετε «σκάψει», ή αυτοματοποιείτε ενημερώσεις SEO. Στο τέλος αυτού του οδηγού θα ξέρετε πώς να **ενημερώσετε τον τίτλο html**, πώς να **διαβάσετε html με python**, και πώς να **αποθηκεύσετε τροποποιημένο html** με ασφάλεια. + +## Προαπαιτούμενα + +Πριν ξεκινήσετε, βεβαιωθείτε ότι έχετε: + +- Python 3.8 ή νεότερη έκδοση εγκατεστημένη +- Το πακέτο `beautifulsoup4` (`pip install beautifulsoup4`) +- Ένα αρχείο HTML που θέλετε να επεξεργαστείτε (το παράδειγμα χρησιμοποιεί το `index.html` σε φάκελο της επιλογής σας) + +Δεν απαιτούνται εξωτερικές υπηρεσίες· όλα εκτελούνται τοπικά. + +## Βήμα 1: Φόρτωση του αρχείου HTML με Python + +Το πρώτο καθήκον είναι να **φορτώσετε το αρχείο html με python**‑style. Η χρήση του `BeautifulSoup` σας παρέχει έναν ανεκτικό parser που λειτουργεί ακόμη και με ατελή markup. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Γιατί είναι σημαντικό αυτό το βήμα:* +Το `BeautifulSoup` δημιουργεί μια αναπαράσταση δέντρου, επιτρέποντάς σας να ερωτήσετε και να τροποποιήσετε στοιχεία χωρίς χειροκίνητη διαχείριση συμβολοσειρών. Ο ενσωματωμένος `html.parser` είναι γρήγορος και δεν απαιτεί επιπλέον δυαδικά αρχεία. + +## Βήμα 2: Εντοπισμός του στοιχείου `<title>` + +Τα έγγραφα HTML συνήθως περιέχουν ένα μόνο στοιχείο `<title>` μέσα στο `<head>`. Ανακτούμε την πρώτη εμφάνιση, η οποία ικανοποιεί την απαίτηση **ενημέρωσης του τίτλου html**. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Γιατί ελέγχουμε το `None`*: +Κάποια τμήματα HTML μπορεί να μην έχουν τίτλο. Η αυτόματη προσθήκη του αποτρέπει μελλοντικά σφάλματα και διατηρεί το script ανθεκτικό. + +## Βήμα 3: Αλλαγή του κειμένου του τίτλου + +Τώρα **ενημερώνουμε τον τίτλο html** αναθέτοντας νέο κείμενο στη συμβολοσειρά του στοιχείου. Αυτό είναι το κεντρικό μέρος της λειτουργίας **πώς να αλλάξετε τον τίτλο**. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +Το χαρακτηριστικό `string` αντιπροσωπεύει τον κόμβο κειμένου μέσα στο `<title>`. Η αντικατάστασή του ενημερώνει το DOM στη μνήμη. + +## Βήμα 4: Αποθήκευση του τροποποιημένου HTML + +Τέλος, γράψτε το τροποποιημένο έγγραφο σε νέο αρχείο. Αυτό ολοκληρώνει το βήμα **αποθήκευσης τροποποιημένου html** και αφήνει το αρχικό ανέπαφο. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +Η μέθοδος `prettify()` μορφοποιεί την έξοδο με εσοχές, καθιστώντας το αρχείο εύκολο στην ανάγνωση μετά την αλλαγή. + +### Αναμενόμενη έξοδος + +Η εκτέλεση του script σε ένα δείγμα `index.html` που αρχικά περιέχει: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +παράγει έξοδο στην κονσόλα παρόμοια με: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +Το αποθηκευμένο `index_modified.html` θα ξεκινά τώρα με: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Πλήρες script για γρήγορη αντιγραφή‑επικόλληση + +Παρακάτω βρίσκεται το ολοκληρωμένο, έτοιμο‑για‑εκτέλεση πρόγραμμα που συνδυάζει και τα τέσσερα βήματα. Αποθηκεύστε το ως `change_title.py` και προσαρμόστε το `YOUR_DIRECTORY` όπως χρειάζεται. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Εκτελέστε το script: + +```bash +python change_title.py +``` + +Θα δείτε τα μηνύματα στην κονσόλα και ένα νέο αρχείο `index_modified.html` με τον ενημερωμένο τίτλο. + +## Πρόσθετες συμβουλές και ειδικές περιπτώσεις + +| Κατάσταση | Τι πρέπει να κάνετε | +|-----------|--------------------| +| **Πολλαπλά στοιχεία `<title>`** | Η `soup.find_all("title")` επιστρέφει λίστα· ενημερώστε το πρώτο στοιχείο ή επαναλάβετε αν χρειάζεται να αλλάξετε όλα. | +| **Προβλήματα κωδικοποίησης** | Ανοίξτε τα αρχεία με `encoding="utf-8-sig"` αν υπάρχει BOM, ή εντοπίστε την κωδικοποίηση με `chardet`. | +| **Μεγάλα αρχεία HTML** | Χρησιμοποιήστε parser `lxml` (`BeautifulSoup(html_content, "lxml")`) για καλύτερη απόδοση. | +| **Διατήρηση αρχικής μορφοποίησης** | Αν πρέπει να κρατήσετε ακριβώς τα κενά, γράψτε `str(soup)` αντί για `prettify()`. | +| **Αυτοματοποίηση σε πολλά αρχεία** | Τυλίξτε τη λογική σε συνάρτηση και κάντε βρόχο πάνω στο `Path.rglob("*.html")`. | + +Αυτές οι παραλλαγές διατηρούν τον πυρήνα της λογικής **πώς να αλλάξετε τον τίτλο** ενώ προσαρμόζονται σε πραγματικά έργα. + +## Συμπέρασμα + +Τώρα ξέρετε πώς να **πώς να αλλάξετε τον τίτλο** σε οποιοδήποτε έγγραφο HTML χρησιμοποιώντας Python. Το tutorial κάλυψε την ανάγνωση HTML, τον εντοπισμό του στοιχείου `<title>`, την ενημέρωση του κειμένου του και την **αποθήκευση τροποποιημένου html** με ασφάλεια. Με το πλήρες script μπορείτε να ενσωματώσετε αυτό το μοτίβο σε στατικούς δημιουργούς ιστοσελίδων, pipelines SEO, ή οποιαδήποτε αυτοματοποίηση που απαιτεί δυναμικές αλλαγές τίτλου. + +Στη συνέχεια, εξερευνήστε σχετικά θέματα όπως **διαβάστε html με python** για εξαγωγή meta tags, ή τεχνικές **φόρτωσης αρχείου html με python** για χειρισμό εσφαλμένης markup. Πειραματιστείτε με επεξεργασία σε παρτίδες για να ενημερώσετε τίτλους σε ολόκληρο έναν ιστότοπο — η νέα σας δεξιότητα αποτελεί τη βάση για πολλές εργασίες web‑automation. Καλή προγραμματιστική! + +## Τι πρέπει να μάθετε στη συνέχεια; + +Τα παρακάτω tutorials καλύπτουν στενά συναφή θέματα που επεκτείνουν τις τεχνικές που παρουσιάστηκαν σε αυτόν τον οδηγό. Κάθε πόρος περιλαμβάνει πλήρη παραδείγματα κώδικα με βήμα‑βήμα εξηγήσεις για να σας βοηθήσουν να κυριαρχήσετε πρόσθετες δυνατότητες API και να εξερευνήσετε εναλλακτικές προσεγγίσεις υλοποίησης στα δικά σας έργα. + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/greek/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/greek/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..fe769b7282 --- /dev/null +++ b/html/greek/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,202 @@ +--- +category: general +date: 2026-09-19 +description: Μετατροπή τοπικού αρχείου HTML σε PDF χρησιμοποιώντας Python και Aspose.HTML + – ένας πλήρης οδηγός βήμα‑προς‑βήμα που καλύπτει επίσης επιλογές μετατροπής HTML + σε PDF με Python. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: el +lastmod: 2026-09-19 +og_description: Μετατρέψτε το τοπικό αρχείο HTML σε PDF χρησιμοποιώντας Python. Μάθετε + τον καλύτερο τρόπο να μετατρέψετε HTML σε PDF με Python χρησιμοποιώντας το Aspose.HTML, + συμπεριλαμβανομένης της ενσωμάτωσης γραμματοσειρών και της διαχείρισης σφαλμάτων. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Μετατροπή τοπικού αρχείου HTML σε PDF με Python – πλήρης οδηγός +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Πώς να μετατρέψετε ένα τοπικό αρχείο HTML σε PDF με Python +url: /el/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Πώς να μετατρέψετε ένα τοπικό αρχείο HTML σε PDF με Python + +Αν χρειάζεστε **convert local HTML file to PDF** σε ένα έργο Python, αυτό το tutorial σας παρουσιάζει μια έτοιμη λύση. Θα δείτε πώς να ρυθμίσετε τη βιβλιοθήκη Aspose.HTML, να διαμορφώσετε τις επιλογές PDF και να εκτελέσετε τη μετατροπή με λίγες μόνο γραμμές κώδικα. Ο οδηγός εξηγεί επίσης τις βέλτιστες πρακτικές **convert html to pdf python**, ώστε να προσαρμόσετε τον κώδικα στις δικές σας ροές εργασίας. + +Τα παρακάτω βήματα καλύπτουν όλα όσα χρειάζεται να γνωρίζετε: εγκατάσταση του SDK, προετοιμασία των επιλογών αποθήκευσης, αντιμετώπιση κοινών προβλημάτων και επαλήθευση του αποτελέσματος. Στο τέλος του άρθρου θα έχετε μια επαναχρησιμοποιήσιμη συνάρτηση που μπορείτε να ενσωματώσετε σε οποιαδήποτε εφαρμογή Python. + +## Προαπαιτούμενα + +* Έχει εγκατεστημένο Python 3.8 ή νεότερο στο σύστημά σας. +* Ένα ενεργό license Aspose.HTML for Python (η δωρεάν δοκιμή λειτουργεί για αξιολόγηση). +* Ένα τοπικό αρχείο HTML που θέλετε να μετατρέψετε σε PDF (π.χ., `page.html`). + +Δεν χρειάζεστε επιπλέον εξαρτήσεις σε επίπεδο συστήματος· το SDK περιλαμβάνει όλα όσα απαιτούνται για τη δημιουργία PDF. + +## Εγκατάσταση του πακέτου Aspose.HTML + +Το SDK Aspose.HTML διανέμεται μέσω PyPI. Εγκαταστήστε το με `pip` στο εικονικό σας περιβάλλον: + +```bash +pip install aspose-html +``` + +Η εκτέλεση της εντολής εμφανίζει την εγκατεστημένη έκδοση, επιβεβαιώνοντας ότι το πακέτο είναι διαθέσιμο για εισαγωγή. + +## Βήμα 1: Εισαγωγή των απαιτούμενων κλάσεων + +Η ροή εργασίας μετατροπής βασίζεται σε δύο κύριες κλάσεις: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` παρέχει τη στατική μέθοδο `convert_html` που εκτελεί την πραγματική μετατροπή. +* `PDFSaveOptions` σας επιτρέπει να ρυθμίσετε λεπτομερώς την έξοδο PDF, όπως η ενσωμάτωση τυπικών γραμματοσειρών. + +## Βήμα 2: Δημιουργία επιλογών αποθήκευσης PDF και ενεργοποίηση ενσωμάτωσης τυπικών γραμματοσειρών + +Η ενσωμάτωση γραμματοσειρών εγγυάται ότι το παραγόμενο PDF θα φαίνεται το ίδιο σε κάθε συσκευή, ακόμη και αν ο προβολέας δεν έχει τις γραμματοσειρές εγκατεστημένες τοπικά. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Ο ορισμός του `embed_standard_fonts` σε `True` συνιστάται για τις περισσότερες παραγωγικές περιπτώσεις, επειδή εξαλείφει τις προειδοποιήσεις αντικατάστασης γραμματοσειρών στους αναγνώστες PDF. + +## Βήμα 3: Μετατροπή του αρχείου HTML σε PDF χρησιμοποιώντας τις ρυθμισμένες επιλογές + +Τώρα καλέστε το `Converter.convert_html`, περνώντας τη διαδρομή του πηγαίου HTML, τη διαδρομή του προορισμού PDF και το αντικείμενο επιλογών που προετοιμάσατε: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Αν η μετατροπή ολοκληρωθεί επιτυχώς, η μέθοδος επιστρέφει `None` και το αρχείο PDF εμφανίζεται στην τοποθεσία που καθορίσατε. + +## Πλήρες παράδειγμα σε επαναχρησιμοποιήσιμη συνάρτηση + +Η ενσωμάτωση της λογικής σε συνάρτηση καθιστά εύκολη την επαναχρήση σε πολλά έργα: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Γιατί η συνάρτηση βοηθά + +* **Επικύρωση εισόδου** – Το `FileNotFoundError` διευκολύνει τον εντοπισμό σφαλμάτων όταν η διαδρομή του HTML είναι λανθασμένη. +* **Αυτόματη δημιουργία καταλόγου** – Το `os.makedirs(..., exist_ok=True)` αποτρέπει σφάλματα “ο φάκελος δεν υπάρχει”. +* **Διαμορφώσιμη ενσωμάτωση γραμματοσειρών** – Μπορείτε να απενεργοποιήσετε την ενσωμάτωση γραμματοσειρών για μικρότερα αρχεία εάν γνωρίζετε ότι το περιβάλλον προορισμού διαθέτει ήδη τις απαιτούμενες γραμματοσειρές. + +## Συνηθισμένες ακραίες περιπτώσεις και πώς να τις αντιμετωπίσετε + +| Κατάσταση | Προτεινόμενη αντιμετώπιση | +|-----------|---------------------------| +| **HTML περιέχει εξωτερικό CSS ή εικόνες** | Χρησιμοποιήστε απόλυτες URL ή αντιγράψτε τους πόρους δίπλα στο αρχείο HTML· το Aspose.HTML ακολουθεί τους ίδιους κανόνες με ένα πρόγραμμα περιήγησης. | +| **Μεγάλα αρχεία HTML (>10 MB)** | Αυξήστε το προεπιλεγμένο όριο μνήμης ορίζοντας `pdf_options.memory_limit` εάν αντιμετωπίσετε `OutOfMemoryException`. | +| **Χρειάζεστε PDF με κωδικό πρόσβασης** | Ορίστε `pdf_options.encryption_details` με κωδικό χρήστη πριν καλέσετε το `convert_html`. | +| **Εκτέλεση σε headless server** | Δεν απαιτείται πρόσθετη ρύθμιση· το SDK δεν εξαρτάται από γραφικό περιβάλλον. | + +Η προληπτική αντιμετώπιση αυτών των σεναρίων σας προστατεύει από απρόσμενα σφάλματα χρόνου εκτέλεσης. + +## Επαλήθευση του αποτελέσματος μετατροπής + +Αφού ολοκληρωθεί το script, ανοίξτε το παραγόμενο PDF με οποιονδήποτε προβολέα (Adobe Reader, Chrome κ.λπ.). Η οπτική διάταξη θα πρέπει να ταιριάζει με το αρχικό HTML και όλες οι γραμματοσειρές να εμφανίζονται σωστά επειδή ενσωματώθηκαν. + +Μπορείτε επίσης προγραμματιστικά να επιβεβαιώσετε ότι το αρχείο υπάρχει και έχει μη μηδενικό μέγεθος: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Συμβουλές για παραγωγική χρήση + +* **Επεξεργασία παρτίδας** – Επανάληψη πάνω σε λίστα αρχείων HTML και κλήση του `html_to_pdf` για κάθε ένα· επαναχρησιμοποιήστε ένα μόνο αντικείμενο `PDFSaveOptions` για να μειώσετε το κόστος δημιουργίας αντικειμένων. +* **Καταγραφή (Logging)** – Ενσωματώστε το module `logging` της Python για να καταγράψετε χρονικές σφραγίδες μετατροπής και τυχόν εξαιρέσεις. +* **Απόδοση** – Όταν μετατρέπετε πολλά αρχεία, σκεφτείτε την εκτέλεση μετατροπών παράλληλα με χρήση του `concurrent.futures.ThreadPoolExecutor`, αλλά θυμηθείτε ότι το SDK είναι thread‑safe μόνο για ξεχωριστές κλήσεις `Converter`. + +## Συμπέρασμα + +Τώρα έχετε μια πλήρη, έτοιμη για παραγωγή μέθοδο για **convert local HTML file to PDF** χρησιμοποιώντας Python. Η λύση καλύπτει τα βασικά βήματα—εγκατάσταση Aspose.HTML, διαμόρφωση επιλογών PDF, αντιμετώπιση κοινών ακραίων περιπτώσεων και επαλήθευση του αποτελέσματος—ενώ παράλληλα παρουσιάζει τη γενικότερη ροή εργασίας **convert html to pdf python**. + +Από εδώ μπορείτε να εξερευνήσετε προχωρημένα χαρακτηριστικά όπως κρυπτογράφηση PDF, προσαρμοσμένα μεγέθη σελίδας ή προσθήκη υδατογραφήματος, όλα υποστηριζόμενα από το ίδιο SDK. Πειραματιστείτε με τις επιλογές που ταιριάζουν καλύτερα στο έργο σας και θα μπορείτε να αυτοματοποιήσετε αξιόπιστα τη μετατροπή HTML‑σε‑PDF σε οποιοδήποτε περιβάλλον Python. + +--- + +## Τι θα πρέπει να μάθετε στη συνέχεια; + +Τα παρακάτω tutorials καλύπτουν στενά συναφή θέματα που επεκτείνουν τις τεχνικές που παρουσιάζονται σε αυτόν τον οδηγό. Κάθε πόρος περιλαμβάνει πλήρη παραδείγματα κώδικα με βήμα‑βήμα εξηγήσεις για να σας βοηθήσει να κατακτήσετε πρόσθετα χαρακτηριστικά API και να εξερευνήσετε εναλλακτικές προσεγγίσεις υλοποίησης στα δικά σας έργα. + +- [Μετατροπή HTML σε PDF με Aspose.HTML – Πλήρης Οδηγός Βήμα‑βήμα](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Μετατροπή HTML σε PDF με Aspose.HTML – Πλήρης Οδηγός Χειρισμού](/html/english/) +- [Μετατροπή HTML σε PDF σε .NET με Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/greek/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/greek/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..2463cd24dc --- /dev/null +++ b/html/greek/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Μάθετε να μετατρέπετε HTML σε Markdown με Python. Αυτό το σεμινάριο δείχνει + πώς να αποθηκεύετε HTML ως Markdown και να δημιουργείτε Markdown από HTML γρήγορα. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: el +lastmod: 2026-09-19 +og_description: Μετατρέψτε το HTML σε Markdown με Python. Ακολουθήστε αυτόν τον οδηγό + για να αποθηκεύσετε το HTML ως Markdown, να δημιουργήσετε Markdown από HTML και + να δημιουργήσετε ένα αρχείο HTML σε Markdown. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Μετατροπή HTML σε Markdown με Python – πλήρης οδηγός προγραμματισμού +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Πώς να μετατρέψετε το HTML σε Markdown με Python – οδηγός βήμα‑βήμα +url: /el/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Πώς να μετατρέψετε HTML σε Markdown με Python – βήμα‑βήμα οδηγός + +Αν χρειάζεστε **convert HTML to Markdown**, αυτός ο οδηγός σας καθοδηγεί σε όλη τη διαδικασία. Θα δείτε πώς να **save HTML as Markdown**, να δημιουργήσετε Markdown από HTML και να παραγάγετε ένα *html to markdown file* που μπορεί να χρησιμοποιηθεί σε γεννήτριες στατικών ιστοσελίδων, δίκτυα τεκμηρίωσης ή οποιαδήποτε ροή εργασίας που προτιμά σήμανση απλού κειμένου. + +Το tutorial καλύπτει τα πάντα, από την εγκατάσταση της απαιτούμενης βιβλιοθήκης μέχρι τη διαχείριση edge cases όπως ενσωματωμένες εικόνες και προσαρμοσμένη μορφοποίηση. Στο τέλος, θα έχετε ένα script έτοιμο για εκτέλεση και μια σαφή κατανόηση του γιατί κάθε βήμα είναι σημαντικό. + +## Προαπαιτούμενα + +Πριν ξεκινήσετε, βεβαιωθείτε ότι έχετε: + +- Python 3.8 ή νεότερο εγκατεστημένο στο σύστημά σας. +- Βασική εξοικείωση με scripting σε Python. +- Πρόσβαση σε τερματικό ή command prompt. +- Τη βιβλιοθήκη `aspose.html` (ή οποιοδήποτε συμβατό πακέτο HTML‑to‑Markdown). Αυτό το tutorial χρησιμοποιεί **Aspose.HTML for Python via .NET**, το οποίο παρέχει τις κλάσεις `HTMLDocument`, `MarkdownSaveOptions` και `Converter` που φαίνονται στο παράδειγμα κώδικα. + +> **Pro tip:** Αν προτιμάτε μια λύση καθαρά σε Python, μπορείτε να αντικαταστήσετε το `aspose.html` με το πακέτο `html2text`. Η συνολική ροή παραμένει η ίδια. + +## Βήμα 1: Εγκατάσταση της βιβλιοθήκης μετατροπής + +Πρώτα, εγκαταστήστε τη βιβλιοθήκη που παρέχει τις κλάσεις `HTMLDocument`, `MarkdownSaveOptions` και `Converter`. Εκτελέστε την παρακάτω εντολή: + +```bash +pip install aspose-html +``` + +Το πακέτο περιλαμβάνει τη native μηχανή που χρειάζεται για **generate markdown from html** γρήγορα και με υψηλή πιστότητα. Η εγκατάσταση ολοκληρώνεται συνήθως σε λιγότερο από ένα λεπτό με τυπική σύνδεση broadband. + +## Βήμα 2: Φόρτωση του πηγαίου εγγράφου HTML + +Η φόρτωση του αρχείου HTML είναι η πρώτη συγκεκριμένη ενέργεια στην αλυσίδα μετατροπής. Η κλάση `HTMLDocument` αναλύει το αρχείο και δημιουργεί ένα DOM στη μνήμη, το οποίο ο μετατροπέας διαβάζει αργότερα για να παραγάγει Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Why this matters:** Δημιουργώντας ένα αντικείμενο `HTMLDocument`, εξασφαλίζετε ότι πολύπλοκες δομές—πίνακες, λίστες και inline styles—ερμηνεύονται σωστά πριν από τη μετατροπή. Η παράλειψη αυτού του βήματος θα ανάγνιζε το μετατροπέα το ακατέργαστο κείμενο, οδηγώντας σε απώλεια μορφοποίησης. + +## Βήμα 3: Διαμόρφωση των επιλογών αποθήκευσης Markdown + +Το αντικείμενο `MarkdownSaveOptions` σας επιτρέπει να ρυθμίσετε λεπτομερώς τη μορφή εξόδου. Για να παραγάγετε **Git‑flavored Markdown**, ορίστε την ιδιότητα `formatter` σε `"GIT"`. Αυτό ταιριάζει με τη σύνταξη που χρησιμοποιούν πλατφόρμες όπως GitHub, GitLab και Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Μπορείτε επίσης να προσαρμόσετε άλλες ρυθμίσεις, όπως `preserve_links` ή `code_block_style`, ανάλογα με το πώς σκοπεύετε να **save html as markdown** στα downstream εργαλεία. + +## Βήμα 4: Μετατροπή του HTML σε Markdown και αποθήκευση του αποτελέσματος + +Με το έγγραφο φορτωμένο και τις επιλογές ρυθμισμένες, καλέστε τη static μέθοδο `convert_html`. Αυτή η μέθοδος διαβάζει το DOM, εφαρμόζει τον επιλεγμένο formatter και γράφει το αρχείο εξόδου. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Μετά την εκτέλεση του script, θα βρείτε ένα νέο αρχείο με όνομα `output.md` στον καθορισμένο φάκελο. Ανοίγοντάς το, θα δείτε καθαρό, Git‑compatible Markdown έτοιμο για version control ή δημοσίευση. + +## Βήμα 5: Επαλήθευση του παραγόμενου αρχείου markdown + +Μια γρήγορη sanity check σας βοηθά να επιβεβαιώσετε ότι η μετατροπή ολοκληρώθηκε επιτυχώς και ότι το **html to markdown file** περιέχει το αναμενόμενο περιεχόμενο. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Τυπική έξοδος για μια απλή σελίδα HTML μοιάζει με: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Αν παρατηρήσετε ελλιπείς επικεφαλίδες ή κακοσχηματισμένες λίστες, επιστρέψτε στο **Step 3** και πειραματιστείτε με διαφορετικές τιμές `formatter` (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Προχωρημένο: Διαχείριση εικόνων και σχετικών διαδρομών + +Όταν το πηγαίο HTML περιέχει εικόνες, ο μετατροπέας μπορεί είτε να τις ενσωματώσει ως data URIs είτε να διατηρήσει τα αρχικά `src` attributes. Για να κρατήσετε τη διαδικασία **generate markdown from html** ελαφριά, ίσως θελήσετε να αντιγράψετε τα αρχεία εικόνας σε έναν παράπλευρο φάκελο και να προσαρμόσετε τις διαδρομές. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Μετά τη μετατροπή, το Markdown θα αναφέρεται σε εικόνες όπως `![Alt text](images/picture.png)`. Αυτή η προσέγγιση λειτουργεί καλά όταν αργότερα **save html as markdown** σε γεννήτρια στατικού ιστότοπου που περιμένει assets σε αφιερωμένο φάκελο. + +## Πλήρες script που μπορείτε να αντιγράψετε‑επικολλήσετε + +Παρακάτω βρίσκεται το πλήρες, εκτελέσιμο script που ενσωματώνει όλα τα βήματα που συζητήθηκαν. Αποθηκεύστε το ως `convert_html_to_md.py` και εκτελέστε το με `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Αναμενόμενη έξοδος + +Η εκτέλεση του script εκτυπώνει ένα μήνυμα επιβεβαίωσης ακολουθούμενο από τις πρώτες δέκα γραμμές του αρχείου Markdown, όπως φαίνεται παραπάνω. Το παραγόμενο `output.md` μπορεί να ανοιχτεί σε οποιονδήποτε επεξεργαστή κειμένου, να προεπισκοπηθεί στο VS Code ή να δεσμευτεί σε αποθετήριο Git. + +## Συχνές ερωτήσεις και διαχείριση edge‑case + +| Ερώτηση | Απάντηση | +|----------|--------| +| **Τι γίνεται αν το αρχείο HTML είναι μεγάλο (> 10 MB);** | Η κλάση `HTMLDocument` κάνει streaming την είσοδο, έτσι η χρήση μνήμης παραμένει μέτρια. Ωστόσο, σκεφτείτε να αυξήσετε το όριο μνήμης της διαδικασίας Python αν αντιμετωπίσετε `MemoryError`. | +| **Μπορώ να μετατρέψω μια συμβολοσειρά HTML αντί για αρχείο;** | Ναι. Χρησιμοποιήστε `HTMLDocument.from_string(html_string)` (ή τον ισοδύναμο constructor) πριν καλέσετε `Converter.convert_html`. | +| **Πώς διατηρώ τα αρχικά σχόλια HTML;** | Ορίστε `md_options.preserve_comments = True`. Τα σχόλια θα εμφανιστούν ως HTML comments (`<!-- … -->`) μέσα στο αρχείο Markdown. | +| **Μπορώ να στοχεύσω διαφορετικό dialect του Markdown;** | Αλλάξτε το `md_options.formatter` σε `"COMMONMARK"` ή `"MARKDOWN_EXTRA"` ανάλογα με την πλατφόρμα-στόχο. | +| **Πρέπει να εγκαταστήσω ξεχωριστά το .NET runtime;** | Το πακέτο `aspose-html` περιλαμβάνει το απαιτούμενο runtime για τις περισσότερες πλατφόρμες. Σε Linux, βεβαιωθείτε ότι είναι εγκατεστημένο το `libgdiplus` (`sudo apt-get install libgdiplus`). | + +## Συμπέρασμα + +Τώρα ξέρετε πώς να **convert HTML to Markdown** χρησιμοποιώντας Python, πώς να **save html as markdown**, και πώς να **generate markdown from html** με λεπτομερή έλεγχο της μορφοποίησης και των assets. Το script δείχνει τη πλήρη ροή εργασίας—από τη φόρτωση του πηγαίου αρχείου μέχρι την παραγωγή ενός καθαρού *html to markdown file* έτοιμου για version control ή δημοσίευση. + +Στη συνέχεια, εξερευνήστε σχετικές θεματικές όπως **batch converting multiple HTML files**, ενσωμάτωση του βήματος μετατροπής σε CI/CD pipeline, ή προσαρμογή της εξόδου Markdown για συγκεκριμένες γεννήτριες στατικού ιστότοπου όπως Hugo ή Jekyll. Πειραματιστείτε με τις διάφορες ρυθμίσεις του `MarkdownSaveOptions` για να ταιριάξετε το αποτέλεσμα με το στυλ οδηγού του έργου σας. + +Καλή μετατροπή! + +## Τι πρέπει να μάθετε στη συνέχεια; + +Τα παρακάτω tutorials καλύπτουν στενά συναφή θέματα που επεκτείνουν τις τεχνικές που παρουσιάστηκαν σε αυτόν τον οδηγό. Κάθε πόρος περιλαμβάνει πλήρη λειτουργικό κώδικα με βήμα‑βήμα εξηγήσεις για να κατακτήσετε επιπλέον δυνατότητες API και να εξερευνήσετε εναλλακτικές προσεγγίσεις στην υλοποίηση των δικών σας έργων. + +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/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/greek/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/greek/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..65bb102440 --- /dev/null +++ b/html/greek/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Πώς να ενεργοποιήσετε λειτουργίες κατά τη μετατροπή HTML σε Markdown + χρησιμοποιώντας Python. Μάθετε πώς να μετατρέψετε ένα έγγραφο HTML και να αποθηκεύσετε + το HTML ως Markdown με ακριβή έλεγχο των λειτουργιών. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: el +lastmod: 2026-09-19 +og_description: Πώς να ενεργοποιήσετε λειτουργίες κατά τη μετατροπή HTML σε Markdown. + Αυτός ο οδηγός σας δείχνει βήμα‑βήμα πώς να μετατρέψετε ένα έγγραφο HTML και να + αποθηκεύσετε το HTML ως Markdown με λεπτομερή έλεγχο. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Πώς να ενεργοποιήσετε λειτουργίες κατά τη μετατροπή του HTML σε Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Πώς να ενεργοποιήσετε λειτουργίες κατά τη μετατροπή του HTML σε Markdown +url: /el/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Πώς να ενεργοποιήσετε λειτουργίες κατά τη μετατροπή HTML σε Markdown + +Αν χρειάζεστε **πώς να ενεργοποιήσετε λειτουργίες** κατά τη διάρκεια μιας μετατροπής, αυτός ο οδηγός σας παρέχει μια πλήρη, εκτελέσιμη λύση. Θα δείτε ακριβώς πώς να μετατρέψετε HTML σε Markdown, να ελέγξετε ποιες λειτουργίες του Markdown παράγονται, και να αποθηκεύσετε το HTML ως Markdown σε μία μόνο εκτέλεση. + +Το παράδειγμα χρησιμοποιεί το δημοφιλές **GroupDocs.Conversion** Python SDK, αλλά οι έννοιες ισχύουν για οποιαδήποτε βιβλιοθήκη που σας επιτρέπει να διαμορφώσετε σύνολα λειτουργιών. Στο τέλος αυτού του οδηγού μπορείτε να μετατρέψετε ένα έγγραφο HTML, να διατηρήσετε μόνο συνδέσμους και παραγράφους, και να αποφύγετε ανεπιθύμητους πίνακες, εικόνες ή μπλοκ κώδικα. + +## Τι θα επιτύχετε + +* **πώς να ενεργοποιήσετε λειτουργίες** στις επιλογές αποθήκευσης Markdown +* μια σαφής ροή εργασίας **μετατροπής html σε markdown** +* η δυνατότητα **πώς να μετατρέψετε html** με επιλεκτική έξοδο +* ένα έτοιμο‑για‑εκτέλεση script που **μετατρέπει έγγραφο html** και **αποθηκεύει html ως markdown** + +### Προαπαιτούμενα + +* Python 3.8+ εγκατεστημένο +* πακέτο `groupdocs-conversion` (εγκατάσταση με `pip install groupdocs-conversion`) +* Ένα δείγμα αρχείου HTML (`sample.html`) σε γνωστό φάκελο + +--- + +## Πώς να ενεργοποιήσετε λειτουργίες στη μετατροπή Markdown + +Το πρώτο βήμα είναι να δημιουργήσετε ένα αντικείμενο `MarkdownSaveOptions` και να πείτε στον μετατροπέα ποια στοιχεία θέλετε να διατηρήσετε. Σε αυτόν τον οδηγό ενεργοποιούμε μόνο **links** και **paragraphs**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Γιατί λειτουργεί αυτό:** +* `HTMLDocument` τυλίγει το αρχείο προέλευσης ώστε ο μετατροπέας να μπορεί να το διαβάσει. +* `MarkdownSaveOptions` περιέχει όλες τις ρυθμίσεις μετατροπής· η λίστα `features` είναι η κύρια ιδιότητα που **πώς να ενεργοποιήσετε λειτουργίες**. +* Αναθέτοντας `["Link", "Paragraph"]` λέτε στη μηχανή να παράγει μόνο συνδέσμους Markdown (`[text](url)`) και απλές παραγράφους, απορρίπτοντας εικόνες, πίνακες και άλλα στοιχεία. +* `Converter.convert_html` εκτελεί την πραγματική λειτουργία **convert html to markdown** και γράφει το αποτέλεσμα στο `sample.md`. + +--- + +## Πώς να μετατρέψετε έγγραφο HTML με προσαρμοσμένες επιλογές + +Αν αργότερα χρειαστεί να προσθέσετε περισσότερες σημαίες λειτουργιών—όπως `"Header"` ή `"Bold"`—απλώς επεκτείνετε τη λίστα: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +Η ίδια κλήση στο `Converter.convert_html` θα συμπεριλάβει τώρα αυτά τα επιπλέον στοιχεία. Αυτό το μοτίβο σας επιτρέπει να **πώς να μετατρέψετε html** με έναν πολύ παραμετροποιήσιμο τρόπο χωρίς να γράψετε προσαρμοσμένους αναλυτές. + +--- + +## Πώς να αποθηκεύσετε HTML ως Markdown σε συγκεκριμένο φάκελο + +Η μέθοδος `convert_html` δέχεται απόλυτη ή σχετική διαδρομή εξόδου. Για να **αποθηκεύσετε html ως markdown** σε έναν υπο‑φάκελο που ονομάζεται `output`, προσαρμόστε το τρίτο όρισμα: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Η εκτέλεση του script δημιουργεί το φάκελο `output` (αν δεν υπάρχει) και γράφει το αρχείο Markdown εκεί. Αυτή η προσέγγιση διατηρεί το πηγαίο HTML και το παραγόμενο Markdown οργανωμένα. + +--- + +## Πλήρες script που μπορείτε να αντιγράψετε‑και‑επικολλήσετε + +Παρακάτω βρίσκεται ολόκληρο το πρόγραμμα, έτοιμο για εκτέλεση. Αντικαταστήστε το `YOUR_DIRECTORY` με τη διαδρομή που περιέχει το `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Αναμενόμενη έξοδος** (εκτυπώνεται στην κονσόλα): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Ανοίξτε το `sample.md` και θα δείτε μόνο συνδέσμους Markdown και απλές παραγράφους, για παράδειγμα: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Όλα τα άλλα στοιχεία HTML έχουν παραλειφθεί επειδή η **πώς να ενεργοποιήσετε λειτουργίες** περιορίσθηκε η έξοδος στους δύο επιλεγμένους τύπους. + +--- + +## Συχνές ερωτήσεις και ειδικές περιπτώσεις + +| Ερώτηση | Απάντηση | +|----------|--------| +| *Τι γίνεται αν το αρχείο HTML δεν περιέχει συνδέσμους;* | Ο μετατροπέας εξακολουθεί να γράφει τις παραγράφους· η έξοδος θα περιέχει απλό κείμενο χωρίς σύνταξη συνδέσμου. | +| *Μπορώ να απενεργοποιήσω όλες τις λειτουργίες;* | Ορίζοντας `markdown_options.features = []` παράγει ένα κενό αρχείο Markdown. Χρησιμοποιήστε το μόνο για δοκιμές. | +| *Πώς διαχειρίζεται το SDK το μη έγκυρο HTML;* | Ο parser προσπαθεί να καθαρίσει το κακοδιατυπωμένο markup πριν εφαρμόσει το φίλτρο λειτουργιών. Τα σφάλματα καταγράφονται αλλά δεν διακόπτουν τη μετατροπή. | +| *Είναι δυνατόν να διατηρηθούν οι εικόνες ενώ απορρίπτονται οι πίνακες;* | Ναι. Ορίστε `markdown_options.features = ["Link", "Paragraph", "Image"]`. Η λίστα λειτουργιών είναι προσθετική, όχι αποκλειστική. | +| *Τι γίνεται αν χρειαστεί να μετατρέψετε πολλά αρχεία σε έναν φάκελο;* | Τυλίξτε τη λογική μετατροπής σε βρόχο που επαναλαμβάνει πάνω από `Path.glob("*.html")`. Η ίδια **πώς να ενεργοποιήσετε λειτουργίες** διαμόρφωση μπορεί να επαναχρησιμοποιηθεί για κάθε αρχείο. | + +**Συμβουλή:** Όταν επεξεργάζεστε μεγάλες παρτίδες, δημιουργήστε το `MarkdownSaveOptions` μία φορά και επαναχρησιμοποιήστε το. Αυτό μειώνει το κόστος δημιουργίας αντικειμένων και διατηρεί την **convert html to markdown** γραμμή εργασίας γρήγορη. + +--- + +## Συμπέρασμα + +Τώρα γνωρίζετε **πώς να ενεργοποιήσετε λειτουργίες** όταν **μετατρέπετε html σε markdown**, πώς να **πώς να μετατρέψετε html** με επιλεκτική έξοδο, και πώς να **μετατρέψετε έγγραφο html** και **αποθηκεύετε html ως markdown** χρησιμοποιώντας ένα σύντομο script Python. Με τη διαμόρφωση του `MarkdownSaveOptions.features`, αποκτάτε πλήρη έλεγχο των στοιχείων Markdown που εμφανίζονται στο τελικό αρχείο. + +### Επόμενα βήματα + +* Εξερευνήστε πρόσθετες σημαίες λειτουργιών όπως `"Header"`, `"Bold"` και `"Italic"` για να εμπλουτίσετε την έξοδο Markdown. +* Συνδυάστε αυτό το script με έναν παρακολουθητή αρχείων (π.χ., `watchdog`) για να μετατρέπετε αυτόματα νέα αρχεία HTML καθώς εμφανίζονται. +* Ανασκοπήστε την [GroupDocs.Conversion Python SDK documentation](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) για προχωρημένα σενάρια όπως μετατροπές PDF‑to‑Markdown ή DOCX‑to‑HTML. + +Νιώστε ελεύθεροι να πειραματιστείτε με διαφορετικά σύνολα λειτουργιών και να μοιραστείτε τα ευρήματά σας με την κοινότητα. Καλή μετατροπή! + +## Τι Θα Πρέπει Να Μάθετε Στη Σύντομη Μελλοντική + +Τα παρακάτω tutorials καλύπτουν στενά σχετικές θεματικές που βασίζονται στις τεχνικές που παρουσιάζονται σε αυτόν τον οδηγό. Κάθε πόρος περιλαμβάνει πλήρη παραδείγματα κώδικα με βήμα‑βήμα εξηγήσεις για να σας βοηθήσουν να κατακτήσετε πρόσθετες λειτουργίες API και να εξερευνήσετε εναλλακτικές προσεγγίσεις υλοποίησης στα δικά σας έργα. + +- [Μετατροπή HTML σε Markdown στο Aspose.HTML για Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown σε HTML Java - Μετατροπή με Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [Πώς να Ενεργοποιήσετε JavaScript στο Aspose HTML – Φόρτωση HTML & Λήψη Κειμένου](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/greek/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/greek/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..cd17ed60cf --- /dev/null +++ b/html/greek/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,246 @@ +--- +category: general +date: 2026-09-19 +description: Μάθετε πώς να περιορίζετε τους ένθετους πόρους στο Aspose.HTML για Python + χρησιμοποιώντας το ResourceHandlingOptions. Ελέγξτε το μέγιστο βάθος επεξεργασίας + και αποφύγετε τα άπειρα βρόχους. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: el +lastmod: 2026-09-19 +og_description: Περιορίστε τους ένθετους πόρους στο Aspose.HTML για Python χρησιμοποιώντας + το ResourceHandlingOptions. Ορίστε το μέγιστο βάθος διαχείρισης για να αποτρέψετε + την βαθιά αναδρομή και να βελτιώσετε την απόδοση. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Πώς να περιορίσετε τα ένθετα πόρους στο Aspose.HTML για Python – βήμα‑βήμα + οδηγός +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Πώς να περιορίσετε τους ένθετους πόρους κατά την επεξεργασία HTML με το Aspose.HTML + για Python +url: /el/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Πώς να περιορίσετε τους ένθετους πόρους κατά την επεξεργασία HTML με Aspose.HTML για Python + +Αν χρειάζεται να **περιορίσετε τους ένθετους πόρους** κατά την απόδοση ή τη μετατροπή HTML, αυτός ο οδηγός σας δείχνει τα ακριβή βήματα για τη διαμόρφωση του Aspose.HTML για Python. Ο έλεγχος του βάθους διαχείρισης πόρων αποτρέπει την ανεξέλεγκτη επανάληψη όταν μια σελίδα περιλαμβάνει πολλά επίπεδα CSS, JavaScript ή αναφορές εικόνων. + +Ο περιορισμός των ένθετων πόρων είναι ιδιαίτερα σημαντικός για μεγάλης κλίμακας crawlers, pipelines απόδοσης email ή οποιοδήποτε αυτοματοποιημένο workflow που πρέπει να παραμείνει εντός των περιορισμών μνήμης και χρόνου. Στις παρακάτω ενότητες θα μάθετε γιατί πρέπει να ορίσετε όριο βάθους, πώς να χρησιμοποιήσετε την κλάση `ResourceHandlingOptions` και πώς να επαληθεύσετε ότι το όριο λειτουργεί όπως αναμένεται. + +## Γιατί πρέπει να περιορίσετε τους ένθετους πόρους + +Τα έγγραφα HTML συχνά αναφέρονται σε άλλους πόρους — φύλλα στυλ, σενάρια, εικόνες, γραμματοσειρές ή ακόμη και άλλα αρχεία HTML. Κάθε ένας από αυτούς τους πόρους μπορεί με τη σειρά του να αναφέρει επιπλέον αρχεία, δημιουργώντας ένα δέντρο εξαρτήσεων. Χωρίς κάποιο περιοριστικό μέτρο, το δέντρο μπορεί να γίνει αυθαίρετα βαθύ: + +* Μια σελίδα φορτώνει ένα αρχείο CSS που εισάγει άλλο αρχείο CSS, το οποίο εισάγει άλλο, κ.ο.κ. +* Η JavaScript μπορεί να φορτώνει δυναμικά επιπλέον σενάρια. +* Ένα πρότυπο email μπορεί να ενσωματώνει εικόνες που αναφέρονται σε εξωτερικά URLs που ανακατευθύνουν σε περισσότερα assets. + +Όταν το βάθος της επανάληψης αυξάνεται χωρίς έλεγχο, διατρέχετε τον κίνδυνο: + +* **Υπερβολική κατανάλωση μνήμης** — κάθε ληφθέν πόρος καταλαμβάνει buffers. +* **Μεγαλύτεροι χρόνοι επεξεργασίας** — η καθυστέρηση δικτύου πολλαπλασιάζεται με κάθε επίπεδο. +* **Πιθανές άπειρες βρόχοι** — κυκλικές αναφορές μπορούν να κάνουν τη μηχανή να μην επιστρέψει ποτέ. + +Ορίζοντας ένα **μέγιστο βάθος διαχείρισης** λέτε στο Aspose.HTML να σταματήσει να ακολουθεί συνδέσμους πόρων μετά από έναν συγκεκριμένο αριθμό επιπέδων, εξασφαλίζοντας προβλέψιμη απόδοση. + +## Πώς να περιορίσετε τους ένθετους πόρους στο Aspose.HTML για Python + +Το Aspose.HTML παρέχει την κλάση `ResourceHandlingOptions`, η οποία περιέχει την ιδιότητα `max_handling_depth`. Αναθέτοντας μια αριθμητική τιμή (π.χ. `3`), υποδεικνύετε στη μηχανή να σταματήσει μετά από τρία ένθετα επίπεδα. + +Παρακάτω υπάρχει ένα πλήρες, εκτελέσιμο παράδειγμα που δείχνει ολόκληρη τη ροή εργασίας: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Επεξήγηση κάθε βήματος + +1. **Εγκατάσταση του πακέτου** — Το wheel `aspose-html` είναι απαραίτητο. Η εντολή `pip install` εμφανίζεται ως σχόλιο για πληρότητα. +2. **Εισαγωγή κλάσεων** — `HtmlDocument` φορτώνει τη σελίδα, `ResourceHandlingOptions` κρατά το όριο, και `HtmlLoadOptions` συνδέει τα δύο. +3. **Δημιουργία του αντικειμένου επιλογών** — Η δημιουργία ενός `ResourceHandlingOptions` σας δίνει ένα μεταβλητό container. +4. **Ορισμός `max_handling_depth`** — Αναθέστε `3` (ή οποιονδήποτε ακέραιο) για να περιορίσετε τη μηχανή σε τρία επίπεδα ένθετων πόρων. Αυτό είναι το κεντρικό στοιχείο του **limit nested resources**. +5. **Σύνδεση επιλογών με τη διαμόρφωση φόρτωσης** — Το `HtmlLoadOptions` σας επιτρέπει να περάσετε το `resource_options` στον φορτωτή. +6. **Φόρτωση του HTML** — Ο κατασκευαστής του `HtmlDocument` δέχεται URL ή διαδρομή αρχείου μαζί με `load_options`. Η μηχανή τώρα σέβεται το όριο βάθους. +7. **Επαλήθευση** — Με την επανάληψη πάνω στο `document.resources`, μπορείτε να δείτε πόσοι πόροι λήφθηκαν πραγματικά και ποιο ήταν το βαθύτερο επίπεδο που αντιμετωπίστηκε. Αν το βαθύτερο επίπεδο είναι `3` ή λιγότερο, το όριο πέτυχε. +8. **Αποθήκευση** — Διατηρήστε το επεξεργασμένο έγγραφο. Το αποθηκευμένο αρχείο περιέχει μόνο τους πόρους μέχρι το επιτρεπτό βάθος. + +#### Αναμενόμενη έξοδος + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +Οι αριθμοί θα διαφέρουν ανάλογα με τη σελίδα προέλευσης, αλλά το βαθύτερο επίπεδο δεν θα πρέπει ποτέ να ξεπερνά το `3` επειδή ορίσαμε `max_handling_depth = 3`. + +## Συνηθισμένες παραλλαγές και ειδικές περιπτώσεις + +### Αλλαγή του ορίου βάθους + +Μπορεί να χρειαστείτε μεγαλύτερο ή μικρότερο όριο ανάλογα με το περιβάλλον σας: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Απενεργοποίηση του ορίου εντελώς + +Ορίζοντας την ιδιότητα σε `0` λέτε στο Aspose.HTML να **αφαιρέσει οποιονδήποτε περιορισμό βάθους**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Κάντε το μόνο όταν είστε σίγουροι ότι το HTML προέλευσης είναι καλά συμπεριμενόμενο. + +### Διαχείριση κυκλικών αναφορών + +Ακόμη και με όριο βάθους, οι κυκλικές αναφορές μπορούν να εμφανιστούν στο ίδιο επίπεδο. Το Aspose.HTML ανιχνεύει κύκλους και σταματά τη φόρτωση ενός πόρου που έχει ήδη επεξεργαστεί, ανεξάρτητα από το όριο. Ωστόσο, ορίζοντας χαμηλότερο `max_handling_depth` μειώνει την πιθανότητα να συναντήσετε κύκλο από την αρχή. + +### Χρήση του ορίου με τοπικά αρχεία + +Η ίδια προσέγγιση λειτουργεί για τοπικά αρχεία HTML: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +Η μηχανή αντιμετωπίζει τα σχετικά attributes `href` ή `src` με τον ίδιο τρόπο όπως τα απομακρυσμένα URLs, εφαρμόζοντας το όριο βάθους και σε πόρους του συστήματος αρχείων. + +### Ενσωμάτωση με άλλες δυνατότητες του Aspose.HTML + +Αν χρειάζεστε επίσης έλεγχο **χρόνου λήξης λήψης πόρων**, μπορείτε να συνδυάσετε το `ResourceHandlingOptions` με το `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Και οι δύο επιλογές είναι ανεξάρτητες, ώστε να μπορείτε να βελτιστοποιήσετε την απόδοση και την ασφάλεια ταυτόχρονα. + +## Pro tips για παραγωγική χρήση + +* **Καταγραφή του δέντρου πόρων** — Κατά τον εντοπισμό σφαλμάτων, επαναλάβετε το `document.resources` και καταγράψτε το URL και το βάθος κάθε πόρου. Αυτό σας βοηθά να καταλάβετε γιατί μια συγκεκριμένη σελίδα ξεπερνά τις προσδοκίες σας. +* **Cache ληφθέντων πόρων** — Αν επεξεργάζεστε τα ίδια εξωτερικά assets επανειλημμένα, ενεργοποιήστε caching για να αποφύγετε περιττές κλήσεις δικτύου. +* **Συνδυασμός με whitelist** — Αν μόνο ορισμένοι τομείς είναι αξιόπιστοι, φιλτράρετε το `document.resources` μετά τη φόρτωση και απορρίψτε ό,τι βρίσκεται εκτός της whitelist. +* **Δοκιμή με edge‑case σελίδες** — Δημιουργήστε ένα συνθετικό αρχείο HTML που εισάγει αλυσίδα 10 CSS αρχείων. Επαληθεύστε ότι το όριό σας κόβει την αλυσίδα όπως προβλέπεται. + +## Συμπέρασμα + +Τώρα ξέρετε πώς να **περιορίσετε τους ένθετους πόρους** στο Aspose.HTML για Python διαμορφώνοντας το `ResourceHandlingOptions.max_handling_depth`. Ο ορισμός ενός ορίου βάθους προστατεύει την εφαρμογή σας από υπερβολική χρήση μνήμης, μεγάλους χρόνους επεξεργασίας και πιθανές άπειρες βρόχους που προκαλούνται από βαθιά ένθετους ή κυκλικούς πόρους. + +Από εδώ και πέρα μπορείτε: + +* Να προσαρμόσετε το βάθος ώστε να ταιριάζει με τον προϋπολογισμό απόδοσής σας (`resource_handling_options.max_handling_depth`). +* Να συνδυάσετε το όριο με χρονικά όρια δικτύου, caching ή whitelist τομέων για αξιόπιστες pipelines. +* Να εξερευνήσετε συναφή θέματα όπως **resource handling options**, **max handling depth** και **nested resource handling** για περαιτέρω σφιχτό έλεγχο της επεξεργασίας HTML. + +Πειραματιστείτε με διαφορετικές τιμές βάθους και παρατηρήστε πώς αλλάζει ο αριθμός των ληφθέντων πόρων. Όταν είστε έτοιμοι, ενσωματώστε αυτό το μοτίβο στην ευρύτερη υπηρεσία μετατροπής ή απόδοσης HTML σας, ώστε να εξασφαλίσετε προβλέψιμη, ασφαλή και αποδοτική εκτέλεση. + +## Τι πρέπει να μάθετε στη συνέχεια; + +Τα παρακάτω tutorials καλύπτουν στενά σχετιζόμενα θέματα που επεκτείνουν τις τεχνικές που παρουσιάστηκαν σε αυτόν τον οδηγό. Κάθε πόρος περιλαμβάνει πλήρη λειτουργικά παραδείγματα κώδικα με βήμα‑βήμα εξηγήσεις για να κατακτήσετε πρόσθετες δυνατότητες του API και να εξερευνήσετε εναλλακτικές προσεγγίσεις υλοποίησης στα δικά σας έργα. + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/greek/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/greek/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..d1cbecba78 --- /dev/null +++ b/html/greek/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,261 @@ +--- +category: general +date: 2026-09-19 +description: Μάθετε έναν οδηγό html σε pdf στην Python που δείχνει πώς να δημιουργήσετε + pdf από html γρήγορα με το Aspose.HTML. Ακολουθήστε τον βήμα‑βήμα οδηγό τώρα. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: el +lastmod: 2026-09-19 +og_description: 'Οδηγός html σε pdf: Μετατρέψτε οποιαδήποτε σελίδα HTML σε αρχείο + PDF χρησιμοποιώντας Python και Aspose.HTML. Αυτός ο οδηγός δείχνει πώς να δημιουργήσετε + PDF από HTML σε λίγα λεπτά.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Οδηγός html σε pdf με Python – πλήρης βήμα‑βήμα οδηγός +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Πώς να δημιουργήσετε έναν οδηγό html σε pdf χρησιμοποιώντας την Python +url: /el/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Πώς να εκτελέσετε ένα tutorial html σε pdf χρησιμοποιώντας Python + +Αν χρειάζεστε ένα **html σε pdf tutorial**, αυτός ο οδηγός σας δείχνει ακριβώς πώς να δημιουργήσετε ένα PDF από HTML με λίγες μόνο γραμμές κώδικα Python. Είτε αυτοματοποιείτε τη δημιουργία αναφορών είτε εξάγετε περιεχόμενο ιστού για ανάγνωση εκτός σύνδεσης, η βιβλιοθήκη Aspose.HTML κάνει τη μετατροπή απλή. + +Σε αυτό το tutorial θα μάθετε πώς να ρυθμίσετε το περιβάλλον, να γράψετε το σενάριο μετατροπής και να αντιμετωπίσετε κοινές περιπτώσεις όπως ελλιπή αρχεία ή προσαρμοσμένες ρυθμίσεις σελίδας. Στο τέλος θα μπορείτε **πώς να δημιουργήσετε pdf** αρχεία από οποιαδήποτε πηγή HTML χωρίς να αφήσετε το οικοσύστημα της Python. + +## Τι θα χρειαστείτε + +Πριν ξεκινήσετε, βεβαιωθείτε ότι έχετε: + +* Python 3.8 ή νεότερη εγκατεστημένη +* Ένα ενεργό license για Aspose.HTML for Python (μια δωρεάν δοκιμή λειτουργεί για αξιολόγηση) +* Πρόσβαση σε `pip` για την εγκατάσταση του πακέτου `aspose-html` +* Ένα απλό αρχείο HTML που θέλετε να μετατρέψετε (π.χ., `input.html`) + +> **Pro tip:** Κρατήστε το HTML και τα assets (εικόνες, CSS) στον ίδιο φάκελο για να αποφύγετε προβλήματα επίλυσης διαδρομών κατά τη μετατροπή. + +## Βήμα 1: Εγκατάσταση του πακέτου Aspose.HTML + +Ανοίξτε ένα τερματικό και εκτελέστε την παρακάτω εντολή: + +```bash +pip install aspose-html +``` + +Το wheel `aspose-html` περιλαμβάνει τις εγγενείς βιβλιοθήκες που απαιτούνται για υψηλής ποιότητας απόδοση, οπότε δεν χρειάζονται επιπλέον εξαρτήσεις συστήματος. + +## Βήμα 2: Δημιουργία ενός ελάχιστου script Python + +Δημιουργήστε ένα νέο αρχείο με όνομα `convert_html_to_pdf.py` και επικολλήστε τον κώδικα παρακάτω. Αυτό το script ακολουθεί το πρότυπο **html σε pdf tutorial** τριών βημάτων: εισαγωγή, ορισμός διαδρομών και κλήση της μετατροπής. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Γιατί λειτουργεί αυτό + +* **Η εισαγωγή του `Converter`** σας δίνει πρόσβαση σε ένα υψηλού επιπέδου API που αφαιρεί την πολυπλοκότητα της μηχανής απόδοσης. +* **Ο ορισμός απόλυτων διαδρομών** αποτρέπει σφάλματα σχετικών διαδρομών όταν το script εκτελείται από διαφορετικό φάκελο εργασίας. +* **`Converter.convert_html`** εκτελεί ολόκληρη τη διαδικασία απόδοσης — ανάλυση HTML, διάταξη CSS και σειριοποίηση PDF — με μία κλήση, που είναι ο προτεινόμενος τρόπος **πώς να δημιουργήσετε pdf** γρήγορα. + +## Βήμα 3: Εκτέλεση του script και επαλήθευση του αποτελέσματος + +Εκτελέστε το script από το τερματικό: + +```bash +python convert_html_to_pdf.py +``` + +Αν όλα είναι ρυθμισμένα σωστά, θα δείτε: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Ανοίξτε το `output.pdf` με οποιονδήποτε προβολέα PDF. Το έγγραφο θα πρέπει να είναι πανομοιότυπο με την αρχική σελίδα HTML, συμπεριλαμβανομένων των γραμματοσειρών, εικόνων και βασικού στυλ CSS. + +![Δημιουργημένο προεπισκόπηση PDF](https://example.com/images/pdf-preview.png "Στιγμιότυπο του δημιουργημένου PDF από HTML χρησιμοποιώντας Python"){: .center-image alt="Στιγμιότυπο PDF που δημιουργήθηκε από αρχείο HTML χρησιμοποιώντας Python"} + +## Βήμα 4: Προσαρμογή της μετατροπής (προαιρετικό) + +Το βασικό **html σε pdf tutorial** καλύπτει μια μετατροπή ένα‑προς‑ένα, αλλά σε πραγματικές συνθήκες συχνά απαιτούνται προσαρμογές: + +| Απαίτηση | Πώς να το επιτύχετε με Aspose.HTML | +|----------|-----------------------------------| +| Ορισμός μεγέθους σελίδας (A4, Letter) | Περνάτε ένα αντικείμενο `PdfSaveOptions` στη `convert_html` | +| Προσθήκη περιθωρίων ή κεφαλίδων/υποσέλιδων | Χρησιμοποιήστε `PdfPageSettings` μέσα στις επιλογές | +| Ενσωμάτωση προσαρμοσμένων γραμματοσειρών | Βεβαιωθείτε ότι τα αρχεία γραμματοσειρών είναι προσβάσιμα και ορίστε `FontSettings` | + +Παρακάτω υπάρχει ένα παράδειγμα που ορίζει το μέγεθος σελίδας σε A4 και προσθέτει περιθώριο 1 ίντσας: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Σημείωση:** Η χρήση προσαρμοσμένων επιλογών είναι η προτιμώμενη τεχνική **δημιουργίας pdf από html** όταν χρειάζεστε ακριβή έλεγχο της διάταξης. + +## Βήμα 5: Διαχείριση πολλαπλών αρχείων HTML (batch conversion) + +Αν έχετε έναν φάκελο γεμάτο HTML αναφορές, μπορείτε να τα επεξεργαστείτε σε βρόχο: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Αυτό το απόσπασμα δείχνει μια επεκτάσιμη ροή εργασίας **python convert html pdf** που ταιριάζει σε CI pipelines ή προγραμματισμένες εργασίες. + +## Συνηθισμένα προβλήματα και πώς να τα αποφύγετε + +| Πρόβλημα | Αιτία | Διόρθωση | +|----------|-------|----------| +| Ελλιπείς εικόνες στο PDF | Σχετικές διαδρομές εικόνων που σπάζουν όταν το script τρέχει από διαφορετικό φάκελο | Χρησιμοποιήστε απόλυτες διαδρομές ή ορίστε `base_uri` στις επιλογές του `Converter` | +| CSS δεν εφαρμόζεται | Εξωτερικό φύλλο στυλ που αναφέρεται με URL που απαιτεί πρόσβαση στο διαδίκτυο | Κατεβάστε το φύλλο στυλ τοπικά και αναφέρετέ το με σχετική διαδρομή | +| Αντικατάσταση γραμματοσειράς | Η γραμματοσειρά δεν είναι εγκατεστημένη στο σύστημα | Συμπεριλάβετε το αρχείο γραμματοσειράς στο έργο και ρυθμίστε το `FontSettings` | + +Η αντιμετώπιση αυτών των περιπτώσεων εξασφαλίζει ότι η διαδικασία **εξαγωγής html ως pdf** είναι αξιόπιστη σε όλα τα περιβάλλοντα. + +## Πλήρες, εκτελέσιμο παράδειγμα + +Παρακάτω βρίσκεται το πλήρες script που περιλαμβάνει προαιρετικές ρυθμίσεις, διαχείριση σφαλμάτων και λογική batch processing. Αντιγράψτε το στο `full_html_to_pdf.py` και τρέξτε το όπως δείξαμε νωρίτερα. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Η εκτέλεση αυτού του script παράγει ένα PDF για κάθε αρχείο HTML στον προορισμό, εφαρμόζοντας συνεπείς ρυθμίσεις σελίδας — μια ολοκληρωμένη λύση **python convert html pdf** έτοιμη για παραγωγή. + +## Συμπέρασμα + +Τώρα έχετε ένα πρακτικό **html σε pdf tutorial** που δείχνει πώς να δημιουργείτε αρχεία PDF από HTML χρησιμοποιώντας Python και Aspose.HTML. Ο οδηγός κάλυψε τη ρύθμιση του περιβάλλοντος, ένα ελάχιστο script μετατροπής, προαιρετική προσαρμογή, batch processing και συμβουλές αντιμετώπισης προβλημάτων. + +Από εδώ μπορείτε να εξερευνήσετε σχετικά θέματα όπως **πώς να δημιουργήσετε pdf** με υδατογραφήματα, συγχώνευση πολλαπλών PDF ή μετατροπή HTML σε άλλες μορφές όπως DOCX. Πειραματιστείτε με το API `PdfSaveOptions` για να βελτιώσετε το αποτέλεσμα και ενσωματώστε το script σε web services ή αυτοματοποιημένες αλυσίδες αναφορών. + +Καλό κώδικα και απολαύστε τη μετατροπή του HTML περιεχομένου σας σε επαγγελματικά PDF! + +## Τι θα πρέπει να μάθετε στη συνέχεια; + +Τα παρακάτω tutorials καλύπτουν στενά συναφή θέματα που επεκτείνουν τις τεχνικές που παρουσιάστηκαν σε αυτόν τον οδηγό. Κάθε πόρος περιλαμβάνει πλήρη παραδείγματα κώδικα με βήμα‑βήμα εξηγήσεις για να σας βοηθήσουν να κυριαρχήσετε πρόσθετες δυνατότητες του API και να εξερευνήσετε εναλλακτικές προσεγγίσεις στην υλοποίηση των δικών σας έργων. + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [How to Convert HTML to PDF Java – Using Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hindi/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/hindi/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..20bdaa230c --- /dev/null +++ b/html/hindi/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,261 @@ +--- +category: general +date: 2026-09-19 +description: Python के साथ HTML फ़ाइल में शीर्षक कैसे बदलें, सीखें। यह गाइड HTML पढ़ने, + शीर्षक टैग को अपडेट करने और संशोधित HTML को सहेजने को कवर करता है। +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: hi +lastmod: 2026-09-19 +og_description: Python के साथ HTML फ़ाइल में शीर्षक कैसे बदलें। HTML पढ़ने, शीर्षक + टैग को अपडेट करने और संशोधित दस्तावेज़ को सहेजने के लिए इस पूर्ण उदाहरण का पालन + करें। +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Python का उपयोग करके HTML फ़ाइल में शीर्षक कैसे बदलें – चरण‑दर‑चरण गाइड +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Python का उपयोग करके HTML फ़ाइल में शीर्षक कैसे बदलें +url: /hi/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python का उपयोग करके HTML फ़ाइल में शीर्षक कैसे बदलें + +यदि आपको प्रोग्रामेटिक रूप से HTML दस्तावेज़ में **how to change title** बदलने की आवश्यकता है, तो Python इस काम को आसान बनाता है। इस ट्यूटोरियल में आप एक HTML फ़ाइल पढ़ेंगे, `<title>` एलिमेंट को अपडेट करेंगे, और संशोधित HTML को डिस्क पर वापस सहेजेंगे—सभी स्पष्ट, चलाने योग्य कोड के साथ। + +पेज का शीर्षक बदलना एक सामान्य कदम है जब आप स्थैतिक साइटें बनाते हैं, स्क्रैप किए गए पेजों को कस्टमाइज़ करते हैं, या SEO अपडेट को स्वचालित करते हैं। इस गाइड के अंत तक आप जानेंगे कि कैसे **update html title** करें, कैसे **read html with python** करें, और कैसे **save modified html** को सुरक्षित रूप से सहेजें। + +## आवश्यकताएँ + +- Python 3.8 या नया स्थापित हो +- `beautifulsoup4` पैकेज (`pip install beautifulsoup4`) +- वह HTML फ़ाइल जिसे आप संपादित करना चाहते हैं (उदाहरण में `index.html` का उपयोग किया गया है, जिसे आप अपनी पसंद के फ़ोल्डर में रख सकते हैं) + +कोई बाहरी सेवाएँ आवश्यक नहीं हैं; सब कुछ स्थानीय रूप से चलता है। + +## चरण 1: Python के साथ HTML फ़ाइल लोड करें + +पहला कार्य **load html file python**‑स्टाइल में है। `BeautifulSoup` का उपयोग करने से आपको एक लचीला पार्सर मिलता है जो अपूर्ण मार्कअप के साथ भी काम करता है। + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*इस चरण का महत्व:* +`BeautifulSoup` एक ट्री प्रतिनिधित्व बनाता है, जिससे आप तत्वों को क्वेरी और संशोधित कर सकते हैं बिना मैन्युअल स्ट्रिंग हैंडलिंग के। अंतर्निहित `html.parser` तेज़ है और अतिरिक्त बाइनरी की आवश्यकता नहीं होती। + +## चरण 2: `<title>` एलिमेंट खोजें + +HTML दस्तावेज़ आमतौर पर `<head>` के भीतर एक ही `<title>` टैग रखते हैं। हम पहली उपस्थिति प्राप्त करते हैं, जो **update html title** आवश्यकता को पूरा करती है। + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*हम `None` की जाँच क्यों करते हैं*: +कुछ HTML फ्रैगमेंट्स में शीर्षक नहीं होता। इसे स्वचालित रूप से जोड़ने से बाद में त्रुटियों से बचा जा सकता है और स्क्रिप्ट मजबूत रहती है। + +## चरण 3: शीर्षक टेक्स्ट बदलें + +अब हम टैग की स्ट्रिंग को नया टेक्स्ट असाइन करके **update html title** करते हैं। यह **how to change title** ऑपरेशन का मूल भाग है। + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +`string` एट्रिब्यूट `<title>` के अंदर के टेक्स्ट नोड को दर्शाता है। इसे ओवरराइट करने से मेमोरी में DOM अपडेट हो जाता है। + +## चरण 4: संशोधित HTML सहेजें + +अंत में, बदले हुए दस्तावेज़ को नई फ़ाइल में लिखें। यह **save modified html** चरण को पूरा करता है और मूल फ़ाइल को अपरिवर्तित रखता है। + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` आउटपुट को इंडेंटेशन के साथ फॉर्मेट करता है, जिससे परिवर्तन के बाद फ़ाइल पढ़ने में आसान हो जाती है। + +### अपेक्षित आउटपुट + +निम्नलिखित `index.html` नमूना फ़ाइल पर स्क्रिप्ट चलाने से, जिसमें मूल रूप से यह है: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +कंसोल आउटपुट इस प्रकार दिखेगा: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +सहेजी गई `index_modified.html` अब इस प्रकार शुरू होगी: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## तेज़ कॉपी‑पेस्ट के लिए पूरा स्क्रिप्ट + +नीचे पूरा, तैयार‑चलाने योग्य प्रोग्राम है जो सभी चार चरणों को मिलाता है। इसे `change_title.py` के रूप में सहेजें और आवश्यकता अनुसार `YOUR_DIRECTORY` को समायोजित करें। + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +स्क्रिप्ट चलाएँ: + +```bash +python change_title.py +``` + +आपको कंसोल संदेश दिखेंगे और एक नई `index_modified.html` फ़ाइल मिलेगी जिसमें अपडेट किया गया शीर्षक होगा। + +## अतिरिक्त टिप्स और किनारे के मामले + +| Situation | What to do | +|-----------|------------| +| **Multiple `<title>` टैग** | `soup.find_all("title")` एक सूची लौटाता है; यदि आपको सभी को बदलना है तो पहले तत्व को अपडेट करें या इटररेट करें। | +| **Encoding समस्याएँ** | यदि BOM मौजूद है तो फ़ाइलों को `encoding="utf-8-sig"` के साथ खोलें, या `chardet` से एन्कोडिंग का पता लगाएँ। | +| **Large HTML फ़ाइलें** | बेहतर प्रदर्शन के लिए `lxml` पार्सर (`BeautifulSoup(html_content, "lxml")`) का उपयोग करें। | +| **मूल फॉर्मेटिंग को संरक्षित करना** | यदि आपको सटीक व्हाइटस्पेस रखना है, तो `prettify()` के बजाय `str(soup)` लिखें। | +| **कई फ़ाइलों में स्वचालन** | लॉजिक को एक फ़ंक्शन में रैप करें और `Path.rglob("*.html")` पर लूप करें। | + +ये विविधताएँ कोर **how to change title** लॉजिक को अपरिवर्तित रखती हैं जबकि वास्तविक‑दुनिया के प्रोजेक्ट्स के अनुसार अनुकूलित करती हैं। + +## निष्कर्ष + +अब आप Python का उपयोग करके किसी भी HTML दस्तावेज़ में **how to change title** करना जानते हैं। ट्यूटोरियल ने HTML पढ़ने, `<title>` टैग को खोजने, उसके टेक्स्ट को अपडेट करने, और **save modified html** को सुरक्षित रूप से सहेजने को कवर किया। पूर्ण स्क्रिप्ट के साथ आप इस पैटर्न को स्थैतिक‑साइट जेनरेटर, SEO पाइपलाइन, या किसी भी ऑटोमेशन में एकीकृत कर सकते हैं जो डायनामिक शीर्षक परिवर्तन की आवश्यकता रखता है। + +अगला, संबंधित विषयों का अन्वेषण करें जैसे **read html with python** मेटा टैग निकालने के लिए, या **load html file python** तकनीकें खराब मार्कअप को संभालने के लिए। पूरे वेबसाइट में शीर्षक अपडेट करने के लिए बैच प्रोसेसिंग के साथ प्रयोग करें—आपका नया कौशल कई वेब‑ऑटोमेशन कार्यों की नींव है। कोडिंग का आनंद लें! + +## आगे आप क्या सीखें? + +निम्नलिखित ट्यूटोरियल्स उन निकट संबंधित विषयों को कवर करते हैं जो इस गाइड में प्रदर्शित तकनीकों पर आधारित हैं। प्रत्येक संसाधन में पूर्ण कार्यशील कोड उदाहरण और चरण‑दर‑चरण व्याख्याएँ शामिल हैं जो आपको अतिरिक्त API सुविधाओं में महारत हासिल करने और अपने प्रोजेक्ट्स में वैकल्पिक कार्यान्वयन दृष्टिकोणों का अन्वेषण करने में मदद करती हैं। + +- [Aspose.Html के साथ HTML कैसे सहेजें – पूर्ण C# गाइड](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [C# में HTML कैसे सहेजें – कस्टम रिसोर्स हैंडलर का उपयोग करके पूर्ण गाइड](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [HTML को PNG में रेंडर कैसे करें – पूर्ण चरण‑दर‑चरण गाइड](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hindi/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/hindi/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..016c73ce62 --- /dev/null +++ b/html/hindi/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,206 @@ +--- +category: general +date: 2026-09-19 +description: Python और Aspose.HTML का उपयोग करके स्थानीय HTML फ़ाइल को PDF में बदलें + – एक पूर्ण चरण‑दर‑चरण गाइड जो HTML को PDF में बदलने के Python विकल्पों को भी कवर + करता है। +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: hi +lastmod: 2026-09-19 +og_description: Python का उपयोग करके स्थानीय HTML फ़ाइल को PDF में बदलें। Aspose.HTML + के साथ HTML को PDF में बदलने का सर्वोत्तम तरीका सीखें, जिसमें फ़ॉन्ट एम्बेडिंग और + त्रुटि संभालना शामिल है। +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Python के साथ स्थानीय HTML फ़ाइल को PDF में बदलें – पूर्ण गाइड +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Python के साथ स्थानीय HTML फ़ाइल को PDF में कैसे बदलें +url: /hi/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python के साथ स्थानीय HTML फ़ाइल को PDF में कैसे बदलें + +यदि आपको Python प्रोजेक्ट में **स्थानीय HTML फ़ाइल को PDF में बदलना** है, तो यह ट्यूटोरियल तैयार‑चलाने योग्य समाधान दिखाता है। आप देखेंगे कि Aspose.HTML लाइब्रेरी को कैसे सेट‑अप करें, PDF विकल्पों को कॉन्फ़िगर करें, और कुछ ही पंक्तियों के कोड में रूपांतरण कैसे चलाएँ। गाइड **convert html to pdf python** की सर्वोत्तम प्रथाओं को भी समझाता है, ताकि आप कोड को अपने वर्कफ़्लो में अनुकूलित कर सकें। + +नीचे दिए गए चरणों में सब कुछ शामिल है: SDK स्थापित करना, सेव ऑप्शन तैयार करना, सामान्य समस्याओं को संभालना, और आउटपुट की पुष्टि करना। लेख के अंत तक आपके पास एक पुन: उपयोग योग्य फ़ंक्शन होगा जिसे आप किसी भी Python एप्लिकेशन में डाल सकते हैं। + +## Prerequisites + +शुरू करने से पहले सुनिश्चित करें कि आपके पास है: + +* आपके मशीन पर Python 3.8 या उससे नया संस्करण स्थापित हो। +* एक सक्रिय Aspose.HTML for Python लाइसेंस (मुफ़्त ट्रायल मूल्यांकन के लिए काम करता है)। +* वह स्थानीय HTML फ़ाइल जिसे आप PDF में बदलना चाहते हैं (जैसे, `page.html`)। + +आपको कोई अतिरिक्त सिस्टम‑लेवल निर्भरताएँ नहीं चाहिए; SDK PDF जनरेशन के लिए आवश्यक सब कुछ बंडल करता है। + +## Install the Aspose.HTML package + +Aspose.HTML SDK PyPI के माध्यम से वितरित किया जाता है। अपने वर्चुअल एनवायरनमेंट में `pip` के साथ इसे स्थापित करें: + +```bash +pip install aspose-html +``` + +कमांड चलाने पर स्थापित संस्करण प्रदर्शित होगा, जिससे पुष्टि होगी कि पैकेज इम्पोर्ट के लिए उपलब्ध है। + +## Step 1: Import the required classes + +रूपांतरण वर्कफ़्लो दो मुख्य क्लासों पर निर्भर करता है: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` वह स्थैतिक `convert_html` मेथड प्रदान करता है जो वास्तविक परिवर्तन करता है। +* `PDFSaveOptions` आपको PDF आउटपुट को बारीकी से ट्यून करने देता है, जैसे मानक फ़ॉन्ट एम्बेड करना। + +## Step 2: Create PDF save options and enable embedding of standard fonts + +फ़ॉन्ट एम्बेड करने से यह सुनिश्चित होता है कि उत्पन्न PDF हर डिवाइस पर समान दिखे, भले ही व्यूअर के पास स्थानीय रूप से फ़ॉन्ट न हों। + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +`embed_standard_fonts` को `True` सेट करना अधिकांश प्रोडक्शन परिदृश्यों के लिए अनुशंसित है क्योंकि यह PDF रीडर्स में फ़ॉन्ट‑सब्स्टिट्यूशन चेतावनियों को समाप्त करता है। + +## Step 3: Convert the HTML file to PDF using the configured options + +अब `Converter.convert_html` को कॉल करें, स्रोत HTML पथ, लक्ष्य PDF पथ, और वह विकल्प ऑब्जेक्ट पास करें जिसे आपने तैयार किया था: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +यदि रूपांतरण सफल होता है, तो मेथड `None` लौटाता है और PDF फ़ाइल उस स्थान पर बन जाती है जिसे आपने निर्दिष्ट किया था। + +## Full example in a reusable function + +तर्क को एक फ़ंक्शन में लपेटने से इसे कई प्रोजेक्ट्स में आसानी से पुन: उपयोग किया जा सकता है: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Why the function helps + +* **Input validation** – `FileNotFoundError` HTML पथ गलत होने पर डिबगिंग को आसान बनाता है। +* **Automatic directory creation** – `os.makedirs(..., exist_ok=True)` “डायरेक्टरी मौजूद नहीं है” त्रुटियों को रोकता है। +* **Configurable font embedding** – यदि आप जानते हैं कि लक्ष्य वातावरण में आवश्यक फ़ॉन्ट पहले से मौजूद हैं, तो छोटे फ़ाइल आकार के लिए फ़ॉन्ट एम्बेडिंग बंद कर सकते हैं। + +## Common edge cases and how to handle them + +| Situation | Recommended handling | +|-----------|----------------------| +| **HTML contains external CSS or images** | पूर्ण (absolute) URLs का उपयोग करें या संसाधनों को HTML फ़ाइल के साथ ही कॉपी रखें; Aspose.HTML ब्राउज़र के समान नियमों का पालन करता है। | +| **Large HTML files (>10 MB)** | यदि `OutOfMemoryException` मिलता है तो `pdf_options.memory_limit` सेट करके डिफ़ॉल्ट मेमोरी सीमा बढ़ाएँ। | +| **You need password‑protected PDFs** | `convert_html` कॉल करने से पहले `pdf_options.encryption_details` में उपयोगकर्ता पासवर्ड सेट करें। | +| **Running in a headless server** | अतिरिक्त कोई कॉन्फ़िगरेशन आवश्यक नहीं है; SDK GUI पर निर्भर नहीं है। | + +इन परिदृश्यों को पहले से संभालने से अनपेक्षित रन‑टाइम त्रुटियों से बचा जा सकता है। + +## Verifying the conversion result + +स्क्रिप्ट समाप्त होने के बाद, उत्पन्न PDF को किसी भी व्यूअर (Adobe Reader, Chrome, आदि) से खोलें। दृश्य लेआउट मूल HTML से मेल खाना चाहिए, और सभी फ़ॉन्ट सही ढंग से दिखने चाहिए क्योंकि वे एम्बेड किए गए थे। + +आप प्रोग्रामेटिक रूप से यह भी पुष्टि कर सकते हैं कि फ़ाइल मौजूद है और उसका आकार शून्य नहीं है: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Pro tips for production use + +* **Batch processing** – HTML फ़ाइलों की सूची पर लूप चलाएँ और प्रत्येक के लिए `html_to_pdf` कॉल करें; एक ही `PDFSaveOptions` इंस्टेंस को पुन: उपयोग करें ताकि ऑब्जेक्ट निर्माण ओवरहेड कम हो। +* **Logging** – Python के `logging` मॉड्यूल को एकीकृत करें ताकि रूपांतरण टाइमस्टैम्प और किसी भी अपवाद को कैप्चर किया जा सके। +* **Performance** – कई फ़ाइलों को बदलते समय `concurrent.futures.ThreadPoolExecutor` का उपयोग करके समानांतर रूपांतरण चलाने पर विचार करें, लेकिन ध्यान रखें कि SDK केवल अलग‑अलग `Converter` कॉल्स के लिए थ्रेड‑सेफ़ है। + +## Conclusion + +अब आपके पास Python का उपयोग करके **स्थानीय HTML फ़ाइल को PDF में बदलने** के लिए एक पूर्ण, प्रोडक्शन‑तैयार विधि है। समाधान आवश्यक चरणों को कवर करता है—Aspose.HTML स्थापित करना, PDF विकल्प कॉन्फ़िगर करना, सामान्य किनारी मामलों को संभालना, और आउटपुट की पुष्टि करना—और व्यापक **convert html to pdf python** वर्कफ़्लो को भी दर्शाता है। + +अब आप उन्नत सुविधाओं जैसे PDF एन्क्रिप्शन, कस्टम पेज साइज, या वॉटरमार्क जोड़ने का अन्वेषण कर सकते हैं, जो सभी समान SDK द्वारा समर्थित हैं। अपने प्रोजेक्ट के अनुसार सबसे उपयुक्त विकल्पों के साथ प्रयोग करें, और आप किसी भी Python वातावरण में HTML‑to‑PDF रूपांतरण को विश्वसनीय रूप से स्वचालित कर पाएँगे। + +--- + + +## What Should You Learn Next? + + +निम्नलिखित ट्यूटोरियल्स निकट‑संबंधित विषयों को कवर करते हैं जो इस गाइड में प्रदर्शित तकनीकों पर आधारित हैं। प्रत्येक संसाधन में पूर्ण कार्यशील कोड उदाहरण और चरण‑दर‑चरण व्याख्याएँ शामिल हैं, जिससे आप अतिरिक्त API सुविधाओं में महारत हासिल कर सकें और अपने प्रोजेक्ट्स में वैकल्पिक कार्यान्वयन दृष्टिकोणों का पता लगा सकें। + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [Convert HTML to PDF in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hindi/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/hindi/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..d463643452 --- /dev/null +++ b/html/hindi/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,221 @@ +--- +category: general +date: 2026-09-19 +description: Python में HTML को Markdown में बदलना सीखें। यह ट्यूटोरियल दिखाता है + कि कैसे HTML को Markdown के रूप में सहेजा जाए और HTML से तेज़ी से Markdown उत्पन्न + किया जाए। +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: hi +lastmod: 2026-09-19 +og_description: Python के साथ HTML को Markdown में बदलें। इस गाइड का पालन करके HTML + को Markdown के रूप में सहेजें, HTML से Markdown उत्पन्न करें, और एक HTML‑से‑Markdown + फ़ाइल बनाएं। +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Python में HTML को Markdown में बदलें – पूर्ण प्रोग्रामिंग गाइड +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Python के साथ HTML को Markdown में कैसे बदलें – चरण‑दर‑चरण मार्गदर्शिका +url: /hi/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python के साथ HTML को Markdown में बदलें – चरण‑दर‑चरण गाइड + +यदि आपको **HTML को Markdown में बदलने** की आवश्यकता है, तो यह गाइड आपको पूरी प्रक्रिया से गुज़राएगा। आप देखेंगे कि **HTML को Markdown के रूप में कैसे सहेजें**, HTML से Markdown उत्पन्न करें, और एक *html to markdown file* बनाएं जिसे स्थैतिक‑साइट जेनरेटर्स, दस्तावेज़ीकरण पाइपलाइन, या कोई भी कार्यप्रवाह जो प्लेन‑टेक्स्ट मार्कअप को प्राथमिकता देता है, में उपयोग किया जा सकता है। + +यह ट्यूटोरियल आवश्यक लाइब्रेरी को इंस्टॉल करने से लेकर एम्बेडेड इमेजेज़ और कस्टम फ़ॉर्मेटिंग जैसे एज केसों को संभालने तक सब कुछ कवर करता है। अंत तक, आपके पास चलाने योग्य स्क्रिप्ट और प्रत्येक चरण के महत्व की स्पष्ट समझ होगी। + +## Prerequisites + +शुरू करने से पहले सुनिश्चित करें कि आपके पास है: + +- अपने मशीन पर Python 3.8 या उससे नया स्थापित हो। +- Python स्क्रिप्टिंग का बुनियादी परिचय। +- टर्मिनल या कमांड प्रॉम्प्ट तक पहुंच। +- `aspose.html` लाइब्रेरी (या कोई भी संगत HTML‑to‑Markdown पैकेज)। यह ट्यूटोरियल **Aspose.HTML for Python via .NET** का उपयोग करता है, जो कोड उदाहरण में दिखाए गए `HTMLDocument`, `MarkdownSaveOptions`, और `Converter` क्लासेज़ प्रदान करता है। + +> **Pro tip:** यदि आप शुद्ध‑Python समाधान पसंद करते हैं, तो आप `aspose.html` को `html2text` पैकेज से बदल सकते हैं। समग्र प्रवाह वही रहता है। + +## Step 1: Install the conversion library + +पहले, वह लाइब्रेरी इंस्टॉल करें जो `HTMLDocument`, `MarkdownSaveOptions`, और `Converter` प्रदान करती है। निम्न कमांड चलाएँ: + +```bash +pip install aspose-html +``` + +पैकेज में वह नेटिव इंजन शामिल है जो **generate markdown from html** को तेज़ी और उच्च फ़िडेलिटी के साथ करता है। इंस्टॉलेशन आमतौर पर मानक ब्रॉडबैंड कनेक्शन पर एक मिनट से कम में समाप्त हो जाता है। + +## Step 2: Load the source HTML document + +HTML फ़ाइल को लोड करना कन्वर्ज़न पाइपलाइन में पहला ठोस कदम है। `HTMLDocument` क्लास फ़ाइल को पार्स करती है और मेमोरी में एक DOM बनाती है, जिसे बाद में कन्वर्टर चलाकर Markdown उत्पन्न करता है। + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Why this matters:** `HTMLDocument` ऑब्जेक्ट बनाकर आप सुनिश्चित करते हैं कि जटिल संरचनाएँ—टेबल्स, लिस्ट्स, और इनलाइन स्टाइल्स—कन्वर्ज़न से पहले सही ढंग से व्याख्यायित हों। इस चरण को छोड़ने से कन्वर्टर को रॉ टेक्स्ट पढ़ना पड़ेगा, जिससे फ़ॉर्मेटिंग खो सकती है। + +## Step 3: Configure Markdown save options + +`MarkdownSaveOptions` ऑब्जेक्ट आपको आउटपुट फ़ॉर्मेट को बारीकी से ट्यून करने देता है। **Git‑flavored Markdown** उत्पन्न करने के लिए `formatter` प्रॉपर्टी को `"GIT"` पर सेट करें। यह GitHub, GitLab, और Bitbucket जैसे प्लेटफ़ॉर्म द्वारा उपयोग किए जाने वाले सिंटैक्स से मेल खाता है। + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +आप अन्य सेटिंग्स जैसे `preserve_links` या `code_block_style` को भी अपनी downstream टूल्स में **save html as markdown** करने की योजना के अनुसार समायोजित कर सकते हैं। + +## Step 4: Convert the HTML to Markdown and save the result + +डॉक्यूमेंट लोड हो जाने और विकल्प कॉन्फ़िगर हो जाने के बाद, स्थैतिक `convert_html` मेथड को कॉल करें। यह मेथड DOM को पढ़ता है, चुने हुए फ़ॉर्मेटर को लागू करता है, और आउटपुट फ़ाइल लिखता है। + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +स्क्रिप्ट चलाने के बाद, निर्दिष्ट डायरेक्टरी में `output.md` नाम की नई फ़ाइल मिलेगी। इसे खोलने पर साफ़, Git‑compatible Markdown दिखेगा, जो संस्करण नियंत्रण या प्रकाशन के लिए तैयार है। + +## Step 5: Verify the generated markdown file + +एक त्वरित सत्यापन आपको यह पुष्टि करने में मदद करता है कि कन्वर्ज़न सफल रहा और **html to markdown file** में अपेक्षित सामग्री मौजूद है। + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +एक साधारण HTML पेज के लिए सामान्य आउटपुट इस प्रकार दिखता है: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +यदि आपको हेडिंग्स गायब या लिस्ट्स विकृत दिखें, तो **Step 3** पर वापस जाएँ और विभिन्न `formatter` मानों (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`) के साथ प्रयोग करें। + +## Advanced: Handling images and relative paths + +जब स्रोत HTML में इमेजेज़ हों, तो कन्वर्टर उन्हें डेटा URI के रूप में एम्बेड कर सकता है या मूल `src` एट्रिब्यूट को बरकरार रख सकता है। **generate markdown from html** प्रक्रिया को हल्का रखने के लिए, आप इमेज फ़ाइलों को एक समान फ़ोल्डर में कॉपी कर पाथ्स को समायोजित कर सकते हैं। + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +कन्वर्ज़न के बाद, Markdown इमेजेज़ को `![Alt text](images/picture.png)` की तरह रेफ़र करेगा। यह तरीका तब अच्छा काम करता है जब आप बाद में **save html as markdown** को किसी स्थैतिक‑साइट जेनरेटर में उपयोग करते हैं जो एसेट्स को समर्पित फ़ोल्डर में अपेक्षित करता है। + +## Full script you can copy‑paste + +नीचे पूर्ण, चलाने योग्य स्क्रिप्ट है जो सभी चरणों को सम्मिलित करती है। इसे `convert_html_to_md.py` के रूप में सहेजें और `python convert_html_to_md.py` के साथ चलाएँ। + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Expected output + +स्क्रिप्ट चलाने पर एक पुष्टि संदेश प्रिंट होता है, उसके बाद Markdown फ़ाइल की पहली दस पंक्तियाँ दिखती हैं, जैसा कि पहले दिखाया गया था। उत्पन्न `output.md` को किसी भी टेक्स्ट एडिटर में खोला जा सकता है, VS Code में प्रीव्यू किया जा सकता है, या Git रिपॉज़िटरी में कमिट किया जा सकता है। + +## Common questions and edge‑case handling + +| Question | Answer | +|----------|--------| +| **What if the HTML file is large (> 10 MB)?** | `HTMLDocument` क्लास इनपुट को स्ट्रीम करता है, इसलिए मेमोरी उपयोग मध्यम रहता है। हालांकि, यदि आपको `MemoryError` मिलता है तो Python प्रोसेस की मेमोरी लिमिट बढ़ाने पर विचार करें। | +| **Can I convert a string of HTML instead of a file?** | हाँ। `HTMLDocument.from_string(html_string)` (या समकक्ष कंस्ट्रक्टर) का उपयोग करें, फिर `Converter.convert_html` को कॉल करें। | +| **How do I keep original HTML comments?** | `md_options.preserve_comments = True` सेट करें। टिप्पणियाँ Markdown फ़ाइल के भीतर HTML टिप्पणियों (`<!-- … -->`) के रूप में दिखाई देंगी। | +| **Is it possible to target a different Markdown dialect?** | `md_options.formatter` को `"COMMONMARK"` या `"MARKDOWN_EXTRA"` में बदलें, लक्ष्य प्लेटफ़ॉर्म के अनुसार। | +| **Do I need to install .NET runtime separately?** | `aspose-html` पैकेज अधिकांश प्लेटफ़ॉर्म के लिए आवश्यक रनटाइम को बंडल करता है। Linux पर, सुनिश्चित करें कि `libgdiplus` इंस्टॉल है (`sudo apt-get install libgdiplus`)। | + +## Conclusion + +अब आप जानते हैं कि Python का उपयोग करके **convert HTML to Markdown** कैसे किया जाता है, **save html as markdown** कैसे किया जाता है, और **generate markdown from html** को फ़ॉर्मेटिंग और एसेट्स पर सूक्ष्म नियंत्रण के साथ कैसे किया जाता है। यह स्क्रिप्ट पूरी वर्कफ़्लो—स्रोत फ़ाइल लोड करने से लेकर साफ़ *html to markdown file* उत्पन्न करने तक—को दर्शाती है, जो संस्करण नियंत्रण या प्रकाशन के लिए तैयार है। + +अगले चरण में, **एकाधिक HTML फ़ाइलों को बैच में बदलना**, कन्वर्ज़न स्टेप को CI/CD पाइपलाइन में इंटीग्रेट करना, या Hugo या Jekyll जैसे विशिष्ट स्थैतिक‑साइट जेनरेटर्स के लिए Markdown आउटपुट को कस्टमाइज़ करना जैसे विषयों का अन्वेषण करें। विभिन्न `MarkdownSaveOptions` सेटिंग्स के साथ प्रयोग करके परिणाम को अपने प्रोजेक्ट की स्टाइल गाइड के अनुसार ढालें। + +Happy converting! + +## What Should You Learn Next? + +नीचे दिए गए ट्यूटोरियल्स उन विषयों को कवर करते हैं जो इस गाइड में प्रदर्शित तकनीकों पर आधारित हैं। प्रत्येक संसाधन में पूर्ण कार्यशील कोड उदाहरण और चरण‑दर‑चरण व्याख्याएँ शामिल हैं, जिससे आप अतिरिक्त API फीचर्स में महारत हासिल कर सकें और अपने प्रोजेक्ट्स में वैकल्पिक इम्प्लीमेंटेशन अप्रोचेज़ का अन्वेषण कर सकें। + +- [Aspose.HTML के साथ .NET में HTML को Markdown में बदलें](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Aspose.HTML for Java में HTML को Markdown में बदलें](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown को HTML में बदलें Java - 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/hindi/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/hindi/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..31ea3199ef --- /dev/null +++ b/html/hindi/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Python का उपयोग करके HTML को Markdown में परिवर्तित करते समय सुविधाओं + को कैसे सक्षम करें। सटीक फीचर नियंत्रण के साथ HTML दस्तावेज़ को परिवर्तित करना और + HTML को Markdown के रूप में सहेजना सीखें। +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: hi +lastmod: 2026-09-19 +og_description: HTML को Markdown में बदलते समय सुविधाओं को सक्षम करने का तरीका। यह + गाइड आपको चरण‑दर‑चरण दिखाता है कि कैसे एक HTML दस्तावेज़ को बदलें और सूक्ष्म नियंत्रण + के साथ HTML को Markdown के रूप में सहेजें। +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: HTML को Markdown में परिवर्तित करते समय सुविधाएँ कैसे सक्षम करें +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: HTML को Markdown में परिवर्तित करते समय सुविधाओं को कैसे सक्षम करें +url: /hi/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# HTML को Markdown में बदलते समय फीचर्स को सक्षम कैसे करें + +यदि आपको रूपांतरण के दौरान **फीचर्स को सक्षम करने के तरीके** की आवश्यकता है, तो यह गाइड आपको एक पूर्ण, चलाने योग्य समाधान देता है। आप देखेंगे कि HTML को Markdown में कैसे बदलें, कौन‑से Markdown फीचर्स उत्पन्न हों यह कैसे नियंत्रित करें, और एक ही पास में HTML को Markdown के रूप में कैसे सहेजें। + +उदाहरण में लोकप्रिय **GroupDocs.Conversion** Python SDK का उपयोग किया गया है, लेकिन अवधारणाएँ किसी भी लाइब्रेरी पर लागू होती हैं जो फीचर सेट को कॉन्फ़िगर करने देती है। इस ट्यूटोरियल के अंत तक आप एक HTML दस्तावेज़ को बदल सकते हैं, केवल लिंक और पैराग्राफ रखें, और अनचाहे टेबल, इमेज या कोड ब्लॉक्स से बच सकते हैं। + +## आप क्या हासिल करेंगे + +* **फ़ीचर्स को सक्षम करने के तरीके** Markdown सेव विकल्पों में +* एक स्पष्ट **HTML को Markdown में बदलें** कार्यप्रवाह +* चयनात्मक आउटपुट के साथ **HTML को कैसे बदलें** की क्षमता +* एक तैयार‑चलाने‑योग्य स्क्रिप्ट जो **HTML दस्तावेज़ को बदलती** है और **HTML को Markdown के रूप में सहेजती** है + +### पूर्वापेक्षाएँ + +* Python 3.8+ स्थापित +* `groupdocs-conversion` पैकेज (इंस्टॉल करने के लिए `pip install groupdocs-conversion`) +* एक नमूना HTML फ़ाइल (`sample.html`) ज्ञात डायरेक्टरी में + +--- + +## Markdown रूपांतरण में फ़ीचर्स को सक्षम करने का तरीका + +पहला कदम `MarkdownSaveOptions` ऑब्जेक्ट बनाना और कनवर्टर को बताना है कि आप कौन‑से तत्व रखना चाहते हैं। इस ट्यूटोरियल में हम केवल **लिंक** और **पैराग्राफ** को सक्षम करते हैं। + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**यह क्यों काम करता है:** +* `HTMLDocument` स्रोत फ़ाइल को रैप करता है ताकि कनवर्टर उसे पढ़ सके। +* `MarkdownSaveOptions` सभी रूपांतरण सेटिंग्स रखता है; `features` सूची वह मुख्य प्रॉपर्टी है जो **फ़ीचर्स को सक्षम करने के तरीके** को निर्धारित करती है। +* `["Link", "Paragraph"]` असाइन करके आप इंजन को केवल Markdown लिंक (`[text](url)`) और साधारण पैराग्राफ उत्पन्न करने के लिए कहते हैं, जबकि इमेज, टेबल और अन्य मार्कअप को त्याग दिया जाता है। +* `Converter.convert_html` वास्तविक **HTML को Markdown में बदलें** ऑपरेशन करता है और परिणाम `sample.md` में लिखता है। + +--- + +## कस्टम विकल्पों के साथ HTML दस्तावेज़ को कैसे बदलें + +यदि बाद में आपको अधिक फीचर फ़्लैग जोड़ने की आवश्यकता हो—जैसे `"Header"` या `"Bold"`—तो बस सूची को विस्तारित करें: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +अब `Converter.convert_html` कॉल इन अतिरिक्त तत्वों को भी शामिल करेगा। यह पैटर्न आपको **HTML को कैसे बदलें** को अत्यधिक कॉन्फ़िगरेबल तरीके से करने देता है, बिना कस्टम पार्सर लिखे। + +--- + +## विशिष्ट फ़ोल्डर में HTML को Markdown के रूप में कैसे सहेजें + +`convert_html` मेथड एक पूर्ण या सापेक्ष आउटपुट पाथ स्वीकार करता है। `output` नामक सब‑फ़ोल्डर में **HTML को Markdown के रूप में सहेजने** के लिए तीसरे आर्ग्यूमेंट को इस प्रकार समायोजित करें: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +स्क्रिप्ट चलाने पर `output` डायरेक्टरी (यदि मौजूद नहीं है) बन जाएगी और Markdown फ़ाइल वहाँ लिखी जाएगी। यह तरीका आपके स्रोत HTML और उत्पन्न Markdown को साफ‑सुथरा व्यवस्थित रखता है। + +--- + +## पूरी स्क्रिप्ट जिसे आप कॉपी‑पेस्ट कर सकते हैं + +नीचे पूरा प्रोग्राम दिया गया है, तैयार‑चलाने‑के‑लिए। `YOUR_DIRECTORY` को उस पाथ से बदलें जहाँ `sample.html` स्थित है। + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**अपेक्षित आउटपुट** (कंसोल में प्रिंट किया गया): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +`sample.md` खोलें और आप केवल Markdown लिंक और साधारण पैराग्राफ देखेंगे, उदाहरण के तौर पर: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +सभी अन्य HTML तत्वों को हटा दिया गया है क्योंकि **फ़ीचर्स को सक्षम करने के तरीके** ने आउटपुट को दो चयनित प्रकारों तक सीमित कर दिया था। + +--- + +## सामान्य प्रश्न और किनारे के मामलों + +| प्रश्न | उत्तर | +|----------|--------| +| *यदि HTML फ़ाइल में कोई लिंक नहीं है तो क्या होगा?* | कनवर्टर अभी भी पैराग्राफ लिखेगा; आउटपुट में लिंक सिंटैक्स के बिना साधारण टेक्स्ट रहेगा। | +| *क्या मैं सभी फ़ीचर्स को निष्क्रिय कर सकता हूँ?* | `markdown_options.features = []` सेट करने पर एक खाली Markdown फ़ाइल बनती है। इसे केवल परीक्षण के लिए उपयोग करें। | +| *SDK अमान्य HTML को कैसे संभालता है?* | पार्सर फ़ीचर फ़िल्टर लागू करने से पहले खराब मार्कअप को साफ़ करने की कोशिश करता है। त्रुटियों को लॉग किया जाता है लेकिन रूपांतरण नहीं रुकता। | +| *क्या टेबल हटाते हुए इमेज को रखना संभव है?* | हाँ। `markdown_options.features = ["Link", "Paragraph", "Image"]` सेट करें। फीचर सूची जोड़ने वाली (additive) है, हटाने वाली नहीं। | +| *यदि मुझे फ़ोल्डर में कई फ़ाइलें बदलनी हों तो क्या करें?* | रूपांतरण लॉजिक को एक लूप में रखें जो `Path.glob("*.html")` पर इटररेट करे। वही **फ़ीचर्स को सक्षम करने के तरीके** कॉन्फ़िगरेशन प्रत्येक फ़ाइल के लिए पुनः उपयोग किया जा सकता है। | + +**प्रो टिप:** बड़े बैच प्रोसेस करते समय `MarkdownSaveOptions` को एक बार बनाकर पुनः उपयोग करें। इससे ऑब्जेक्ट‑क्रिएशन ओवरहेड कम होता है और **HTML को Markdown में बदलें** पाइपलाइन तेज़ रहती है। + +--- + +## निष्कर्ष + +अब आप जानते हैं कि **फ़ीचर्स को सक्षम करने के तरीके** क्या हैं जब आप **HTML को Markdown में बदलते** हैं, कैसे **HTML को कैसे बदलें** चयनात्मक आउटपुट के साथ, और कैसे एक संक्षिप्त Python स्क्रिप्ट से **HTML दस्तावेज़ को बदलें** और **HTML को Markdown के रूप में सहेजें**। `MarkdownSaveOptions.features` को कॉन्फ़िगर करके आप अंतिम फ़ाइल में दिखाई देने वाले Markdown तत्वों पर पूरी तरह नियंत्रण पा सकते हैं। + +### अगले कदम + +* `"Header"`, `"Bold"` और `"Italic"` जैसे अतिरिक्त फीचर फ़्लैग का अन्वेषण करें ताकि आपका Markdown आउटपुट समृद्ध हो सके। +* इस स्क्रिप्ट को फ़ाइल‑वॉचर (जैसे `watchdog`) के साथ जोड़ें ताकि नई HTML फ़ाइलें आने पर स्वचालित रूप से बदल सकें। +* उन्नत परिदृश्यों जैसे PDF‑to‑Markdown या DOCX‑to‑HTML रूपांतरण के लिए [GroupDocs.Conversion Python SDK दस्तावेज़ीकरण](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) देखें। + +विभिन्न फीचर सेट्स के साथ प्रयोग करने और अपने निष्कर्ष समुदाय के साथ साझा करने में संकोच न करें। हैप्पी कनवर्टिंग! + +## आगे आप क्या सीखें? + +निम्नलिखित ट्यूटोरियल्स उन विषयों को कवर करते हैं जो इस गाइड में प्रदर्शित तकनीकों पर आधारित हैं। प्रत्येक संसाधन में पूर्ण कार्यशील कोड उदाहरण और चरण‑दर‑चरण व्याख्याएँ शामिल हैं, जिससे आप अतिरिक्त API फीचर्स में निपुण हो सकें और अपने प्रोजेक्ट्स में वैकल्पिक कार्यान्वयन दृष्टिकोणों का पता लगा सकें। + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hindi/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/hindi/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..d25747e396 --- /dev/null +++ b/html/hindi/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,246 @@ +--- +category: general +date: 2026-09-19 +description: Aspose.HTML for Python में ResourceHandlingOptions का उपयोग करके नेस्टेड + संसाधनों को सीमित करना सीखें। अधिकतम हैंडलिंग गहराई को नियंत्रित करें और अनंत लूप + से बचें। +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: hi +lastmod: 2026-09-19 +og_description: Aspose.HTML for Python में ResourceHandlingOptions का उपयोग करके नेस्टेड + रिसोर्सेज को सीमित करें। गहरी पुनरावृत्ति को रोकने और प्रदर्शन में सुधार करने के + लिए अधिकतम हैंडलिंग गहराई सेट करें। +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Aspose.HTML for Python में नेस्टेड रिसोर्सेज को सीमित करने का तरीका – चरण-दर-चरण + गाइड +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Aspose.HTML for Python के साथ HTML प्रोसेस करते समय नेस्टेड रिसोर्सेज को कैसे + सीमित करें +url: /hi/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Aspose.HTML for Python के साथ HTML प्रोसेसिंग में नेस्टेड रिसोर्सेज को कैसे लिमिट करें + +यदि आपको **नेस्टेड रिसोर्सेज को लिमिट** करना है जबकि HTML को रेंडर या कनवर्ट किया जा रहा हो, तो यह गाइड Aspose.HTML for Python को कॉन्फ़िगर करने के सटीक चरण दिखाता है। रिसोर्स हैंडलिंग की गहराई को नियंत्रित करने से वह पेज जिसमें कई लेयर CSS, JavaScript, या इमेज रेफ़रेंसेज़ होते हैं, अनियंत्रित रिकर्शन से बचता है। + +नेस्टेड रिसोर्सेज को लिमिट करना विशेष रूप से बड़े‑स्केल क्रॉलर्स, ईमेल रेंडरिंग पाइपलाइन, या किसी भी ऑटोमेटेड वर्कफ़्लो के लिए महत्वपूर्ण है जिसे मेमोरी और टाइम बजट के भीतर रहना होता है। अगले सेक्शन्स में आप जानेंगे कि आपको डिप्थ लिमिट क्यों सेट करनी चाहिए, `ResourceHandlingOptions` क्लास का उपयोग कैसे करें, और यह कैसे वैरिफ़ाई करें कि लिमिट अपेक्षित रूप से काम कर रहा है। + +## नेस्टेड रिसोर्सेज को लिमिट क्यों करना चाहिए + +HTML दस्तावेज़ अक्सर अन्य रिसोर्सेज़ को रेफ़र करते हैं—स्टाइलशीट्स, स्क्रिप्ट्स, इमेजेज, फ़ॉन्ट्स, या यहाँ तक कि अन्य HTML फ़ाइलें। इनमें से प्रत्येक रिसोर्स आगे अतिरिक्त फ़ाइलों को रेफ़र कर सकता है, जिससे डिपेंडेंसीज़ का एक ट्री बन जाता है। बिना किसी गार्ड के, यह ट्री अनियंत्रित रूप से गहरा हो सकता है: + +* एक पेज एक CSS फ़ाइल लोड करता है जो दूसरी CSS फ़ाइल इम्पोर्ट करती है, जो फिर दूसरी इम्पोर्ट करती है, और ऐसा चलता रहता है। +* JavaScript डायनामिकली अतिरिक्त स्क्रिप्ट्स लोड कर सकता है। +* एक ईमेल टेम्पलेट इमेजेज़ एम्बेड कर सकता है जो बाहरी URLs को रेफ़र करती हैं जो आगे अधिक एसेट्स की ओर रीडायरेक्ट होते हैं। + +जब रिकर्शन डिप्थ अनियंत्रित बढ़ती है, तो आप जोखिम में पड़ते हैं: + +* **अत्यधिक मेमोरी खपत** – प्रत्येक फ़ेच किया गया रिसोर्स बफ़र में जगह लेता है। +* **लंबे प्रोसेसिंग टाइम** – नेटवर्क लेटेंसी प्रत्येक लेवल के साथ गुणा हो जाती है। +* **संभव अनंत लूप** – सर्कुलर रेफ़रेंसेज़ इंजन को कभी रिटर्न न करने पर मजबूर कर सकती हैं। + +एक **मैक्स हैंडलिंग डिप्थ** सेट करने से Aspose.HTML को निर्दिष्ट लेवल्स के बाद रिसोर्स लिंक फ़ॉलो करना बंद कर देता है, जिससे परफ़ॉर्मेंस प्रेडिक्टेबल रहता है। + +## Aspose.HTML for Python में नेस्टेड रिसोर्सेज को लिमिट करने का तरीका + +Aspose.HTML `ResourceHandlingOptions` क्लास प्रदान करता है, जिसमें `max_handling_depth` प्रॉपर्टी होती है। एक न्यूमेरिक वैल्यू (जैसे `3`) असाइन करके आप इंजन को तीन नेस्टेड लेवल्स के बाद रोकने को निर्देश देते हैं। + +नीचे एक पूर्ण, रन करने योग्य उदाहरण है जो पूरे वर्कफ़्लो को दर्शाता है: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### प्रत्येक चरण की व्याख्या + +1. **पैकेज इंस्टॉल करें** – `aspose-html` व्हील आवश्यक है। पूर्णता के लिए `pip install` कमांड को कमेंट के रूप में दिखाया गया है। +2. **क्लासेज़ इम्पोर्ट करें** – `HtmlDocument` पेज लोड करता है, `ResourceHandlingOptions` लिमिट रखता है, और `HtmlLoadOptions` दोनों को जोड़ता है। +3. **ऑप्शन्स ऑब्जेक्ट बनाएं** – `ResourceHandlingOptions` को इंस्टैंशिएट करने से आपको एक म्यूटेबल कंटेनर मिलता है। +4. **`max_handling_depth` सेट करें** – `3` (या कोई भी इंटीजर) असाइन करके इंजन को तीन लेवल्स तक सीमित करें। यह **नेस्टेड रिसोर्सेज को लिमिट** करने का मुख्य भाग है। +5. **लोड कॉन्फ़िगरेशन में ऑप्शन्स अटैच करें** – `HtmlLoadOptions` आपको `resource_options` को लोडर में पास करने की अनुमति देता है। +6. **HTML लोड करें** – `HtmlDocument` का कंस्ट्रक्टर URL या फ़ाइल पाथ को `load_options` के साथ स्वीकार करता है। अब इंजन डिप्थ लिमिट का सम्मान करता है। +7. **वैरिफ़ाई करें** – `document.resources` पर इटरेट करके आप देख सकते हैं कि कितने रिसोर्सेज़ फ़ेच हुए और सबसे गहरा लेवल क्या था। यदि सबसे गहरा लेवल `3` या उससे कम है, तो लिमिट सफल रहा। +8. **सेव करें** – प्रोसेस्ड डॉक्यूमेंट को सहेजें। सेव्ड फ़ाइल में केवल अनुमत डिप्थ तक के रिसोर्सेज़ ही होंगे। + +#### अपेक्षित आउटपुट + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +संख्याएँ स्रोत पेज के आधार पर बदलेंगी, लेकिन सबसे गहरा लेवल कभी भी `3` से अधिक नहीं होगा क्योंकि हमने `max_handling_depth = 3` सेट किया है। + +## सामान्य वैरिएशन्स और एज केसेज़ + +### डिप्थ लिमिट बदलना + +आपके वातावरण के आधार पर आपको गहरा या उथला लिमिट चाहिए हो सकता है: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### लिमिट को पूरी तरह डिसेबल करना + +प्रॉपर्टी को `0` सेट करने से Aspose.HTML **किसी भी डिप्थ रिस्ट्रिक्शन को हटा** देता है: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +केवल तब ही करें जब आप सुनिश्चित हों कि स्रोत HTML अच्छी तरह से व्यवहार करता है। + +### सर्कुलर रेफ़रेंसेज़ को हैंडल करना + +डिप्थ लिमिट होने के बावजूद, सर्कुलर रेफ़रेंसेज़ उसी लेवल पर आ सकते हैं। Aspose.HTML साइकिल्स को डिटेक्ट करता है और पहले से प्रोसेस किए गए रिसोर्स को फिर से लोड करना बंद कर देता है, चाहे डिप्थ सेटिंग कुछ भी हो। हालांकि, `max_handling_depth` को कम करने से साइकिल मिलने की संभावना पहले से घट जाती है। + +### लोकल फ़ाइलों के साथ लिमिट का उपयोग + +इसी एप्रोच को लोकल HTML फ़ाइलों पर भी लागू किया जा सकता है: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +इंजन रिलेटिव `href` या `src` एट्रिब्यूट्स को रिमोट URLs की तरह ही ट्रीट करता है, और फ़ाइल सिस्टम रिसोर्सेज़ पर भी डिप्थ लिमिट लागू करता है। + +### अन्य Aspose.HTML फीचर्स के साथ इंटीग्रेशन + +यदि आपको **रिसोर्स डाउनलोड टाइमआउट** को भी कंट्रोल करना है, तो आप `ResourceHandlingOptions` को `NetworkOptions` के साथ कॉम्बाइन कर सकते हैं: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +दोनों ऑप्शन स्वतंत्र हैं, इसलिए आप परफ़ॉर्मेंस और सुरक्षा को एक साथ फाइन‑ट्यून कर सकते हैं। + +## प्रोडक्शन उपयोग के लिए प्रो टिप्स + +* **रिसोर्स ट्री लॉग करें** – डिबगिंग के दौरान `document.resources` पर इटरेट करके प्रत्येक रिसोर्स का URL और डिप्थ लॉग करें। इससे आपको समझने में मदद मिलती है कि कोई विशेष पेज आपकी अपेक्षाओं से अधिक क्यों है। +* **फ़ेच किए गए रिसोर्सेज़ को कैश करें** – यदि आप समान बाहरी एसेट्स को बार‑बार प्रोसेस करते हैं, तो कैशिंग सक्षम करें ताकि अनावश्यक नेटवर्क कॉल्स से बचा जा सके। +* **व्हाइटलिस्ट के साथ कॉम्बाइन करें** – यदि केवल कुछ डोमेन्स भरोसेमंद हैं, तो लोडिंग के बाद `document.resources` को फ़िल्टर करें और व्हाइटलिस्ट के बाहर के रिसोर्सेज़ को डिस्कार्ड करें। +* **एज‑केस पेजेज़ के साथ टेस्ट करें** – एक सिंथेटिक HTML फ़ाइल बनाएं जो 10 CSS फ़ाइलों की चेन इम्पोर्ट करती हो। वैरिफ़ाई करें कि आपका लिमिट चेन को इच्छित रूप से ट्रंकेट करता है। + +## निष्कर्ष + +अब आप जानते हैं कि **नेस्टेड रिसोर्सेज को लिमिट** कैसे किया जाता है Aspose.HTML for Python में `ResourceHandlingOptions.max_handling_depth` को कॉन्फ़िगर करके। डिप्थ लिमिट सेट करने से आपका एप्लिकेशन अत्यधिक मेमोरी उपयोग, लंबी प्रोसेसिंग टाइम, और गहराई वाले या सर्कुलर रिसोर्स रेफ़रेंसेज़ के कारण संभावित अनंत लूप से सुरक्षित रहता है। + +अब आप कर सकते हैं: + +* अपने परफ़ॉर्मेंस बजट के अनुसार डिप्थ एडजस्ट करें (`resource_handling_options.max_handling_depth`)। +* नेटवर्क टाइमआउट, कैशिंग, या डोमेन व्हाइटलिस्ट के साथ लिमिट को कॉम्बाइन करके मजबूत पाइपलाइन बनाएं। +* **रिसोर्स हैंडलिंग ऑप्शन्स**, **मैक्स हैंडलिंग डिप्थ**, और **नेस्टेड रिसोर्स हैंडलिंग** जैसे संबंधित टॉपिक्स को एक्सप्लोर करें ताकि HTML प्रोसेसिंग पर और अधिक कंट्रोल हासिल किया जा सके। + +विभिन्न डिप्थ वैल्यूज़ के साथ प्रयोग करें और देखें कि लोडेड रिसोर्स काउंट कैसे बदलता है। जब आप तैयार हों, तो इस पैटर्न को अपने बड़े HTML कन्वर्ज़न या रेंडरिंग सर्विस में इंटीग्रेट करें ताकि प्रेडिक्टेबल, सुरक्षित, और इफ़िशिएंट एक्सीक्यूशन सुनिश्चित हो सके। + +## आगे क्या सीखें? + +निम्नलिखित ट्यूटोरियल्स उन विषयों को कवर करते हैं जो इस गाइड में दिखाए गए तकनीकों पर आधारित हैं। प्रत्येक रिसोर्स में पूर्ण कार्यशील कोड उदाहरण और स्टेप‑बाय‑स्टेप एक्सप्लेनैशन शामिल हैं, जिससे आप अतिरिक्त API फीचर्स में महारत हासिल कर सकें और अपने प्रोजेक्ट्स में वैकल्पिक इम्प्लीमेंटेशन एप्रोचेज़ को एक्सप्लोर कर सकें। + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hindi/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/hindi/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..a905d9fb69 --- /dev/null +++ b/html/hindi/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,259 @@ +--- +category: general +date: 2026-09-19 +description: Python में HTML से PDF ट्यूटोरियल सीखें जो दिखाता है कि Aspose.HTML के + साथ HTML से जल्दी PDF कैसे जेनरेट करें। अभी चरण‑दर‑चरण गाइड का पालन करें। +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: hi +lastmod: 2026-09-19 +og_description: 'HTML से PDF ट्यूटोरियल: Python और Aspose.HTML का उपयोग करके किसी + भी HTML पेज को PDF फ़ाइल में बदलें। यह गाइड मिनटों में HTML से PDF बनाने का तरीका + दिखाता है।' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Python में HTML से PDF ट्यूटोरियल – पूर्ण चरण‑दर‑चरण गाइड +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Python का उपयोग करके HTML को PDF में बदलने का ट्यूटोरियल कैसे करें +url: /hi/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python का उपयोग करके HTML से PDF ट्यूटोरियल कैसे करें + +यदि आपको एक **html to pdf tutorial** चाहिए, तो यह गाइड आपको ठीक-ठीक दिखाता है कि कैसे कुछ ही पंक्तियों के Python कोड से HTML से PDF जेनरेट किया जा सकता है। चाहे आप रिपोर्ट निर्माण को स्वचालित कर रहे हों या वेब सामग्री को ऑफ़लाइन पढ़ने के लिए एक्सपोर्ट कर रहे हों, Aspose.HTML लाइब्रेरी परिवर्तन को आसान बनाती है। + +इस ट्यूटोरियल में आप सीखेंगे कि कैसे पर्यावरण सेटअप करें, रूपांतरण स्क्रिप्ट लिखें, और सामान्य किनारी मामलों जैसे कि गायब फ़ाइलें या कस्टम पेज सेटिंग्स को संभालें। अंत तक आप **how to generate pdf** फ़ाइलें किसी भी HTML स्रोत से Python इकोसिस्टम छोड़े बिना बना सकते हैं। + +## आपको क्या चाहिए + +* Python 3.8 या उससे नया स्थापित हो +* एक सक्रिय Aspose.HTML for Python लाइसेंस (मुफ़्त ट्रायल मूल्यांकन के लिए काम करता है) +* `pip` एक्सेस ताकि `aspose-html` पैकेज इंस्टॉल किया जा सके +* एक साधारण HTML फ़ाइल जिसे आप कनवर्ट करना चाहते हैं (उदाहरण के लिए, `input.html`) + +> **Pro tip:** अपने HTML और एसेट्स (images, CSS) को एक ही डायरेक्टरी में रखें ताकि रूपांतरण के दौरान पाथ‑रिज़ॉल्यूशन समस्याओं से बचा जा सके। + +## चरण 1: Aspose.HTML पैकेज इंस्टॉल करें + +एक टर्मिनल खोलें और निम्न कमांड चलाएँ: + +```bash +pip install aspose-html +``` + +`aspose-html` व्हील में उच्च‑गुणवत्ता रेंडरिंग के लिए आवश्यक नेटिव लाइब्रेरीज़ शामिल हैं, इसलिए अतिरिक्त सिस्टम डिपेंडेंसीज़ की आवश्यकता नहीं है। + +## चरण 2: एक न्यूनतम Python स्क्रिप्ट बनाएं + +`convert_html_to_pdf.py` नाम की नई फ़ाइल बनाएं और नीचे दिया गया कोड पेस्ट करें। यह स्क्रिप्ट **html to pdf tutorial** के तीन‑चरणीय प्रक्रिया पैटर्न का पालन करती है: इम्पोर्ट, पाथ परिभाषित करना, और रूपांतरण को कॉल करना। + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### यह क्यों काम करता है + +* **Importing `Converter`** आपको एक हाई‑लेवल API तक पहुंच देता है जो रेंडरिंग इंजन को एब्स्ट्रैक्ट करता है। +* **Defining absolute paths** स्क्रिप्ट के विभिन्न कार्य निर्देशिका से चलने पर रिलेटिव‑पाथ बग्स को रोकता है। +* **`Converter.convert_html`** पूरे रेंडरिंग पाइपलाइन—HTML पार्सिंग, CSS लेआउट, और PDF सीरियलाइज़ेशन—को एक कॉल में पूरा करता है, जो **how to generate pdf** को तेज़ी से करने का अनुशंसित तरीका है। + +## चरण 3: स्क्रिप्ट चलाएँ और आउटपुट सत्यापित करें + +टर्मिनल से स्क्रिप्ट निष्पादित करें: + +```bash +python convert_html_to_pdf.py +``` + +यदि सब कुछ सही ढंग से सेट है, तो आप देखेंगे: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +`output.pdf` को किसी भी PDF व्यूअर से खोलें। दस्तावेज़ मूल HTML पेज जैसा ही दिखना चाहिए, जिसमें फ़ॉन्ट, इमेजेज, और बेसिक CSS स्टाइलिंग शामिल हैं। + +![जनरेटेड PDF प्रीव्यू](https://example.com/images/pdf-preview.png "Python का उपयोग करके HTML से जनरेटेड PDF का स्क्रीनशॉट"){: .center-image alt="HTML फ़ाइल से जनरेटेड PDF का स्क्रीनशॉट Python का उपयोग करके"} + +## चरण 4: रूपांतरण को कस्टमाइज़ करना (वैकल्पिक) + +बेसिक **html to pdf tutorial** एक‑से‑एक रूपांतरण को कवर करता है, लेकिन वास्तविक दुनिया के परिदृश्य अक्सर समायोजन की आवश्यकता रखते हैं: + +| आवश्यकता | Aspose.HTML के साथ इसे कैसे प्राप्त करें | +|----------|----------------------------------------| +| पेज साइज सेट करें (A4, Letter) | `convert_html` को `PdfSaveOptions` ऑब्जेक्ट पास करें | +| मार्जिन या हेडर/फ़ूटर जोड़ें | ऑप्शन्स के अंदर `PdfPageSettings` उपयोग करें | +| कस्टम फ़ॉन्ट एम्बेड करें | फ़ॉन्ट फ़ाइलें उपलब्ध हों यह सुनिश्चित करें और `FontSettings` सेट करें | + +नीचे एक उदाहरण है जो पेज साइज को A4 सेट करता है और 1‑इंच मार्जिन जोड़ता है: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Note:** कस्टम ऑप्शन्स का उपयोग वह पसंदीदा **generate pdf from html** तकनीक है जब आपको लेआउट पर सटीक नियंत्रण चाहिए। + +## चरण 5: कई HTML फ़ाइलों को संभालना (बैच कन्वर्ज़न) + +यदि आपके पास HTML रिपोर्टों से भरा फ़ोल्डर है, तो आप उनके ऊपर लूप चला सकते हैं: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +यह स्निपेट एक स्केलेबल **python convert html pdf** वर्कफ़्लो दर्शाता है जो CI पाइपलाइनों या शेड्यूल्ड जॉब्स में फिट बैठता है। + +## सामान्य समस्याएँ और उन्हें कैसे टालें + +| समस्या | कारण | समाधान | +|--------|------|--------| +| PDF में छवियां गायब | रिलेटिव इमेज पाथ्स जो स्क्रिप्ट के अलग फ़ोल्डर से चलने पर टूट जाते हैं | `Converter` विकल्पों में absolute पाथ्स उपयोग करें या `base_uri` सेट करें | +| CSS लागू नहीं हुआ | एक URL के साथ रेफ़र किया गया एक्सटर्नल स्टाइलशीट जिसे इंटरनेट एक्सेस चाहिए | स्टाइलशीट को लोकली डाउनलोड करें और रिलेटिव पाथ से रेफ़र करें | +| फ़ॉन्ट प्रतिस्थापन | होस्ट मशीन पर फ़ॉन्ट इंस्टॉल नहीं है | प्रोजेक्ट में फ़ॉन्ट फ़ाइल शामिल करें और `FontSettings` कॉन्फ़िगर करें | + +इन किनारी मामलों को संभालने से आपका **export html as pdf** प्रक्रिया विभिन्न पर्यावरणों में मजबूत बनती है। + +## पूर्ण, चलाने योग्य उदाहरण + +नीचे पूर्ण स्क्रिप्ट है जिसमें वैकल्पिक सेटिंग्स, एरर हैंडलिंग, और बैच प्रोसेसिंग लॉजिक शामिल है। इसे `full_html_to_pdf.py` में कॉपी करें और पहले दिखाए अनुसार चलाएँ। + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +इस स्क्रिप्ट को चलाने से लक्ष्य डायरेक्टरी में प्रत्येक HTML फ़ाइल के लिए PDF बनता है, लगातार पेज सेटिंग्स लागू होते हैं—एक पूर्ण **python convert html pdf** समाधान जो प्रोडक्शन के लिए तैयार है। + +## निष्कर्ष + +अब आपके पास एक व्यावहारिक **html to pdf tutorial** है जो दिखाता है कि Python और Aspose.HTML का उपयोग करके HTML से PDF फ़ाइलें कैसे जेनरेट करें। गाइड ने पर्यावरण सेटअप, न्यूनतम रूपांतरण स्क्रिप्ट, वैकल्पिक कस्टमाइज़ेशन, बैच प्रोसेसिंग, और ट्रबलशूटिंग टिप्स को कवर किया। + +अब आप संबंधित विषयों का अन्वेषण कर सकते हैं जैसे **how to generate pdf** में वॉटरमार्क जोड़ना, कई PDFs को मर्ज करना, या HTML को अन्य फ़ॉर्मैट जैसे DOCX में कन्वर्ट करना। `PdfSaveOptions` API के साथ प्रयोग करके आउटपुट को फाइन‑ट्यून करें, और स्क्रिप्ट को वेब सर्विसेज या ऑटोमेटेड रिपोर्टिंग पाइपलाइनों में इंटीग्रेट करें। + +कोडिंग का आनंद लें, और अपने HTML कंटेंट को पॉलिश्ड PDFs में बदलने का मज़ा लें! + +## आगे आप क्या सीखें? + +नीचे दिए गए ट्यूटोरियल्स निकट संबंधी विषयों को कवर करते हैं जो इस गाइड में दिखाए गए तकनीकों पर आधारित हैं। प्रत्येक संसाधन में पूर्ण कार्यशील कोड उदाहरण और चरण‑दर‑चरण व्याख्याएँ शामिल हैं जो आपको अतिरिक्त API फीचर्स में महारत हासिल करने और अपने प्रोजेक्ट्स में वैकल्पिक इम्प्लीमेंटेशन एप्रोचेज़ को एक्सप्लोर करने में मदद करती हैं। + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [How to Convert HTML to PDF Java – Using Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hongkong/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/hongkong/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..9332ec0863 --- /dev/null +++ b/html/hongkong/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,258 @@ +--- +category: general +date: 2026-09-19 +description: 學習如何使用 Python 更改 HTML 檔案的標題。本指南涵蓋讀取 HTML、更新 title 標籤以及儲存已修改的 HTML。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: zh-hant +lastmod: 2026-09-19 +og_description: 如何使用 Python 更改 HTML 檔案的標題。請參考此完整範例,讀取 HTML、更新 title 標籤,並儲存修改後的文件。 +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: 如何使用 Python 更改 HTML 檔案的標題 – 步驟指南 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: 如何使用 Python 更改 HTML 檔案的標題 +url: /zh-hant/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何使用 Python 更改 HTML 檔案的標題 + +如果您需要在 HTML 文件中以程式方式 **how to change title**,Python 讓這項工作變得簡單。在本教學中,您將讀取 HTML 檔案、更新 `<title>` 元素,並將修改後的 HTML 儲存回磁碟——全部使用清晰、可執行的程式碼。 + +更改頁面標題是在產生靜態網站、客製化爬取的頁面或自動化 SEO 更新時的常見步驟。完成本指南後,您將了解如何 **update html title**、如何 **read html with python**,以及如何安全地 **save modified html**。 + +## 前置條件 + +- 已安裝 Python 3.8 或更新版本 +- `beautifulsoup4` 套件 (`pip install beautifulsoup4`) +- 您想編輯的 HTML 檔案(範例使用您自行選擇資料夾中的 `index.html`) + +不需要外部服務;所有操作皆在本機執行。 + +## 步驟 1:使用 Python 載入 HTML 檔案 + +第一個任務是以 **load html file python** 方式載入 HTML 檔案。使用 `BeautifulSoup` 可提供寬容的解析器,能處理不完整的標記。 + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*此步驟的重要性:* +`BeautifulSoup` 會建立樹狀結構,讓您能在不使用手動字串處理的情況下查詢與修改元素。內建的 `html.parser` 速度快且不需額外二進位檔案。 + +## 步驟 2:定位 `<title>` 元素 + +HTML 文件通常在 `<head>` 內只包含一個 `<title>` 標籤。我們取得第一個出現的標籤,以符合 **update html title** 的需求。 + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*為何要檢查 `None`:* +有些 HTML 片段會省略 title。自動加入可避免之後的錯誤,並使腳本更健壯。 + +## 步驟 3:變更標題文字 + +現在我們透過將新文字指派給標籤的 string 來 **update html title**。這就是 **how to change title** 操作的核心。 + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +`string` 屬性代表 `<title>` 內的文字節點。覆寫它即可在記憶體中更新 DOM。 + +## 步驟 4:儲存已修改的 HTML + +最後,將變更過的文件寫入新檔案。這完成了 **save modified html** 步驟,且不會影響原始檔案。 + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` 會以縮排格式化輸出,使檔案在變更後更易於閱讀。 + +### 預期輸出 + +在原始內容為以下的範例 `index.html` 上執行腳本: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +會產生類似以下的主控台輸出: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +儲存的 `index_modified.html` 現在會以以下內容開頭: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## 完整腳本,快速複製貼上 + +以下是結合所有四個步驟的完整、可直接執行程式。將其儲存為 `change_title.py`,並依需求調整 `YOUR_DIRECTORY`。 + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +執行腳本: + +```bash +python change_title.py +``` + +您會看到主控台訊息,以及一個已更新標題的 `index_modified.html` 新檔案。 + +## 其他提示與邊緣案例 + +| Situation | What to do | +|-----------|------------| +| **Multiple `<title>` tags** | `soup.find_all("title")` 會回傳一個列表;更新第一個元素,或在需要變更全部時遍歷。 | +| **Encoding problems** | 若檔案含有 BOM,請以 `encoding="utf-8-sig"` 開啟,或使用 `chardet` 偵測編碼。 | +| **Large HTML files** | 使用 `lxml` 解析器 (`BeautifulSoup(html_content, "lxml")`) 以提升效能。 | +| **Preserving original formatting** | 若必須保留完全相同的空白,請寫入 `str(soup)` 而非 `prettify()`。 | +| **Automating across many files** | 將邏輯包成函式,並以 `Path.rglob("*.html")` 迴圈處理多個檔案。 | + +這些變化在保留核心 **how to change title** 邏輯的同時,亦能因應實務專案的需求。 + +## 結論 + +您現在已了解如何使用 Python 在任何 HTML 文件中 **how to change title**。本教學涵蓋了讀取 HTML、定位 `<title>` 標籤、更新其文字,以及安全地 **save modified html**。有了完整腳本,您可以將此模式整合至靜態網站產生器、SEO 流程或任何需要動態變更標題的自動化工作。 + +接下來,您可以探索相關主題,例如用於擷取 meta 標籤的 **read html with python**,或用於處理不良標記的 **load html file python** 技術。嘗試批次處理以在整個網站中更新標題——您新學的技能是許多網頁自動化任務的基礎。祝程式開發愉快! + +## 接下來您可以學習什麼? + +以下教學涵蓋與本指南技術密切相關的主題。每個資源皆提供完整可運作的程式碼範例與逐步說明,協助您精通其他 API 功能,並在專案中探索替代實作方式。 + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hongkong/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/hongkong/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..4eea2de34d --- /dev/null +++ b/html/hongkong/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,200 @@ +--- +category: general +date: 2026-09-19 +description: 使用 Python 與 Aspose.HTML 轉換本地 HTML 檔案為 PDF – 完整的逐步指南,亦涵蓋 HTML 轉 PDF 的 + Python 選項。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: zh-hant +lastmod: 2026-09-19 +og_description: 使用 Python 將本機 HTML 檔案轉換為 PDF。了解使用 Aspose.HTML 在 Python 中將 HTML 轉換為 + PDF 的最佳方法,包含字型嵌入與錯誤處理。 +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: 使用 Python 將本機 HTML 檔案轉換為 PDF – 完整指南 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: 如何使用 Python 將本機 HTML 檔案轉換為 PDF +url: /zh-hant/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何使用 Python 將本機 HTML 檔案轉換為 PDF + +如果您需要在 Python 專案中 **將本機 HTML 檔案轉換為 PDF**,本教學提供一個即用的解決方案。您將看到如何設定 Aspose.HTML 函式庫、配置 PDF 選項,並僅用幾行程式碼執行轉換。指南亦說明 **convert html to pdf python** 的最佳實踐,讓您能將程式碼套用到自己的工作流程中。 + +以下步驟涵蓋您需要了解的全部內容:安裝 SDK、準備儲存選項、處理常見陷阱,以及驗證輸出。閱讀完本文後,您將擁有一個可重複使用的函式,能直接嵌入任何 Python 應用程式中。 + +## 前置條件 + +* 已在您的機器上安裝 Python 3.8 或更新版本。 +* 有效的 Aspose.HTML for Python 授權(免費試用版可用於評估)。 +* 您想要轉換成 PDF 的本機 HTML 檔案(例如 `page.html`)。 + +您不需要任何額外的系統層級相依性;SDK 已將產生 PDF 所需的全部元件打包在內。 + +## 安裝 Aspose.HTML 套件 + +Aspose.HTML SDK 透過 PyPI 發佈。請在您的虛擬環境中使用 `pip` 安裝: + +```bash +pip install aspose-html +``` + +執行指令會顯示已安裝的版本,確認套件可供匯入使用。 + +## 步驟 1:匯入所需類別 + +轉換流程依賴兩個主要類別: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` 提供執行實際轉換的靜態 `convert_html` 方法。 +* `PDFSaveOptions` 讓您微調 PDF 輸出,例如嵌入標準字型。 + +## 步驟 2:建立 PDF 儲存選項並啟用嵌入標準字型 + +嵌入字型可確保產生的 PDF 在任何裝置上皆保持相同外觀,即使檢視器本機未安裝該字型。 + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +將 `embed_standard_fonts` 設為 `True` 為大多數正式環境所建議,因為它可消除 PDF 閱讀器中的字型替換警告。 + +## 步驟 3:使用設定好的選項將 HTML 檔案轉換為 PDF + +現在呼叫 `Converter.convert_html`,傳入來源 HTML 路徑、目標 PDF 路徑,以及先前準備好的選項物件: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +若轉換成功,該方法會回傳 `None`,且 PDF 檔案會出現在您指定的位置。 + +## 完整範例(可重複使用的函式) + +將邏輯封裝於函式中,可輕鬆在多個專案間重複使用: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### 為何使用此函式有幫助 + +* **輸入驗證** – 當 HTML 路徑錯誤時,`FileNotFoundError` 可讓除錯更容易。 +* **自動建立目錄** – `os.makedirs(..., exist_ok=True)` 可避免「目錄不存在」的錯誤。 +* **可設定的字型嵌入** – 若您知道目標環境已具備所需字型,可關閉字型嵌入以減少檔案大小。 + +## 常見邊緣情況與處理方式 + +| 情況 | 建議處理方式 | +|-----------|----------------------| +| **HTML 包含外部 CSS 或圖片** | 使用絕對 URL,或將資源複製到 HTML 檔案旁邊;Aspose.HTML 的行為與瀏覽器相同。 | +| **大型 HTML 檔案(>10 MB)** | 若遇到 `OutOfMemoryException`,可透過設定 `pdf_options.memory_limit` 來提升預設記憶體上限。 | +| **需要受密碼保護的 PDF** | 在呼叫 `convert_html` 前,使用 `pdf_options.encryption_details` 設定使用者密碼。 | +| **在無頭伺服器上執行** | 不需要額外設定;SDK 不依賴圖形介面。 | + +提前處理這些情況可避免執行時出現意外錯誤。 + +## 驗證轉換結果 + +腳本執行完畢後,使用任意檢視器(Adobe Reader、Chrome 等)開啟產生的 PDF。視覺版面應與原始 HTML 相符,且所有字型皆正確顯示,因為已嵌入字型。 + +您也可以以程式方式確認檔案是否存在且大小非零: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## 生產環境的專業技巧 + +* **批次處理** – 迭代 HTML 檔案清單,對每個檔案呼叫 `html_to_pdf`;重複使用同一個 `PDFSaveOptions` 實例以減少物件建立開銷。 +* **日誌記錄** – 整合 Python 的 `logging` 模組,以捕捉轉換時間戳記與例外情況。 +* **效能** – 轉換大量檔案時,可考慮使用 `concurrent.futures.ThreadPoolExecutor` 平行執行,但需注意 SDK 只在獨立的 `Converter` 呼叫間具備執行緒安全性。 + +## 結論 + +現在您已擁有一套完整、可投入生產環境的 **將本機 HTML 檔案轉換為 PDF** 方法,使用 Python。此解決方案涵蓋關鍵步驟——安裝 Aspose.HTML、配置 PDF 選項、處理常見邊緣情況與驗證輸出,同時示範更廣泛的 **convert html to pdf python** 工作流程。 + +接下來您可以探索進階功能,例如 PDF 加密、自訂頁面尺寸或加入浮水印,這些皆由同一套 SDK 支援。試驗最適合您專案的選項,即可在任何 Python 環境中可靠地自動化 HTML 轉 PDF。 + +--- + +## 接下來該學什麼? + +以下教學涵蓋與本指南技術緊密相關的主題,並以完整可執行的程式碼範例與逐步說明,協助您精通其他 API 功能,並在專案中探索替代實作方式。 + +- [使用 Aspose.HTML 轉換 HTML 為 PDF – 完整步驟指南](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [使用 Aspose.HTML 轉換 HTML 為 PDF – 完整操作指南](/html/english/) +- [.NET 使用 Aspose.HTML 轉換 HTML 為 PDF](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hongkong/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/hongkong/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..de1a940c78 --- /dev/null +++ b/html/hongkong/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,217 @@ +--- +category: general +date: 2026-09-19 +description: 學習在 Python 中將 HTML 轉換為 Markdown。本教學示範如何快速將 HTML 儲存為 Markdown 以及從 HTML + 產生 Markdown。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: zh-hant +lastmod: 2026-09-19 +og_description: 使用 Python 將 HTML 轉換為 Markdown。請依照本指南將 HTML 儲存為 Markdown、從 HTML 產生 + Markdown,並建立 HTML 轉 Markdown 檔案。 +og_image_alt: Screenshot showing convert html to markdown script output +og_title: 在 Python 中將 HTML 轉換為 Markdown – 完整程式設計指南 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: 如何使用 Python 將 HTML 轉換為 Markdown – 步驟指南 +url: /zh-hant/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何使用 Python 將 HTML 轉換為 Markdown – 步驟指南 + +如果您需要 **convert HTML to Markdown**,本指南將帶您完成整個過程。您將看到如何 **save HTML as Markdown**,從 HTML 產生 Markdown,並產生一個 *html to markdown file*,可用於 static‑site generators、文件管線或任何偏好純文字標記的工作流程。 + +本教學涵蓋從安裝所需函式庫到處理嵌入圖片與自訂格式等邊緣案例的全部內容。完成後,您將擁有一個可直接執行的腳本,並清楚了解每一步的意義。 + +## 前置條件 + +- 已在您的機器上安裝 Python 3.8 或更新版本。 +- 具備基本的 Python 腳本撰寫經驗。 +- 可使用終端機或命令提示字元。 +- `aspose.html` 函式庫(或任何相容的 HTML‑to‑Markdown 套件)。本教學使用 **Aspose.HTML for Python via .NET**,提供 `HTMLDocument`、`MarkdownSaveOptions` 與 `Converter` 類別,如程式碼範例所示。 + +> **Pro tip:** 如果您偏好純 Python 解決方案,可以將 `aspose.html` 換成 `html2text` 套件。整體流程保持不變。 + +## 第一步:安裝轉換函式庫 + +首先,安裝提供 `HTMLDocument`、`MarkdownSaveOptions` 與 `Converter` 的函式庫。執行以下指令: + +```bash +pip install aspose-html +``` + +此套件內含原生引擎,可快速且高保真地 **generate markdown from html**。在一般寬頻環境下,安裝通常在一分鐘內完成。 + +## 第二步:載入來源 HTML 文件 + +載入 HTML 檔案是轉換管線中的第一個具體動作。`HTMLDocument` 類別會解析檔案並在記憶體中建立 DOM,之後轉換器會遍歷此結構以產生 Markdown。 + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Why this matters:** 透過建立 `HTMLDocument` 物件,您可確保表格、清單、內嵌樣式等複雜結構在轉換前被正確解讀。若省略此步驟,轉換器將直接讀取原始文字,導致格式遺失。 + +## 第三步:設定 Markdown 儲存選項 + +`MarkdownSaveOptions` 物件讓您微調輸出格式。若要產生 **Git‑flavored Markdown**,請將 `formatter` 屬性設為 `"GIT"`。此設定符合 GitHub、GitLab、Bitbucket 等平台使用的語法。 + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +您也可以調整其他設定,例如 `preserve_links` 或 `code_block_style`,視您在下游工具中 **save html as markdown** 的需求而定。 + +## 第四步:將 HTML 轉換為 Markdown 並儲存結果 + +在文件已載入且選項已設定完畢後,呼叫靜態的 `convert_html` 方法。此方法會讀取 DOM、套用選定的 formatter,並寫入輸出檔案。 + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +執行腳本後,您會在指定目錄中看到名為 `output.md` 的新檔案。開啟它即可看到乾淨、相容 Git 的 Markdown,適合版本控制或發佈使用。 + +## 第五步:驗證產生的 markdown 檔案 + +快速的 sanity check 可協助您確認轉換是否成功,以及 **html to markdown file** 是否包含預期內容。 + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +簡單 HTML 頁面的典型輸出如下: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +若發現標題遺失或清單格式錯亂,請回到 **Step 3**,嘗試不同的 `formatter` 值(如 `"COMMONMARK"`、`"MARKDOWN_EXTRA"`)。 + +## 進階:處理圖片與相對路徑 + +當來源 HTML 包含圖片時,轉換器可以將其嵌入為 data URI,或保留原始 `src` 屬性。為了讓 **generate markdown from html** 的流程保持輕量,您可能需要將圖片檔案複製到平行資料夾,並調整路徑。 + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +轉換完成後,Markdown 會以 `![Alt text](images/picture.png)` 方式引用圖片。此作法在您之後於 static‑site generator 中 **save html as markdown** 且需要將資產放在專屬資料夾時相當適用。 + +## 完整腳本,直接複製貼上 + +以下是結合所有步驟的完整可執行腳本。請將其儲存為 `convert_html_to_md.py`,並以 `python convert_html_to_md.py` 執行。 + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### 預期輸出 + +執行腳本會印出確認訊息,並顯示 Markdown 檔案的前十行,如前述示例所示。產生的 `output.md` 可在任何文字編輯器中開啟、於 VS Code 預覽,或提交至 Git 倉庫。 + +## 常見問題與邊緣案例處理 + +| Question | Answer | +|----------|--------| +| **What if the HTML file is large (> 10 MB)?** | The `HTMLDocument` class streams the input, so memory usage stays moderate. However, consider increasing the Python process’s memory limit if you encounter `MemoryError`. | +| **Can I convert a string of HTML instead of a file?** | Yes. Use `HTMLDocument.from_string(html_string)` (or the equivalent constructor) before calling `Converter.convert_html`. | +| **How do I keep original HTML comments?** | Set `md_options.preserve_comments = True`. The comments will appear as HTML comments (`<!-- … -->`) inside the Markdown file. | +| **Is it possible to target a different Markdown dialect?** | Change `md_options.formatter` to `"COMMONMARK"` or `"MARKDOWN_EXTRA"` depending on the target platform. | +| **Do I need to install .NET runtime separately?** | The `aspose-html` package bundles the required runtime for most platforms. On Linux, ensure `libgdiplus` is installed (`sudo apt-get install libgdiplus`). | + +## 結論 + +您現在已了解如何使用 Python **convert HTML to Markdown**、如何 **save html as markdown**,以及如何透過細緻的設定 **generate markdown from html**,同時掌握格式與資產的控制。此腳本示範了完整工作流程——從載入來源檔案到產出乾淨的 *html to markdown file*,適合版本控制或發佈。 + +接下來,您可以探索如 **batch converting multiple HTML files**、將轉換步驟整合至 CI/CD pipeline,或為 Hugo、Jekyll 等特定 static‑site generator 客製化 Markdown 輸出。試著調整各種 `MarkdownSaveOptions` 設定,讓結果更符合專案的風格指南。 + +祝轉換順利! + +## 接下來您可以學習什麼? + +以下教學涵蓋與本指南技術緊密相關的主題,並提供完整可執行的程式碼範例與逐步說明,協助您精通更多 API 功能,或在自己的專案中探索替代實作方式。 + +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/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/hongkong/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/hongkong/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..1d1aacef3f --- /dev/null +++ b/html/hongkong/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,217 @@ +--- +category: general +date: 2026-09-19 +description: 如何在使用 Python 將 HTML 轉換為 Markdown 時啟用特性。學習將 HTML 文件轉換並以精確的特性控制將 HTML 儲存為 + Markdown。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: zh-hant +lastmod: 2026-09-19 +og_description: 如何在將 HTML 轉換為 Markdown 時啟用功能。本指南一步一步教您如何將 HTML 文件轉換為 Markdown,並以細緻的控制方式儲存。 +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: 在將 HTML 轉換為 Markdown 時如何啟用功能 +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: 在將 HTML 轉換為 Markdown 時,如何啟用功能 +url: /zh-hant/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 在將 HTML 轉換為 Markdown 時如何啟用功能 + +如果您在轉換過程中需要 **如何啟用功能**,本指南將提供完整且可執行的解決方案。您將清楚看到如何將 HTML 轉換為 Markdown、控制產生的 Markdown 功能,以及在一次操作中將 HTML 儲存為 Markdown。 + +本範例使用廣受歡迎的 **GroupDocs.Conversion** Python SDK,但其概念適用於任何允許您設定功能集合的函式庫。完成本教學後,您即可將 HTML 文件轉換,只保留連結與段落,並避免不需要的表格、圖片或程式碼區塊。 + +## 您將達成的目標 + +* **如何啟用功能** 在 Markdown 儲存選項中 +* 清晰的 **將 HTML 轉換為 Markdown** 工作流程 +* 能夠 **將 HTML 轉換** 並選擇性輸出 +* 一個即時可執行的腳本,可 **將 HTML 文件轉換** 並 **將 HTML 儲存為 Markdown** + +### 前置條件 + +* 已安裝 Python 3.8+ +* `groupdocs-conversion` 套件(使用 `pip install groupdocs-conversion` 安裝) +* 一個位於已知目錄的範例 HTML 檔案 (`sample.html`) + +--- + +## 在 Markdown 轉換中如何啟用功能 + +第一步是建立 `MarkdownSaveOptions` 物件,並告訴轉換器您想保留哪些元素。在本教學中,我們僅啟用 **links** 與 **paragraphs**。 + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**為什麼這樣有效:** +* `HTMLDocument` 包裝來源檔案,使轉換器能讀取它。 +* `MarkdownSaveOptions` 保存所有轉換設定;`features` 清單是關鍵屬性,用於 **如何啟用功能**。 +* 透過指派 `["Link", "Paragraph"]`,您告訴引擎僅產生 Markdown 連結 (`[text](url)`) 與純文字段落,捨棄圖片、表格及其他標記。 +* `Converter.convert_html` 執行實際的 **將 HTML 轉換為 Markdown** 操作,並將結果寫入 `sample.md`。 + +--- + +## 使用自訂選項將 HTML 文件轉換 + +如果之後需要加入更多功能旗標,例如 `"Header"` 或 `"Bold"`,只需擴充清單即可: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +相同的 `Converter.convert_html` 呼叫現在會包含這些額外元素。此模式讓您 **將 HTML 轉換** 時具備高度可配置性,無需自行編寫解析器。 + +--- + +## 在特定資料夾中將 HTML 儲存為 Markdown + +`convert_html` 方法接受絕對或相對的輸出路徑。若要 **將 HTML 儲存為 Markdown** 到名為 `output` 的子資料夾,請調整第三個參數: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +執行腳本會建立 `output` 目錄(若不存在),並將 Markdown 檔案寫入其中。此方式可讓您的來源 HTML 與產生的 Markdown 整齊有序。 + +--- + +## 完整腳本,您可以直接複製貼上 + +以下是完整程式碼,已可直接執行。請將 `YOUR_DIRECTORY` 替換為存放 `sample.html` 的路徑。 + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**預期輸出**(列印於主控台): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +開啟 `sample.md`,您將只看到 Markdown 連結與純文字段落,例如: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +所有其他 HTML 元素皆已被省略,因為 **如何啟用功能** 將輸出限制於這兩種選取的類型。 + +--- + +## 常見問題與邊緣案例 + +| 問題 | 答案 | +|----------|--------| +| *如果 HTML 檔案不包含連結呢?* | 轉換器仍會寫入段落;輸出將僅含純文字,沒有連結語法。 | +| *我可以停用所有功能嗎?* | 將 `markdown_options.features = []` 設定為空清單會產生空的 Markdown 檔案。僅於測試時使用此設定。 | +| *SDK 如何處理無效的 HTML?* | 解析器會在套用功能過濾器前嘗試清理錯誤的標記。錯誤會被記錄,但不會中止轉換。 | +| *是否可以保留圖片同時移除表格?* | 可以。將 `markdown_options.features = ["Link", "Paragraph", "Image"]` 設定即可。功能清單是累加的,而非排他的。 | +| *如果需要在資料夾中轉換多個檔案呢?* | 將轉換邏輯包在迴圈中,遍歷 `Path.glob("*.html")`。相同的 **如何啟用功能** 設定可重複使用於每個檔案。 | + +**專業提示:** 在處理大量批次時,僅建立一次 `MarkdownSaveOptions` 並重複使用。這可減少物件建立的開銷,並讓 **將 HTML 轉換為 Markdown** 流程保持快速。 + +--- + +## 結論 + +現在您已了解在 **如何啟用功能** 時 **將 HTML 轉換為 Markdown**,以及如何 **將 HTML 轉換** 並選擇性輸出,並且能使用簡潔的 Python 腳本 **將 HTML 文件轉換** 並 **將 HTML 儲存為 Markdown**。透過設定 `MarkdownSaveOptions.features`,您可以完整掌控最終檔案中出現的 Markdown 元素。 + +### 後續步驟 + +* 探索額外的功能旗標,如 `"Header"`、`"Bold"` 與 `"Italic"`,以豐富您的 Markdown 輸出。 +* 將此腳本與檔案監看程式(例如 `watchdog`)結合,於新 HTML 檔案到達時自動轉換。 +* 查閱 [GroupDocs.Conversion Python SDK 文件](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples),了解 PDF 轉 Markdown 或 DOCX 轉 HTML 等進階情境。 + +歡迎嘗試不同的功能組合,並與社群分享您的發現。祝您轉換愉快! + +## 接下來您應該學習什麼? + +以下教學涵蓋與本指南緊密相關的主題,並以此為基礎。每個資源皆提供完整可運作的程式碼範例與逐步說明,協助您精通更多 API 功能,並在自己的專案中探索替代實作方式。 + +- [在 Aspose.HTML for Java 中將 HTML 轉換為 Markdown](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown 轉 HTML Java - 使用 Aspose.HTML 轉換](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [如何在 Aspose HTML 中啟用 JavaScript – 載入 HTML 並取得文字](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hongkong/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/hongkong/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..36f61b7db9 --- /dev/null +++ b/html/hongkong/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,240 @@ +--- +category: general +date: 2026-09-19 +description: 了解如何在 Aspose.HTML for Python 中使用 ResourceHandlingOptions 限制嵌套資源。控制最大處理深度,避免無限迴圈。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: zh-hant +lastmod: 2026-09-19 +og_description: 使用 ResourceHandlingOptions 限制 Aspose.HTML for Python 中的嵌套資源。設定最大處理深度以防止過深的遞迴並提升效能。 +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: 如何在 Aspose.HTML for Python 中限制嵌套資源 – 逐步指南 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: 如何在使用 Aspose.HTML for Python 處理 HTML 時限制嵌套資源 +url: /zh-hant/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何在 Aspose.HTML for Python 中限制 HTML 處理時的巢狀資源 + +如果您在渲染或轉換 HTML 時需要 **限制巢狀資源**,本指南將示範如何正確設定 Aspose.HTML for Python。控制資源處理的深度可防止當頁面包含多層 CSS、JavaScript 或影像參考時產生無止盡的遞迴。 + +在大型爬蟲、電子郵件渲染管線,或任何必須在記憶體與時間預算內運行的自動化工作流程中,限制巢狀資源尤為重要。以下章節將說明為何需要設定深度限制、如何使用 `ResourceHandlingOptions` 類別,以及如何驗證限制是否如預期運作。 + +## 為何要限制巢狀資源 + +HTML 文件常會引用其他資源——樣式表、腳本、影像、字型,甚至其他 HTML 檔案。每個資源又可能再引用其他檔案,形成一棵依賴樹。若未設置防護,這棵樹可能變得任意深: + +* 頁面載入一個 CSS 檔案,該檔案再匯入另一個 CSS,依此類推。 +* JavaScript 可能動態載入額外腳本。 +* 電子郵件範本可能嵌入影像,這些影像的 URL 會再導向更多資產。 + +當遞迴深度失控時,您會面臨: + +* **記憶體消耗過大** ─ 每取得的資源都會佔用緩衝區。 +* **處理時間變長** ─ 每一層都會增加網路延遲。 +* **可能的無限迴圈** ─ 循環參考會讓引擎永遠不返回。 + +設定 **最大處理深度** 可讓 Aspose.HTML 在達到指定層數後停止追蹤資源連結,確保效能可預測。 + +## 在 Aspose.HTML for Python 中限制巢狀資源 + +Aspose.HTML 提供 `ResourceHandlingOptions` 類別,其中包含 `max_handling_depth` 屬性。將數值(例如 `3`)指定給它,即可指示引擎在三層巢狀資源後停止。 + +以下是一個完整、可執行的範例,展示整個工作流程: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### 各步驟說明 + +1. **安裝套件** ─ 需要 `aspose-html` wheel。`pip install` 指令以註解形式示於範例中。 +2. **匯入類別** ─ `HtmlDocument` 用於載入頁面,`ResourceHandlingOptions` 保存深度限制,`HtmlLoadOptions` 則把兩者結合。 +3. **建立選項物件** ─ 實例化 `ResourceHandlingOptions` 後得到可變容器。 +4. **設定 `max_handling_depth`** ─ 將 `3`(或任意整數)指派給它,以限制引擎僅處理三層巢狀資源。這就是 **限制巢狀資源** 的核心。 +5. **將選項附加至載入設定** ─ `HtmlLoadOptions` 讓您把 `resource_options` 傳遞給載入器。 +6. **載入 HTML** ─ `HtmlDocument` 的建構子接受 URL 或檔案路徑,並搭配 `load_options`。此時引擎會遵守深度限制。 +7. **驗證** ─ 透過遍歷 `document.resources`,您可以看到實際取得了多少資源以及最深的層級。如果最深層級 ≤ `3`,則表示限制生效。 +8. **儲存** ─ 將處理後的文件寫入磁碟。儲存的檔案只包含符合深度限制的資源。 + +#### 預期輸出 + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +實際數字會依來源頁面而異,但最深層級永遠不會超過 `3`,因為我們已設定 `max_handling_depth = 3`。 + +## 常見變化與邊緣情況 + +### 調整深度限制 + +依照環境需求,您可能需要更深或更淺的限制: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### 完全關閉限制 + +將屬性設為 `0` 即可讓 Aspose.HTML **移除所有深度限制**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +僅在確定來源 HTML 行為良好時才這樣做。 + +### 處理循環參考 + +即使設定了深度限制,循環參考仍可能在同一層級出現。Aspose.HTML 會偵測循環並停止載入已處理過的資源,與深度設定無關。然而,降低 `max_handling_depth` 能減少首次遭遇循環的機會。 + +### 與本機檔案一起使用 + +相同的做法同樣適用於本機 HTML 檔案: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +引擎會將相對 `href` 或 `src` 屬性視為遠端 URL,並對檔案系統資源套用深度限制。 + +### 與其他 Aspose.HTML 功能結合 + +若您同時需要控制 **資源下載逾時**,可將 `ResourceHandlingOptions` 與 `NetworkOptions` 結合使用: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +兩者互相獨立,讓您同時微調效能與安全性。 + +## 生產環境實用技巧 + +* **記錄資源樹** ─ 除錯時,遍歷 `document.resources` 並記錄每個資源的 URL 與深度,有助於了解為何某些頁面超出預期。 +* **快取已取得的資源** ─ 若重複處理相同外部資產,啟用快取可避免不必要的網路請求。 +* **結合白名單** ─ 若只信任特定網域,載入後過濾 `document.resources`,剔除不在白名單內的資源。 +* **測試邊緣案例頁面** ─ 建立一個匯入 10 個 CSS 檔案的合成 HTML,驗證您的限制是否如預期截斷鏈結。 + +## 結論 + +您現在已掌握如何透過設定 `ResourceHandlingOptions.max_handling_depth`,在 Aspose.HTML for Python 中 **限制巢狀資源**。設定深度限制可保護應用程式免於因過度巢狀或循環資源參考而導致記憶體過度使用、處理時間過長,甚至無限迴圈。 + +從此您可以: + +* 依照效能預算調整深度 (`resource_handling_options.max_handling_depth`)。 +* 結合網路逾時、快取或網域白名單,打造更穩健的管線。 +* 探索相關主題,如 **resource handling options**、**max handling depth**、**nested resource handling**,進一步加強 HTML 處理的控制。 + +嘗試不同的深度值,觀察載入的資源數量如何變化。準備好後,將此模式整合至更大的 HTML 轉換或渲染服務,確保執行可預測、安全且高效。 + +## 接下來該學什麼? + +以下教學與本指南緊密相關,能進一步延伸您所學的技巧。每個資源皆提供完整可執行的程式碼範例與逐步說明,協助您掌握更多 API 功能,並在自己的專案中探索替代實作方式。 + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hongkong/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/hongkong/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..e53c65315a --- /dev/null +++ b/html/hongkong/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,260 @@ +--- +category: general +date: 2026-09-19 +description: 學習 Python 的 HTML 轉 PDF 教程,示範如何使用 Aspose.HTML 快速將 HTML 產生 PDF。立即跟隨逐步指南。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: zh-hant +lastmod: 2026-09-19 +og_description: html to pdf 教學:使用 Python 與 Aspose.HTML 將任何 HTML 頁面轉換為 PDF 檔案。本指南示範如何在數分鐘內從 + HTML 產生 PDF。 +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: HTML 轉 PDF 教學(Python)— 完整逐步指南 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: 如何使用 Python 進行 HTML 轉 PDF 教學 +url: /zh-hant/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 如何使用 Python 執行 html 轉 pdf 教學 + +如果你需要 **html 轉 pdf 教學**,本指南將向你展示如何僅用幾行 Python 程式碼就能從 HTML 產生 PDF。無論是自動化報表產生,或是將網頁內容匯出供離線閱讀,Aspose.HTML 函式庫都能讓轉換變得毫不費力。 + +在本教學中,你將學會如何設定環境、撰寫轉換腳本,以及處理常見的例外情況(例如檔案遺失或自訂頁面設定)。完成後,你即可 **how to generate pdf** 從任何 HTML 來源產生 PDF,而不必離開 Python 生態系統。 + +## 你需要的條件 + +在開始之前,請確保你已具備: + +* 已安裝 Python 3.8 或更新版本 +* 有效的 Aspose.HTML for Python 授權(免費試用版可用於評估) +* 可使用 `pip` 安裝 `aspose-html` 套件的權限 +* 一個想要轉換的簡易 HTML 檔(例如 `input.html`) + +> **專業提示:** 請將 HTML 與資源(圖片、CSS)放在同一目錄下,以免在轉換過程中出現路徑解析問題。 + +## 步驟 1:安裝 Aspose.HTML 套件 + +在終端機執行以下指令: + +```bash +pip install aspose-html +``` + +`aspose-html` wheel 內含高品質渲染所需的原生函式庫,無需額外的系統相依性。 + +## 步驟 2:建立最小化的 Python 腳本 + +建立一個名為 `convert_html_to_pdf.py` 的新檔案,並貼上以下程式碼。此腳本遵循 **html to pdf tutorial** 的三步驟模式:匯入、定義路徑、呼叫轉換。 + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### 為什麼這樣寫會有效 + +* **匯入 `Converter`** 讓你取得一個高階 API,抽象化了渲染引擎的細節。 +* **使用絕對路徑** 可避免腳本在不同工作目錄執行時產生相對路徑錯誤。 +* **`Converter.convert_html`** 只需一次呼叫即可完成整個渲染流程——HTML 解析、CSS 版面配置與 PDF 序列化,這是 **how to generate pdf** 快速完成的推薦方式。 + +## 步驟 3:執行腳本並驗證輸出 + +在終端機執行腳本: + +```bash +python convert_html_to_pdf.py +``` + +若一切設定正確,你會看到: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +使用任何 PDF 閱讀器開啟 `output.pdf`。文件應與原始 HTML 頁面完全相同,包含字型、圖片與基本的 CSS 樣式。 + +![Generated PDF preview](https://example.com/images/pdf-preview.png "Screenshot of generated PDF from HTML using Python"){: .center-image alt="Screenshot of a PDF generated from an HTML file using Python"} + +## 步驟 4:自訂轉換(可選) + +基本的 **html to pdf tutorial** 只處理一對一的轉換,但實務上常需要進一步調整: + +| Requirement | How to achieve it with Aspose.HTML | +|-------------|------------------------------------| +| 設定頁面尺寸(A4、Letter) | 在 `convert_html` 時傳入 `PdfSaveOptions` 物件 | +| 加入邊距或頁首/頁尾 | 在選項內使用 `PdfPageSettings` | +| 嵌入自訂字型 | 確保字型檔可被存取,並設定 `FontSettings` | + +以下範例示範如何將頁面尺寸設定為 A4,並加入 1 吋的邊距: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **注意:** 當你需要精確控制版面時,使用自訂選項是 **generate pdf from html** 的首選技巧。 + +## 步驟 5:處理多個 HTML 檔(批次轉換) + +如果資料夾中有大量 HTML 報表,你可以使用迴圈逐一轉換: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +此程式碼片段展示了一個可擴充的 **python convert html pdf** 工作流程,適用於 CI 管線或排程任務。 + +## 常見陷阱與避免方式 + +| Issue | Cause | Fix | +|-------|-------|-----| +| PDF 中缺少圖片 | 相對圖片路徑在腳本於不同資料夾執行時失效 | 使用絕對路徑或在 `Converter` 選項中設定 `base_uri` | +| CSS 未套用 | 外部樣式表以需要網路連線的 URL 引用 | 將樣式表下載至本機,並以相對路徑引用 | +| 字型被替換 | 主機未安裝該字型 | 將字型檔納入專案,並設定 `FontSettings` | + +處理好這些例外情況,可確保你的 **export html as pdf** 流程在各種環境下皆穩定可靠。 + +## 完整可執行範例 + +以下是包含可選設定、錯誤處理與批次處理邏輯的完整腳本。將它複製到 `full_html_to_pdf.py`,然後如前所述執行。 + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +執行此腳本後,目標目錄中的每個 HTML 檔都會產生對應的 PDF,且使用一致的頁面設定——這是一個完整的 **python convert html pdf** 解決方案,已可投入生產環境。 + +## 結論 + +現在你已掌握一套實用的 **html to pdf tutorial**,能使用 Python 與 Aspose.HTML 從 HTML 產生 PDF。本文涵蓋了環境設定、最小化轉換腳本、可選自訂、批次處理以及除錯技巧。 + +接下來,你可以探索如 **how to generate pdf** 加上浮水印、合併多個 PDF,或將 HTML 轉換為其他格式(如 DOCX)。試著使用 `PdfSaveOptions` API 進一步微調輸出,並將腳本整合至 Web 服務或自動化報表管線中。 + +祝程式開發順利,享受將 HTML 內容轉換為精美 PDF 的過程! + + +## 接下來該學什麼? + +以下教學與本指南緊密相關,能在此基礎上延伸技巧。每個資源皆提供完整可執行的程式碼範例與逐步說明,協助你精通更多 API 功能,並在專案中探索不同的實作方式。 + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [How to Convert HTML to PDF Java – Using Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hungarian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/hungarian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..62547266aa --- /dev/null +++ b/html/hungarian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,265 @@ +--- +category: general +date: 2026-09-19 +description: Tanulja meg, hogyan változtassa meg a címet egy HTML-fájlban Python segítségével. + Ez az útmutató a HTML beolvasását, a title címke frissítését és a módosított HTML + mentését tárgyalja. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: hu +lastmod: 2026-09-19 +og_description: Hogyan változtassuk meg a címet egy HTML-fájlban Python segítségével. + Kövesd ezt a teljes példát, amelyben beolvassuk a HTML-t, frissítjük a title címkét, + és elmentjük a módosított dokumentumot. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Hogyan változtassuk meg a címet egy HTML-fájlban Python segítségével – lépésről‑lépésre + útmutató +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Hogyan változtassuk meg a címet egy HTML-fájlban Python használatával +url: /hu/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hogyan változtassuk meg a címet egy HTML fájlban Python segítségével + +Ha **hogyan változtassuk meg a címet** egy HTML dokumentumban programozottan, a Python egyszerűvé teszi a feladatot. Ebben az útmutatóban beolvasunk egy HTML fájlt, frissítjük a `<title>` elemet, majd elmentjük a módosított HTML-t a lemezre – mindezt tiszta, futtatható kóddal. + +A lapcím megváltoztatása gyakori lépés statikus oldalak generálásakor, lekérdezett oldalak testreszabásakor vagy SEO‑frissítések automatizálásakor. A végére megtanulod, hogyan **frissítsd a html title‑t**, hogyan **olvasd be a html‑t Python‑nal**, és hogyan **mentsd el a módosított html‑t** biztonságosan. + +## Előfeltételek + +Mielőtt elkezdenéd, győződj meg róla, hogy: + +- Python 3.8 vagy újabb telepítve van +- A `beautifulsoup4` csomag elérhető (`pip install beautifulsoup4`) +- Van egy HTML fájlod, amit szerkeszteni szeretnél (a példában a `index.html` fájlt használjuk egy általad választott mappában) + +Külső szolgáltatásra nincs szükség; minden helyben fut. + +## 1. lépés: A HTML fájl betöltése Python‑nal + +Az első feladat a **load html file python**‑stílusú betöltés. A `BeautifulSoup` egy toleráns elemzőt biztosít, amely a hibás markup‑okkal is megbirkózik. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Miért fontos ez a lépés:* +A `BeautifulSoup` egy fa reprezentációt épít, amely lehetővé teszi az elemek lekérdezését és módosítását anélkül, hogy manuálisan kellene karakterláncokat kezelni. A beépített `html.parser` gyors és nem igényel extra bináris fájlokat. + +## 2. lépés: A `<title>` elem megtalálása + +A HTML dokumentumok általában egyetlen `<title>` tag-et tartalmaznak a `<head>` részben. Az első előfordulást lekérdezzük, ami kielégíti a **update html title** követelményt. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Miért ellenőrizzük a `None` értéket:* +Néhány HTML részlet nem tartalmaz címet. Ennek automatikus hozzáadása megakadályozza a későbbi hibákat és stabilabbá teszi a szkriptet. + +## 3. lépés: A cím szövegének módosítása + +Most **update html title**‑t hajtunk végre, a tag `string` attribútumának új értéket adva. Ez a **how to change title** művelet központja. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +A `string` attribútum a `<title>` belső szövegcseréjét jelenti. Felülírásával a DOM memóriában frissül. + +## 4. lépés: A módosított HTML mentése + +Végül az átalakított dokumentumot egy új fájlba írjuk. Ez teljesíti a **save modified html** lépést, miközben az eredetit érintetlenül hagyja. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +A `prettify()` szépíti a kimenetet behúzásokkal, így a fájl könnyen olvasható a módosítás után. + +### Várt kimenet + +A szkript futtatása egy például `index.html` fájlon, amely eredetileg a következőt tartalmazza: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +a konzolon a következőhöz hasonló üzenetet kapunk: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +A mentett `index_modified.html` most ezzel kezdődik: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Teljes szkript gyors másoláshoz + +Az alábbiakban megtalálod a komplett, azonnal futtatható programot, amely egyesíti a négy lépést. Mentsd `change_title.py` néven, és állítsd be a `YOUR_DIRECTORY` értékét a saját környezetednek megfelelően. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +A szkript futtatása: + +```bash +python change_title.py +``` + +A konzolon megjelennek az üzenetek, és egy új `index_modified.html` fájl jön létre a frissített címmel. + +## További tippek és széljegyek + +| Helyzet | Mit tegyünk | +|-----------|------------| +| **Több `<title>` tag** | A `soup.find_all("title")` lista, frissítsd az első elemet, vagy iterálj, ha mindet módosítani kell. | +| **Kódolási problémák** | Fájlok megnyitásakor használd az `encoding="utf-8-sig"` beállítást, ha BOM van, vagy detektáld a kódolást a `chardet`‑tel. | +| **Nagy HTML fájlok** | Használd az `lxml` parsert (`BeautifulSoup(html_content, "lxml")`) a jobb teljesítményért. | +| **Az eredeti formázás megőrzése** | Ha pontosan ugyanazt a whitespace‑t akarod megtartani, írd a `str(soup)`‑t a `prettify()` helyett. | +| **Automatizálás sok fájlon** | Csomagold a logikát egy függvénybe, és iterálj a `Path.rglob("*.html")` segítségével. | + +Ezek a variációk megtartják a **how to change title** alaplogikát, miközben a valós projektekhez igazodnak. + +## Összegzés + +Most már tudod, hogyan **how to change title** bármely HTML dokumentumban Python‑nal. Az útmutató bemutatta a HTML beolvasását, a `<title>` tag megtalálását, a szöveg frissítését, és a **saving modified html** biztonságos elvégzését. A teljes szkripttel beépítheted ezt a mintát statikus weboldalgenerátorokba, SEO‑folyamatokba vagy bármilyen automatizációba, amely dinamikus címcserét igényel. + +Ezután nézd meg a kapcsolódó témákat, például a **read html with python**‑t a meta tag-ek kinyeréséhez, vagy a **load html file python** technikákat a hibás markup kezeléséhez. Kísérletezz kötegelt feldolgozással, hogy egy egész weboldalon frissítsd a címeket – az új képességed alapja számos web‑automatizálási feladatnak. Boldog kódolást! + +## Mit tanulj meg legközelebb? + +Az alábbi oktatóanyagok szorosan kapcsolódó témákat fednek le, amelyek a jelen útmutató technikáira épülnek. Minden forrás komplett, működő kódrészleteket és lépésről‑lépésre magyarázatokat tartalmaz, hogy további API‑funkciókat saját projektjeidben is felfedezhess és alternatív megvalósítási megközelítéseket próbálhass ki. + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hungarian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/hungarian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..a484f85856 --- /dev/null +++ b/html/hungarian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,206 @@ +--- +category: general +date: 2026-09-19 +description: Helyi HTML fájl PDF‑re konvertálása Python és Aspose.HTML segítségével + – egy teljes lépésről‑lépésre útmutató, amely a HTML‑PDF konvertálás Python lehetőségeit + is bemutatja. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: hu +lastmod: 2026-09-19 +og_description: Konvertálja a helyi HTML fájlt PDF-re Python segítségével. Ismerje + meg a legjobb módot a HTML PDF-re konvertálására Pythonban az Aspose.HTML használatával, + beleértve a betűtípus beágyazását és a hibakezelést. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Helyi HTML fájl PDF-re konvertálása Python segítségével – teljes útmutató +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Hogyan konvertáljunk egy helyi HTML fájlt PDF-re Python segítségével +url: /hu/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hogyan konvertáljunk egy helyi HTML fájlt PDF-re Python segítségével + +Ha **helyi HTML fájlt kell PDF‑re konvertálni** egy Python projektben, ez a bemutató egy azonnal futtatható megoldást mutat be. Megtanulod, hogyan állítsd be az Aspose.HTML könyvtárat, konfiguráld a PDF beállításokat, és hajtsd végre a konverziót néhány sor kóddal. Az útmutató emellett ismerteti a **convert html to pdf python** legjobb gyakorlatait, így a kódot könnyen testre szabhatod saját munkafolyamataidhoz. + +Az alábbi lépések mindent lefednek, ami szükséges: az SDK telepítése, a mentési beállítások előkészítése, gyakori buktatók kezelése és a kimenet ellenőrzése. A cikk végére egy újrahasználható függvényt kapsz, amelyet bármely Python alkalmazásba beilleszthetsz. + +## Előfeltételek + +Mielőtt elkezdenéd, győződj meg róla, hogy a következők rendelkezésre állnak: + +* Python 3.8 vagy újabb telepítve van a gépeden. +* Aktív Aspose.HTML for Python licenc (az ingyenes próba verzió értékelésre használható). +* Egy helyi HTML fájl, amelyet PDF‑re szeretnél konvertálni (például `page.html`). + +Nem szükséges semmilyen további rendszer‑szintű függőség; az SDK mindent tartalmaz, ami a PDF generáláshoz kell. + +## Az Aspose.HTML csomag telepítése + +Az Aspose.HTML SDK a PyPI‑n keresztül érhető el. Telepítsd a `pip`‑kel a virtuális környezetedben: + +```bash +pip install aspose-html +``` + +A parancs futtatása kiírja a telepített verziót, ezzel megerősítve, hogy a csomag importálható. + +## 1. lépés: A szükséges osztályok importálása + +A konverziós munkafolyamat két fő osztályra támaszkodik: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` biztosítja a statikus `convert_html` metódust, amely a tényleges átalakítást végzi. +* `PDFSaveOptions` lehetővé teszi a PDF kimenet finomhangolását, például a szabványos betűtípusok beágyazását. + +## 2. lépés: PDF mentési beállítások létrehozása és a szabványos betűtípusok beágyazásának engedélyezése + +A betűtípusok beágyazása garantálja, hogy a generált PDF minden eszközön ugyanúgy jelenjen meg, még akkor is, ha a megjelenítő gépén nincsenek telepítve a betűtípusok. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +A `embed_standard_fonts` `True`‑ra állítása a legtöbb termelési szituációban ajánlott, mivel megszünteti a betűtípus‑helyettesítési figyelmeztetéseket a PDF‑olvasókban. + +## 3. lépés: A HTML fájl konvertálása PDF‑re a konfigurált beállításokkal + +Most hívd meg a `Converter.convert_html`‑t, add meg a forrás HTML útvonalát, a cél PDF útvonalát, valamint a korábban előkészített opciós objektumot: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Ha a konverzió sikeres, a metódus `None`‑t ad vissza, és a PDF fájl megjelenik a megadott helyen. + +## Teljes példa egy újrahasználható függvényben + +A logika egy függvénybe csomagolása megkönnyíti a többszörös felhasználást különböző projektekben: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Miért hasznos a függvény + +* **Bemeneti ellenőrzés** – A `FileNotFoundError` megkönnyíti a hibakeresést, ha a HTML útvonal hibás. +* **Automatikus könyvtárlétrehozás** – Az `os.makedirs(..., exist_ok=True)` megakadályozza a „könyvtár nem létezik” hibákat. +* **Konfigurálható betűtípus‑beágyazás** – Kikapcsolhatod a betűtípus‑beágyazást kisebb fájlok esetén, ha tudod, hogy a célkörnyezet már rendelkezik a szükséges betűtípusokkal. + +## Gyakori szélhelyzetek és azok kezelése + +| Helyzet | Ajánlott megoldás | +|-----------|----------------------| +| **A HTML külső CSS‑t vagy képeket tartalmaz** | Használj abszolút URL‑eket, vagy másold a forrásokat a HTML fájl mellé; az Aspose.HTML ugyanazokat a szabályokat követi, mint egy böngésző. | +| **Nagy HTML fájlok (>10 MB)** | Növeld az alapértelmezett memóriakorlátot a `pdf_options.memory_limit` beállításával, ha `OutOfMemoryException`‑t kapsz. | +| **Jelszóval védett PDF‑ekre van szükséged** | Állítsd be a `pdf_options.encryption_details`‑t egy felhasználói jelszóval a `convert_html` meghívása előtt. | +| **Fej nélküli szerveren futtatod** | Nincs további konfiguráció szükséges; az SDK nem támaszkodik GUI‑ra. | + +Ezeknek a szcenárióknak a korai kezelése megakadályozza a váratlan futásidejű hibákat. + +## A konverzió eredményének ellenőrzése + +A szkript befejezése után nyisd meg a generált PDF‑et bármely megjelenítővel (Adobe Reader, Chrome, stb.). A vizuális elrendezésnek meg kell egyeznie az eredeti HTML‑lel, és minden betűtípusnak helyesen kell megjelennie, mivel be lettek ágyazva. + +Programozottan is ellenőrizheted, hogy a fájl létezik és nem üres: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Profi tippek termelési környezethez + +* **Kötegelt feldolgozás** – Iterálj egy HTML fájlok listáján, és hívd meg az `html_to_pdf`‑t minden egyes elemre; egyetlen `PDFSaveOptions` példány újrahasználata csökkenti az objektumlétrehozási terhelést. +* **Naplózás** – Integráld a Python `logging` modulját, hogy rögzítsd a konverzió időbélyegét és az esetleges kivételeket. +* **Teljesítmény** – Sok fájl konvertálásakor fontold meg a párhuzamos futtatást a `concurrent.futures.ThreadPoolExecutor`‑rel, de vedd figyelembe, hogy az SDK csak különálló `Converter` hívások esetén szálbiztos. + +## Összegzés + +Most már rendelkezel egy teljes, termelés‑kész módszerrel a **helyi HTML fájl PDF‑re konvertálásához** Pythonban. A megoldás lefedi a lényeges lépéseket – az Aspose.HTML telepítését, a PDF beállítások konfigurálását, a gyakori szélhelyzetek kezelését és a kimenet ellenőrzését – miközben bemutatja a szélesebb **convert html to pdf python** munkafolyamatot is. + +Innen tovább felfedezheted a fejlett funkciókat, mint a PDF titkosítás, egyedi oldalméretek vagy vízjelek hozzáadása, amelyeket mind azonos SDK támogat. Kísérletezz a projektedhez legjobban illő opciókkal, és megbízhatóan automatizálhatod a HTML‑PDF konverziót bármely Python környezetben. + +--- + + +## Mit érdemes legközelebb megtanulni? + + +Az alábbi oktatóanyagok szorosan kapcsolódó témákat fednek le, amelyek a jelen útmutatóban bemutatott technikákra épülnek. Minden forrás tartalmaz teljes, működő kódrészleteket lépésről‑lépésre magyarázatokkal, hogy segítsenek elsajátítani további API funkciókat és alternatív megvalósítási megközelítéseket a saját projektjeidben. + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [Convert HTML to PDF in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hungarian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/hungarian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..371339ac3d --- /dev/null +++ b/html/hungarian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,217 @@ +--- +category: general +date: 2026-09-19 +description: Tanulja meg, hogyan konvertálja a HTML-t Markdown-re Pythonban. Ez az + útmutató bemutatja, hogyan menthet HTML-t Markdownként, és hogyan generálhat gyorsan + Markdown-t HTML-ből. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: hu +lastmod: 2026-09-19 +og_description: Konvertálja a HTML-t Markdown-re Python segítségével. Kövesse ezt + az útmutatót, hogy HTML-t menthessen Markdown formátumban, generáljon Markdown-t + HTML-ből, és hozzon létre egy HTML‑ról Markdown‑re konvertáló fájlt. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: HTML konvertálása Markdown-re Pythonban – teljes programozási útmutató +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: HTML konvertálása Markdownra Python segítségével – lépésről lépésre útmutató +url: /hu/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hogyan konvertáljunk HTML-t Markdown-re Python‑ban – lépésről‑lépésre útmutató + +Ha **HTML‑t Markdown‑re kell konvertálni**, ez az útmutató végigvezeti a teljes folyamaton. Megmutatjuk, hogyan **mentheted el a HTML‑t Markdown‑ként**, hogyan generálhatsz Markdown‑t HTML‑ből, és hogyan hozhatsz létre egy *html to markdown file*-t, amely használható statikus weboldalkészítőknél, dokumentációs csővezetékekben vagy bármely olyan munkafolyamatban, amely a egyszerű szöveges jelölést részesíti előnyben. + +Az oktatóanyag mindent lefed a szükséges könyvtár telepítésétől a beágyazott képekkel és egyedi formázással kapcsolatos edge case‑ek kezeléséig. A végére egy azonnal futtatható szkriptet kapsz, és világos megértést arról, hogy miért fontos minden egyes lépés. + +## Előfeltételek + +- Python 3.8 vagy újabb telepítve a gépeden. +- Alapvető ismeretek a Python szkriptekhez. +- Hozzáférés egy terminálhoz vagy parancssorhoz. +- Az `aspose.html` könyvtár (vagy bármely kompatibilis HTML‑to‑Markdown csomag). Ez az oktatóanyag a **Aspose.HTML for Python via .NET**‑et használja, amely biztosítja a kódban látható `HTMLDocument`, `MarkdownSaveOptions` és `Converter` osztályokat. + +> **Pro tipp:** Ha inkább tisztán Python megoldást szeretnél, cserélheted az `aspose.html`‑t a `html2text` csomagra. Az általános folyamat változatlan marad. + +## 1. lépés: A konverziós könyvtár telepítése + +Először telepítsd a könyvtárat, amely biztosítja a `HTMLDocument`, `MarkdownSaveOptions` és `Converter` osztályokat. Futtasd a következő parancsot: + +```bash +pip install aspose-html +``` + +A csomag tartalmazza a natív motorot, amely a **markdown generálásához html‑ből** gyorsan és nagy pontossággal szükséges. A telepítés általában egy percnél kevesebb idő alatt befejeződik egy átlagos széles sávú kapcsolaton. + +## 2. lépés: A forrás HTML dokumentum betöltése + +A HTML fájl betöltése az első konkrét lépés a konverziós folyamatban. A `HTMLDocument` osztály beolvassa a fájlt és egy memóriában lévő DOM‑ot épít, amelyet a konverter később bejár a Markdown előállításához. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Miért fontos:** Az `HTMLDocument` objektum létrehozásával biztosítod, hogy a komplex struktúrák—táblázatok, listák és beágyazott stílusok—helyesen legyenek értelmezve a konverzió előtt. Ennek a lépésnek a kihagyása azt eredményezné, hogy a konverter nyers szöveget olvas, ami formázásvesztéshez vezet. + +## 3. lépés: A Markdown mentési beállítások konfigurálása + +A `MarkdownSaveOptions` objektum lehetővé teszi a kimeneti formátum finomhangolását. **Git‑flavored Markdown** előállításához állítsd a `formatter` tulajdonságot `"GIT"`‑re. Ez megfelel a GitHub, GitLab és Bitbucket által használt szintaxisnak. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Egyéb beállításokat is módosíthatsz, például a `preserve_links` vagy a `code_block_style` értékeket, attól függően, hogy hogyan tervezed a **save html as markdown** folyamatot a downstream eszközökben. + +## 4. lépés: A HTML konvertálása Markdown-re és az eredmény mentése + +Miután a dokumentum betöltődött és a beállítások konfigurálva vannak, hívd meg a statikus `convert_html` metódust. Ez a metódus beolvassa a DOM‑ot, alkalmazza a kiválasztott formázót, és kiírja a kimeneti fájlt. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +A szkript futtatása után egy új `output.md` nevű fájlt találsz a megadott könyvtárban. A megnyitása tiszta, Git‑kompatibilis Markdown‑ot mutat, amely készen áll a verziókezelésre vagy a publikálásra. + +## 5. lépés: A generált markdown fájl ellenőrzése + +Egy gyors ellenőrzés segít megerősíteni, hogy a konverzió sikeres volt, és hogy a **html to markdown file** a várt tartalmat tartalmazza. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Egy egyszerű HTML oldal tipikus kimenete a következőképpen néz ki: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Ha hiányzó címsorokat vagy hibás listákat észlelsz, nézd át újra a **3. lépést**, és kísérletezz különböző `formatter` értékekkel (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Haladó: Képek és relatív útvonalak kezelése + +Ha a forrás HTML képeket tartalmaz, a konverter vagy beágyazhatja őket data URI‑ként, vagy megőrizheti az eredeti `src` attribútumokat. A **generate markdown from html** folyamat könnyűsúlyú tartásához érdemes lehet a képfájlokat egy párhuzamos mappába másolni és módosítani az útvonalakat. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +A konverzió után a Markdown a képeket így hivatkozza: `![Alt text](images/picture.png)`. Ez a megközelítés jól működik, ha később **save html as markdown** egy olyan statikus weboldalkészítőben, amely a forrásokat egy dedikált mappában várja. + +## Teljes szkript, amelyet másolhatsz‑beilleszthetsz + +Az alábbiakban a teljes, futtatható szkriptet találod, amely magában foglalja a megvitatott összes lépést. Mentsd el `convert_html_to_md.py` néven, és futtasd a `python convert_html_to_md.py` paranccsal. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Várt kimenet + +A szkript futtatása egy megerősítő üzenetet ír ki, majd a Markdown fájl első tíz sorát, ahogy korábban láttuk. A generált `output.md` megnyitható bármely szövegszerkesztőben, előnézhető a VS Code‑ban, vagy elkötelezhető egy Git tárolóba. + +## Gyakori kérdések és edge‑case kezelése + +| Question | Answer | +|----------|--------| +| **Mi van, ha a HTML fájl nagy (> 10 MB)?** | A `HTMLDocument` osztály streameli a bemenetet, így a memóriahasználat mérsékelt marad. Azonban fontold meg a Python folyamat memóriahatárának növelését, ha `MemoryError`-t kapsz. | +| **Konvertálhatok HTML karakterláncot fájl helyett?** | Igen. Használd a `HTMLDocument.from_string(html_string)` (vagy a megfelelő konstruktor) metódust a `Converter.convert_html` meghívása előtt. | +| **Hogyan őrizhetem meg az eredeti HTML kommenteket?** | Állítsd be a `md_options.preserve_comments = True` értéket. A kommentek HTML kommentként (`<!-- … -->`) fognak megjelenni a Markdown fájlban. | +| **Lehet másik Markdown dialektust célozni?** | Állítsd a `md_options.formatter` értékét `"COMMONMARK"` vagy `"MARKDOWN_EXTRA"`-re a célplatformtól függően. | +| **Külön kell telepíteni a .NET runtime‑ot?** | Az `aspose-html` csomag a szükséges runtime‑ot tartalmazza a legtöbb platformhoz. Linuxon győződj meg róla, hogy a `libgdiplus` telepítve van (`sudo apt-get install libgdiplus`). | + +## Következtetés + +Most már tudod, hogyan **convert HTML to Markdown** Python‑nal, hogyan **save html as markdown**, és hogyan **generate markdown from html** finomhangolt vezérléssel a formázás és az eszközök felett. A szkript bemutatja a teljes munkafolyamatot – a forrásfájl betöltésétől egy tiszta *html to markdown file* előállításáig, amely készen áll a verziókezelésre vagy a publikálásra. + +Ezután fedezd fel a kapcsolódó témákat, például a **batch converting multiple HTML files**, a konverziós lépés CI/CD csővezetékbe való integrálását, vagy a Markdown kimenet testreszabását specifikus statikus weboldalkészítők, mint a Hugo vagy a Jekyll számára. Kísérletezz a különböző `MarkdownSaveOptions` beállításokkal, hogy a végeredményt a projekted stílusirányelveihez igazítsd. + +Boldog konvertálást! + +## Mit érdemes legközelebb megtanulni? + +- [HTML konvertálása Markdown-re .NET-ben az Aspose.HTML segítségével](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [HTML konvertálása Markdown-re Aspose.HTML for Java-ban](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown HTML-re Java - Konvertálás az Aspose.HTML segítségével](/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/hungarian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/hungarian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..bb5dc4a755 --- /dev/null +++ b/html/hungarian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Hogyan engedélyezzünk funkciókat HTML‑ról Markdown‑re konvertáláskor + Python használatával. Tanulja meg, hogyan konvertáljon HTML‑dokumentumot, és mentse + el azt Markdown formátumban pontos funkcióvezérléssel. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: hu +lastmod: 2026-09-19 +og_description: Hogyan engedélyezzünk funkciókat a HTML Markdownre konvertálása során. + Ez az útmutató lépésről lépésre bemutatja, hogyan konvertáljunk egy HTML-dokumentumot, + és hogyan mentsük a HTML-t Markdown formátumban finomhangolt vezérléssel. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Hogyan engedélyezzük a funkciókat HTML Markdown-re konvertálás közben +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Hogyan kapcsoljunk be funkciókat HTMLről Markdownra konvertálás közben +url: /hu/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hogyan engedélyezzük a funkciókat HTML‑ről Markdown‑ra konvertálás közben + +Ha a konverzió során **how to enable features** funkciókat kell engedélyezned, ez az útmutató egy teljes, futtatható megoldást nyújt. Pontosan megmutatja, hogyan konvertálj HTML‑t Markdown‑ra, hogyan szabályozhatod, mely Markdown‑funkciók kerülnek kiadásra, és hogyan mentheted el a HTML‑t Markdown‑ként egyetlen lépésben. + +A példa a népszerű **GroupDocs.Conversion** Python SDK‑t használja, de a koncepciók bármely olyan könyvtárra alkalmazhatók, amely lehetővé teszi a funkciók beállítását. A tutorial végére képes leszel egy HTML‑dokumentumot konvertálni, csak a linkeket és bekezdéseket megtartani, és elkerülni a nem kívánt táblázatokat, képeket vagy kódrészeket. + +## Amit el fogsz érni + +* **how to enable features** a Markdown mentési beállításokban +* egy tiszta **convert html to markdown** munkafolyamat +* a képesség **how to convert html** szelektív kimenettel +* egy azonnal futtatható szkript, amely **convert html document** és **save html as markdown** + +### Előfeltételek + +* Python 3.8+ telepítve +* `groupdocs-conversion` csomag (telepítés: `pip install groupdocs-conversion`) +* Egy minta HTML fájl (`sample.html`) egy ismert könyvtárban + +--- + +## Hogyan engedélyezzük a funkciókat a Markdown konverzióban + +Az első lépés egy `MarkdownSaveOptions` objektum létrehozása, és a konverter tájékoztatása arról, hogy mely elemeket szeretnéd megtartani. Ebben a tutorialban csak a **links** és **paragraphs** elemeket engedélyezzük. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Miért működik ez:** +* `HTMLDocument` becsomagolja a forrásfájlt, hogy a konverter olvashassa. +* `MarkdownSaveOptions` tartalmazza az összes konverziós beállítást; a `features` lista a kulcsfontosságú tulajdonság, amely **how to enable features**. +* A `["Link", "Paragraph"]` hozzárendelésével azt mondod a motornak, hogy csak a Markdown linkeket (`[text](url)`) és egyszerű bekezdéseket adja ki, eldobva a képeket, táblázatokat és egyéb jelöléseket. +* `Converter.convert_html` végrehajtja a tényleges **convert html to markdown** műveletet, és az eredményt a `sample.md` fájlba írja. + +--- + +## Hogyan konvertáljunk HTML dokumentumot egyéni beállításokkal + +Ha később további funkciózászlókat kell hozzáadnod – például `"Header"` vagy `"Bold"` – egyszerűen bővítsd a listát: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +Az ugyanaz a `Converter.convert_html` hívás most már tartalmazni fogja ezeket a további elemeket. Ez a minta lehetővé teszi, hogy **how to convert html** nagyon konfigurálható módon, egyedi elemzők írása nélkül. + +--- + +## Hogyan mentsük el a HTML‑t Markdown‑ként egy adott mappába + +A `convert_html` metódus abszolút vagy relatív kimeneti útvonalat fogad. Ahhoz, hogy **save html as markdown** egy `output` nevű alkönyvtárba, módosítsd a harmadik argumentumot: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +A szkript futtatása létrehozza az `output` könyvtárat (ha még nem létezik), és oda írja a Markdown fájlt. Ez a megközelítés rendezetten tartja a forrás HTML‑t és a generált Markdown‑t. + +--- + +## Teljes szkript, amelyet másolhatsz‑beilleszthetsz + +Az alábbiakban a teljes program látható, készen áll a futtatásra. Cseréld le a `YOUR_DIRECTORY` értéket arra az útra, amely a `sample.html`‑t tartalmazza. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Várható kimenet** + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Nyisd meg a `sample.md`‑t, és csak a Markdown linkeket és egyszerű bekezdéseket fogod látni, például: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Minden más HTML elem el lett hagyva, mivel a **how to enable features** korlátozta a kimenetet a két kiválasztott típusra. + +--- + +## Gyakori kérdések és szélhelyzetek + +| Kérdés | Válasz | +|----------|--------| +| *Mi van, ha a HTML fájl nem tartalmaz linkeket?* | A konverter továbbra is kiírja a bekezdéseket; a kimenet egyszerű szöveget tartalmaz link szintaxis nélkül. | +| *Letilthatom az összes funkciót?* | A `markdown_options.features = []` beállítás egy üres Markdown fájlt eredményez. Ezt csak tesztelés céljából használd. | +| *Hogyan kezeli a SDK a hibás HTML‑t?* | A parser megpróbálja megtisztítani a hibás jelölést a funkciószűrő alkalmazása előtt. A hibákat naplózza, de nem állítja le a konverziót. | +| *Lehetséges a képeket megtartani, miközben a táblázatokat eldobjuk?* | Igen. Állítsd be a `markdown_options.features = ["Link", "Paragraph", "Image"]`. A funkciólista kiegészítő, nem kizáró. | +| *Mi van, ha sok fájlt kell konvertálni egy mappában?* | Tedd a konverziós logikát egy ciklusba, amely a `Path.glob("*.html")`‑en iterál. Ugyanaz a **how to enable features** konfiguráció újra felhasználható minden fájlra. | + +**Pro tip:** Nagy kötegek feldolgozásakor hozd létre egyszer a `MarkdownSaveOptions`‑t, és használd újra. Ez csökkenti az objektum‑létrehozási terhet, és a **convert html to markdown** csővezeték gyors marad. + +--- + +## Következtetés + +Most már tudod, hogyan **how to enable features** amikor **convert html to markdown**, hogyan **how to convert html** szelektív kimenettel, és hogyan **convert html document** és **save html as markdown** egy tömör Python szkript segítségével. A `MarkdownSaveOptions.features` beállításával teljes irányítást kapsz a végső fájlban megjelenő Markdown elemek felett. + +### Következő lépések + +* Fedezz fel további funkciózászlókat, mint a `"Header"`, `"Bold"` és `"Italic"`, hogy gazdagabbá tedd a Markdown kimeneted. +* Kombináld ezt a szkriptet egy fájlfigyelővel (pl. `watchdog`), hogy automatikusan konvertálja az érkező új HTML fájlokat. +* Tekintsd át a [GroupDocs.Conversion Python SDK documentation](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) oldalt a haladó forgatókönyvekhez, mint a PDF‑to‑Markdown vagy DOCX‑to‑HTML konverziók. + +Nyugodtan kísérletezz különböző funkciókészletekkel, és oszd meg eredményeidet a közösséggel. Boldog konvertálást! + +## Mit érdemes következőként megtanulni? + +A következő tutorialok szorosan kapcsolódó témákat fednek le, amelyek a jelen útmutatóban bemutatott technikákra épülnek. Minden forrás teljes, működő kódpéldákat tartalmaz lépésről‑lépésre magyarázatokkal, hogy segítsenek elsajátítani további API funkciókat és alternatív megvalósítási megközelítéseket a saját projektjeidben. + +- [HTML konvertálása Markdown‑ra Aspose.HTML‑ben Java‑hoz](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown HTML‑re Java - Konvertálás Aspose.HTML‑del](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [Hogyan engedélyezzük a JavaScript‑et az Aspose HTML‑ben – HTML betöltése és szöveg lekérése](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hungarian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/hungarian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..8ed9527ddb --- /dev/null +++ b/html/hungarian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,246 @@ +--- +category: general +date: 2026-09-19 +description: Tudja meg, hogyan korlátozhatja a beágyazott erőforrásokat az Aspose.HTML + for Python-ban a ResourceHandlingOptions használatával. Szabályozza a maximális + kezelési mélységet, és kerülje el a végtelen ciklusokat. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: hu +lastmod: 2026-09-19 +og_description: Korlátozza a beágyazott erőforrásokat az Aspose.HTML for Python-ban + a ResourceHandlingOptions használatával. Állítsa be a maximális kezelési mélységet + a mély rekurzió megelőzéséhez és a teljesítmény javításához. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Hogyan korlátozhatók a beágyazott erőforrások az Aspose.HTML for Pythonban + – lépésről‑lépésre útmutató +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Hogyan korlátozhatók a beágyazott erőforrások az HTML feldolgozása során az + Aspose.HTML for Python használatával +url: /hu/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hogyan korlátozhatja a beágyazott erőforrások számát HTML feldolgozásakor az Aspose.HTML for Python használatával + +Ha **korlátozni szeretné a beágyazott erőforrásokat** HTML renderelése vagy konvertálása során, ez az útmutató pontos lépéseket mutat be az Aspose.HTML for Python konfigurálásához. Az erőforrás‑kezelés mélységének szabályozása megakadályozza a szabadon szökő rekurziót, amikor egy oldal sok réteg CSS‑et, JavaScript‑et vagy képhivatkozást tartalmaz. + +A beágyazott erőforrások korlátozása különösen fontos nagy‑méretű feltérképezők, e‑mail renderelési folyamatok vagy bármely automatizált munkafolyamat számára, amelynek memóriában és időben is keretek között kell maradnia. A következő szakaszokban megtudja, miért kell beállítani egy mélységkorlátot, hogyan használja a `ResourceHandlingOptions` osztályt, és hogyan ellenőrizheti, hogy a korlát a várt módon működik‑e. + +## Miért kell korlátozni a beágyazott erőforrásokat + +A HTML dokumentumok gyakran hivatkoznak más erőforrásokra – stíluslapokra, szkriptekre, képekre, betűtípusokra vagy akár más HTML fájlokra. Ezek az erőforrások további fájlokra hivatkozhatnak, így függőségi fát alkotva. Védelem nélkül a fa tetszőleges mélységűvé válhat: + +* Egy oldal betölt egy CSS‑fájlt, amely importál egy másik CSS‑fájlt, amely ismét egy másikat importál, és így tovább. +* A JavaScript dinamikusan betölthet további szkripteket. +* Egy e‑mail sablon beágyazhat képeket, amelyek külső URL‑ekre hivatkoznak, és ezek további eszközökre irányítanak át. + +Ha a rekurzió mélysége korlátozás nélkül nő, a következő kockázatok merülnek fel: + +* **Túlzott memóriafogyasztás** – minden lekért erőforrás puffereket foglal. +* **Hosszabb feldolgozási idő** – a hálózati késleltetés minden szinttel szorzódik. +* **Lehetséges végtelen ciklusok** – körkörös hivatkozások miatt a motor soha nem tér vissza. + +A **max handling depth** beállítása azt mondja az Aspose.HTML‑nek, hogy a megadott szint után hagyja abba az erőforrás‑hivatkozások követését, ezáltal kiszámítható teljesítményt biztosítva. + +## Hogyan korlátozhatja a beágyazott erőforrásokat az Aspose.HTML for Python-ban + +Az Aspose.HTML biztosítja a `ResourceHandlingOptions` osztályt, amely tartalmaz egy `max_handling_depth` tulajdonságot. Numerikus érték (pl. `3`) hozzárendelésével azt mondja a motornak, hogy három beágyazott szint után álljon le. + +Az alábbiakban egy teljes, futtatható példa látható, amely bemutatja a teljes munkafolyamatot: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Az egyes lépések magyarázata + +1. **A csomag telepítése** – A `aspose-html` kerék szükséges. A `pip install` parancs megjegyzésként van feltüntetve a teljesség kedvéért. +2. **Osztályok importálása** – A `HtmlDocument` betölti az oldalt, a `ResourceHandlingOptions` tárolja a korlátot, és a `HtmlLoadOptions` köti össze őket. +3. **Az opciók objektum létrehozása** – A `ResourceHandlingOptions` példányosítása egy módosítható tárolót ad. +4. **`max_handling_depth` beállítása** – Állítsa `3`‑ra (vagy bármely egész számra), hogy a motor csak három szintű beágyazott erőforrást kövessen. Ez a **beágyazott erőforrások korlátozásának** központja. +5. **Opciók csatolása a betöltési konfigurációhoz** – A `HtmlLoadOptions` lehetővé teszi, hogy a `resource_options`‑t átadja a betöltőnek. +6. **HTML betöltése** – A `HtmlDocument` konstruktor elfogad egy URL‑t vagy fájlútvonalat, valamint a `load_options`‑t. A motor most tiszteletben tartja a mélységkorlátot. +7. **Ellenőrzés** – A `document.resources` iterálásával látható, hogy hány erőforrás lett ténylegesen lekérve és a legmélyebb szint, amelyet elért. Ha a legmélyebb szint `3` vagy alacsonyabb, a korlát sikeres volt. +8. **Mentés** – A feldolgozott dokumentum mentése. A mentett fájl csak a megengedett mélységig terjedő erőforrásokat tartalmazza. + +#### Várt kimenet + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +A számok a forrásoldaltól függően változnak, de a legmélyebb szintnek soha nem szabad meghaladnia a `3`‑at, mivel a `max_handling_depth = 3`‑at állítottuk be. + +## Gyakori variációk és szélsőséges esetek + +### A mélységkorlát módosítása + +Előfordulhat, hogy a környezetétől függően mélyebb vagy sekélyebb korlátra van szüksége: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### A korlát teljes kikapcsolása + +A tulajdonság `0`‑ra állítása azt mondja az Aspose.HTML‑nek, hogy **eltávolítja a mélységkorlátozást**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Ezt csak akkor tegye, ha biztos benne, hogy a forrás‑HTML megfelelően viselkedik. + +### Körkörös hivatkozások kezelése + +Még mélységkorlát esetén is előfordulhatnak körkörös hivatkozások ugyanazon a szinten. Az Aspose.HTML felismeri a ciklusokat, és leállítja egy már feldolgozott erőforrás betöltését, függetlenül a mélység beállítástól. Azonban egy alacsonyabb `max_handling_depth` csökkenti a ciklusok előfordulásának esélyét. + +### A korlát használata helyi fájlokkal + +Ugyanez a megközelítés helyi HTML fájlokra is működik: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +A motor a relatív `href` vagy `src` attribútumokat ugyanúgy kezeli, mint a távoli URL‑eket, és a mélységkorlátot a fájlrendszer erőforrásaira is alkalmazza. + +### Integráció más Aspose.HTML funkciókkal + +Ha emellett a **erőforrás letöltési időkorlátot** is szabályozni kell, a `ResourceHandlingOptions`‑t kombinálhatja a `NetworkOptions`‑szal: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Mindkét opció független, így egyszerre finomhangolhatja a teljesítményt és a biztonságot. + +## Profi tippek éles környezethez + +* **Az erőforrásfa naplózása** – Hibakereséskor iteráljon a `document.resources`‑en, és naplózza minden erőforrás URL‑jét és mélységét. Ez segít megérteni, miért haladja meg egy adott oldal az elvárásait. +* **Lekért erőforrások gyorsítótárazása** – Ha ugyanazokat a külső eszközöket többször dolgozza fel, engedélyezze a gyorsítótárat a felesleges hálózati hívások elkerülése érdekében. +* **Fehérlistával kombinálás** – Ha csak bizonyos domainek megbízhatóak, a betöltés után szűrje a `document.resources`‑t, és dobja el azokat, amelyek kívül esnek a fehérlistán. +* **Szélsőséges oldalakkal tesztelés** – Hozzon létre egy szintetikus HTML fájlt, amely 10 CSS fájlt importál láncolatban. Ellenőrizze, hogy a korlát a várt módon csonkolja-e a láncot. + +## Következtetés + +Most már tudja, hogyan **korlátozhatja a beágyazott erőforrásokat** az Aspose.HTML for Python-ban a `ResourceHandlingOptions.max_handling_depth` konfigurálásával. A mélységkorlát beállítása megvédi az alkalmazását a túlzott memóriahasználattól, a hosszú feldolgozási időktől és a mélyen beágyazott vagy körkörös erőforrás‑hivatkozások által okozott esetleges végtelen ciklusoktól. + +Ettől a ponttól kezdve a következőket teheti: + +* Állítsa be a mélységet a teljesítmény‑budgetjének megfelelően (`resource_handling_options.max_handling_depth`). +* Kombinálja a korlátot hálózati időkorlátokkal, gyorsítótárazással vagy domain fehérlistákkal a robusztus folyamatokhoz. +* Fedezze fel a kapcsolódó témákat, mint a **resource handling options**, **max handling depth**, és **nested resource handling**, hogy tovább szigorítsa a HTML feldolgozás feletti ellenőrzést. + +Kísérletezzen különböző mélységértékekkel, és figyelje meg, hogyan változik a betöltött erőforrások száma. Amikor készen áll, integrálja ezt a mintát a nagyobb HTML konverziós vagy renderelési szolgáltatásába, hogy kiszámítható, biztonságos és hatékony végrehajtást biztosítson. + +## Mit érdemes legközelebb megtanulni? + +Az alábbi útmutatók szorosan kapcsolódó témákat fednek le, amelyek a jelen útmutatóban bemutatott technikákra épülnek. Minden forrás teljes, működő kódrészleteket tartalmaz lépésről‑lépésre magyarázatokkal, hogy segítsenek elsajátítani további API‑funkciókat és alternatív megvalósítási megközelítéseket saját projektjeiben. + +- [Üzenetkezelés és hálózatkezelés az Aspose.HTML for Java-ban](/html/english/java/message-handling-networking/) +- [Egyedi séma szűrő és üzenetkezelés az Aspose.HTML for Java-ban](/html/english/java/custom-schema-message-handling/) +- [Adatkezelés és adatfolyam-kezelés az Aspose.HTML for Java-ban](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/hungarian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/hungarian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..409745c6e9 --- /dev/null +++ b/html/hungarian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,258 @@ +--- +category: general +date: 2026-09-19 +description: Tanulj meg egy HTML‑PDF oktatóanyagot Pythonban, amely megmutatja, hogyan + lehet gyorsan PDF-et generálni HTML‑ből az Aspose.HTML segítségével. Kövesd a lépésről‑lépésre + útmutatót most. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: hu +lastmod: 2026-09-19 +og_description: 'html to pdf oktató: Konvertáljon bármely HTML oldalt PDF fájlra Python + és Aspose.HTML segítségével. Ez az útmutató megmutatja, hogyan lehet percek alatt + PDF-et generálni HTML-ből.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: HTML‑ről PDF‑re útmutató Pythonban – teljes lépésről‑lépésre útmutató +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Hogyan hajtsunk végre egy HTML‑PDF oktatóanyagot Python használatával +url: /hu/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hogyan hajtsunk végre egy html to pdf tutorial-t Pythonban + +Ha **html to pdf tutorial**-ra van szükséged, ez az útmutató pontosan megmutatja, hogyan generálj PDF-et HTML-ből néhány Python sorral. Akár jelentéskészítést automatizálsz, akár webes tartalmat exportálsz offline olvasáshoz, az Aspose.HTML könyvtár gond nélkül végzi a konverziót. + +Ebben az oktatóanyagban megtanulod, hogyan állítsd be a környezetet, írd meg a konverziós szkriptet, és kezeld a gyakori szélhelyzeteket, mint a hiányzó fájlok vagy egyedi oldalbeállítások. A végére **how to generate pdf** fájlokat tudsz létrehozni bármely HTML forrásból anélkül, hogy elhagynád a Python ökoszisztémát. + +## Amire szükséged lesz + +* Python 3.8 vagy újabb telepítve +* Aktív Aspose.HTML for Python licenc (az ingyenes próba a kiértékeléshez elegendő) +* `pip` hozzáférés a `aspose-html` csomag telepítéséhez +* Egy egyszerű HTML fájl, amelyet konvertálni szeretnél (pl. `input.html`) + +> **Pro tipp:** Tartsd a HTML-t és az eszközöket (képek, CSS) ugyanabban a könyvtárban, hogy elkerüld az útvonal‑feloldási problémákat a konverzió során. + +## 1. lépés: Az Aspose.HTML csomag telepítése + +Nyiss egy terminált, és futtasd a következő parancsot: + +```bash +pip install aspose-html +``` + +Az `aspose-html` wheel tartalmazza a magas minőségű rendereléshez szükséges natív könyvtárakat, így nincs szükség további rendszerfüggőségekre. + +## 2. lépés: Minimális Python szkript létrehozása + +Hozz létre egy új fájlt `convert_html_to_pdf.py` néven, és illeszd be az alábbi kódot. Ez a szkript a **html to pdf tutorial** háromlépéses mintáját követi: importálás, útvonalak meghatározása és a konverzió meghívása. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Miért működik ez + +* **`Converter` importálása** hozzáférést biztosít egy magas szintű API-hoz, amely elrejti a renderelő motort. +* **Abszolút útvonalak meghatározása** megakadályozza a relatív útvonal hibákat, amikor a szkript más munkakönyvtárból fut. +* **`Converter.convert_html`** elvégzi a teljes renderelési folyamatot – HTML elemzés, CSS elrendezés és PDF sorosítás – egyetlen hívásban, ami az ajánlott módja a **how to generate pdf** gyors végrehajtásának. + +## 3. lépés: A szkript futtatása és a kimenet ellenőrzése + +Futtasd a szkriptet a terminálból: + +```bash +python convert_html_to_pdf.py +``` + +Ha minden helyesen van beállítva, a következőt fogod látni: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Nyisd meg az `output.pdf`-t bármely PDF megjelenítővel. A dokumentumnak az eredeti HTML oldalhoz hasonlóan kell kinéznie, beleértve a betűtípusokat, képeket és az alap CSS stílusokat. + +![Generált PDF előnézet](https://example.com/images/pdf-preview.png "Képernyőkép a Python segítségével HTML-ből generált PDF-ről"){: .center-image alt="Képernyőkép egy HTML fájlból Python segítségével generált PDF-ről"} + +## 4. lépés: A konverzió testreszabása (opcionális) + +Az alap **html to pdf tutorial** egy egy‑az‑egy konverziót fed le, de a valós helyzetek gyakran igényelnek finomhangolásokat: + +| Követelmény | Hogyan valósítható meg Aspose.HTML segítségével | +|-------------|------------------------------------| +| Oldalméret beállítása (A4, Letter) | Adj át egy `PdfSaveOptions` objektumot a `convert_html`-nek | +| Margók vagy fejlécek/láblécek hozzáadása | Használd a `PdfPageSettings`-t a beállításokon belül | +| Egyedi betűtípusok beágyazása | Győződj meg róla, hogy a betűtípus fájlok elérhetők, és állítsd be a `FontSettings`-t | + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Megjegyzés:** Egyedi opciók használata a preferált **generate pdf from html** technika, ha pontos vezérlést igényelsz az elrendezés felett. + +## 5. lépés: Több HTML fájl kezelése (csoportos konverzió) + +Ha egy mappában sok HTML jelentés van, ciklusba vonhatod őket: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Ez a kódrészlet egy skálázható **python convert html pdf** munkafolyamatot mutat be, amely illeszkedik CI csővezetékekbe vagy ütemezett feladatokba. + +## Gyakori buktatók és hogyan kerüld el őket + +| Probléma | Ok | Megoldás | +|----------|----|----------| +| Hiányzó képek a PDF-ben | Relatív képadatok, amelyek hibát okoznak, ha a szkript más mappából fut | Használj abszolút útvonalakat vagy állítsd be a `base_uri`-t a `Converter` opciókban | +| A CSS nem alkalmazott | Külső stíluslap, amely URL-re hivatkozik és internetkapcsolatot igényel | Töltsd le a stíluslapot helyben, és hivatkozz rá relatív útvonallal | +| Betűtípus helyettesítés | A betűtípus nincs telepítve a gépen | Add hozzá a betűtípus fájlt a projekthez és konfiguráld a `FontSettings`-t | + +Ezeknek a szélhelyzeteknek a kezelése biztosítja, hogy a **export html as pdf** folyamatod robusztus legyen a különböző környezetekben. + +## Teljes, futtatható példa + +Az alábbiakban a teljes szkriptet találod, amely tartalmazza az opcionális beállításokat, hibakezelést és a csoportos feldolgozási logikát. Másold be a `full_html_to_pdf.py` fájlba, és futtasd úgy, ahogy korábban bemutattuk. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +A szkript futtatása PDF-et generál minden HTML fájlhoz a célkönyvtárban, egységes oldalbeállításokkal – egy teljes **python convert html pdf** megoldás, amely készen áll a termelésre. + +## Következtetés + +Most már van egy gyakorlati **html to pdf tutorial**, amely megmutatja, hogyan generálj PDF fájlokat HTML-ből Python és Aspose.HTML segítségével. Az útmutató lefedte a környezet beállítását, egy minimális konverziós szkriptet, az opcionális testreszabást, a csoportos feldolgozást és a hibaelhárítási tippeket. + +Innen tovább felfedezheted a kapcsolódó témákat, például **how to generate pdf** vízjelek hozzáadásával, több PDF egyesítésével, vagy a HTML más formátumokra, például DOCX-re konvertálásával. Kísérletezz a `PdfSaveOptions` API-val a kimenet finomhangolásához, és integráld a szkriptet webszolgáltatásokba vagy automatizált jelentéskészítő csővezetékekbe. + +Boldog kódolást, és élvezd, ahogy HTML tartalmadat kifinomult PDF-ekké alakítod! + +## Mit érdemes még megtanulni? + +A következő oktatóanyagok szorosan kapcsolódó témákat fednek le, amelyek a jelen útmutatóban bemutatott technikákra épülnek. Minden forrás tartalmaz teljes, működő kódrészleteket lépésről‑lépésre magyarázatokkal, hogy segítsenek elsajátítani további API funkciókat és alternatív megvalósítási megközelítéseket a saját projektjeidben. + +- [HTML PDF-re konvertálása Aspose.HTML‑el – Teljes lépésről‑lépésre útmutató](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [HTML PDF-re konvertálása Aspose.HTML‑el – Teljes manipulációs útmutató](/html/english/) +- [HTML PDF-re konvertálása Java‑ban – Aspose.HTML for Java használata](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/indonesian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/indonesian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..7725816167 --- /dev/null +++ b/html/indonesian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,266 @@ +--- +category: general +date: 2026-09-19 +description: Pelajari cara mengubah judul dalam file HTML dengan Python. Panduan ini + mencakup membaca HTML, memperbarui tag judul, dan menyimpan HTML yang telah dimodifikasi. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: id +lastmod: 2026-09-19 +og_description: Cara mengubah judul dalam file HTML dengan Python. Ikuti contoh lengkap + ini untuk membaca HTML, memperbarui tag judul, dan menyimpan dokumen yang telah + dimodifikasi. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Cara mengubah judul dalam file HTML menggunakan Python – panduan langkah + demi langkah +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Cara mengubah judul dalam file HTML menggunakan Python +url: /id/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cara mengubah judul dalam file HTML menggunakan Python + +Jika Anda perlu **cara mengubah judul** dalam dokumen HTML secara programatis, Python membuat pekerjaan ini menjadi mudah. Pada tutorial ini Anda akan membaca file HTML, memperbarui elemen `<title>`, dan menyimpan HTML yang telah dimodifikasi kembali ke disk—semua dengan kode yang jelas dan dapat dijalankan. + +Mengubah judul halaman adalah langkah umum ketika Anda menghasilkan situs statis, menyesuaikan halaman yang di‑scrape, atau mengotomatisasi pembaruan SEO. Pada akhir panduan ini Anda akan tahu cara **memperbarui judul html**, cara **membaca html dengan python**, dan cara **menyimpan html yang dimodifikasi** dengan aman. + +## Prasyarat + +Sebelum memulai, pastikan Anda memiliki: + +- Python 3.8 atau yang lebih baru terpasang +- Paket `beautifulsoup4` (`pip install beautifulsoup4`) +- Sebuah file HTML yang ingin Anda edit (contoh menggunakan `index.html` dalam folder pilihan Anda) + +Tidak ada layanan eksternal yang diperlukan; semuanya berjalan secara lokal. + +## Langkah 1: Muat file HTML dengan Python + +Tugas pertama adalah **memuat file html python**‑style. Menggunakan `BeautifulSoup` memberi Anda parser yang toleran terhadap markup yang tidak sempurna. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Mengapa langkah ini penting:* +`BeautifulSoup` membangun representasi pohon, memungkinkan Anda menanyakan dan memodifikasi elemen tanpa harus menangani string secara manual. `html.parser` bawaan cepat dan tidak memerlukan binari tambahan. + +## Langkah 2: Temukan elemen `<title>` + +Dokumen HTML biasanya berisi satu tag `<title>` di dalam `<head>`. Kami mengambil kemunculan pertama, yang memenuhi kebutuhan **memperbarui judul html**. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Mengapa kami memeriksa `None`*: +Beberapa fragmen HTML tidak menyertakan judul. Menambahkannya secara otomatis mencegah kesalahan di kemudian hari dan membuat skrip lebih tangguh. + +## Langkah 3: Ubah teks judul + +Sekarang kami **memperbarui judul html** dengan menetapkan teks baru ke string tag tersebut. Inilah inti dari operasi **cara mengubah judul**. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +Atribut `string` mewakili node teks di dalam `<title>`. Menimpanya memperbarui DOM di memori. + +## Langkah 4: Simpan HTML yang telah dimodifikasi + +Akhirnya, tulis dokumen yang telah diubah ke file baru. Ini menyelesaikan langkah **menyimpan html yang dimodifikasi** dan menjaga file asli tetap tidak tersentuh. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` memformat output dengan indentasi, sehingga file mudah dibaca setelah perubahan. + +### Output yang diharapkan + +Menjalankan skrip pada contoh `index.html` yang awalnya berisi: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +akan menghasilkan output konsol serupa dengan: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +File `index_modified.html` yang disimpan kini akan dimulai dengan: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Skrip lengkap untuk salin‑tempel cepat + +Berikut adalah program lengkap yang siap dijalankan yang menggabungkan keempat langkah. Simpan sebagai `change_title.py` dan sesuaikan `YOUR_DIRECTORY` sesuai kebutuhan. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Jalankan skrip: + +```bash +python change_title.py +``` + +Anda akan melihat pesan konsol dan file baru `index_modified.html` dengan judul yang telah diperbarui. + +## Tips tambahan dan kasus tepi + +| Situasi | Apa yang harus dilakukan | +|-----------|------------| +| **Beberapa tag `<title>`** | `soup.find_all("title")` mengembalikan daftar; perbarui elemen pertama atau iterasi jika Anda perlu mengubah semuanya. | +| **Masalah enkoding** | Buka file dengan `encoding="utf-8-sig"` jika ada BOM, atau deteksi enkoding dengan `chardet`. | +| **File HTML besar** | Gunakan parser `lxml` (`BeautifulSoup(html_content, "lxml")`) untuk kinerja yang lebih baik. | +| **Mempertahankan format asli** | Jika Anda harus menjaga spasi persis, tulis `str(soup)` alih‑alih `prettify()`. | +| **Mengotomatisasi pada banyak file** | Bungkus logika dalam fungsi dan loop melalui `Path.rglob("*.html")`. | + +Variasi ini menjaga logika inti **cara mengubah judul** tetap utuh sambil menyesuaikan dengan proyek dunia nyata. + +## Kesimpulan + +Anda kini tahu cara **cara mengubah judul** dalam dokumen HTML apa pun menggunakan Python. Tutorial ini mencakup membaca HTML, menemukan tag `<title>`, memperbarui teksnya, dan **menyimpan html yang dimodifikasi** dengan aman. Dengan skrip lengkap Anda dapat mengintegrasikan pola ini ke dalam generator situs statis, pipeline SEO, atau otomatisasi apa pun yang memerlukan perubahan judul dinamis. + +Selanjutnya, jelajahi topik terkait seperti **membaca html dengan python** untuk mengekstrak meta tag, atau teknik **memuat file html python** untuk menangani markup yang rusak. Bereksperimenlah dengan pemrosesan batch untuk memperbarui judul di seluruh situs—keterampilan baru Anda menjadi dasar bagi banyak tugas otomasi web. Selamat coding! + + +## Apa yang Harus Anda Pelajari Selanjutnya? + + +Tutorial berikut mencakup topik yang sangat terkait dan membangun teknik yang ditunjukkan dalam panduan ini. Setiap sumber menyertakan contoh kode lengkap yang berfungsi dengan penjelasan langkah‑demi‑langkah untuk membantu Anda menguasai fitur API tambahan dan mengeksplorasi pendekatan implementasi alternatif dalam proyek Anda sendiri. + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/indonesian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/indonesian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..b497c7e985 --- /dev/null +++ b/html/indonesian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,205 @@ +--- +category: general +date: 2026-09-19 +description: Konversi file HTML lokal ke PDF menggunakan Python dan Aspose.HTML – + panduan lengkap langkah demi langkah yang juga mencakup opsi konversi HTML ke PDF + dengan Python. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: id +lastmod: 2026-09-19 +og_description: Konversi file HTML lokal ke PDF menggunakan Python. Pelajari cara + terbaik mengonversi HTML ke PDF dengan Python menggunakan Aspose.HTML, termasuk + penyematan font dan penanganan error. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Konversi file HTML lokal ke PDF dengan Python – panduan lengkap +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Cara mengonversi file HTML lokal menjadi PDF dengan Python +url: /id/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cara mengonversi file HTML lokal ke PDF dengan Python + +Jika Anda perlu **mengonversi file HTML lokal ke PDF** dalam proyek Python, tutorial ini menunjukkan solusi siap‑jalankan. Anda akan melihat cara menyiapkan pustaka Aspose.HTML, mengonfigurasi opsi PDF, dan mengeksekusi konversi dalam hanya beberapa baris kode. Panduan ini juga menjelaskan praktik terbaik **convert html to pdf python**, sehingga Anda dapat menyesuaikan kode dengan alur kerja Anda sendiri. + +Langkah-langkah di bawah ini mencakup semua yang perlu Anda ketahui: menginstal SDK, menyiapkan opsi penyimpanan, menangani jebakan umum, dan memverifikasi output. Pada akhir artikel Anda akan memiliki fungsi yang dapat digunakan kembali dan dapat dimasukkan ke dalam aplikasi Python mana pun. + +## Prasyarat + +Sebelum Anda memulai, pastikan Anda memiliki: + +* Python 3.8 atau yang lebih baru terpasang di mesin Anda. +* Lisensi Aspose.HTML for Python yang aktif (versi percobaan gratis dapat digunakan untuk evaluasi). +* File HTML lokal yang ingin Anda ubah menjadi PDF (misalnya, `page.html`). + +Anda tidak memerlukan dependensi tingkat sistem tambahan; SDK sudah menyertakan semua yang diperlukan untuk pembuatan PDF. + +## Instal paket Aspose.HTML + +SDK Aspose.HTML didistribusikan melalui PyPI. Instal dengan `pip` di lingkungan virtual Anda: + +```bash +pip install aspose-html +``` + +Menjalankan perintah akan menampilkan versi yang terinstal, mengonfirmasi bahwa paket tersedia untuk diimpor. + +## Langkah 1: Impor kelas yang diperlukan + +Alur kerja konversi bergantung pada dua kelas utama: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` menyediakan metode statis `convert_html` yang melakukan transformasi sebenarnya. +* `PDFSaveOptions` memungkinkan Anda menyesuaikan output PDF, seperti menyematkan font standar. + +## Langkah 2: Buat opsi penyimpanan PDF dan aktifkan penyematan font standar + +Menyematkan font menjamin bahwa PDF yang dihasilkan terlihat sama di setiap perangkat, bahkan jika penampil tidak memiliki font tersebut terpasang secara lokal. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Mengatur `embed_standard_fonts` ke `True` disarankan untuk sebagian besar skenario produksi karena menghilangkan peringatan substitusi font di pembaca PDF. + +## Langkah 3: Konversi file HTML ke PDF menggunakan opsi yang dikonfigurasi + +Sekarang panggil `Converter.convert_html`, dengan memberikan jalur HTML sumber, jalur PDF tujuan, dan objek opsi yang telah Anda siapkan: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Jika konversi berhasil, metode mengembalikan `None` dan file PDF muncul di lokasi yang Anda tentukan. + +## Contoh lengkap dalam fungsi yang dapat digunakan kembali + +Membungkus logika dalam fungsi memudahkan penggunaan kembali di berbagai proyek: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Mengapa fungsi ini membantu + +* **Validasi input** – `FileNotFoundError` memudahkan debugging ketika jalur HTML salah. +* **Pembuatan direktori otomatis** – `os.makedirs(..., exist_ok=True)` mencegah kesalahan “directory does not exist”. +* **Penyematan font yang dapat dikonfigurasi** – Anda dapat menonaktifkan penyematan font untuk file yang lebih kecil jika Anda tahu lingkungan target sudah memiliki font yang diperlukan. + +## Kasus tepi umum dan cara menanganinya + +| Situation | Recommended handling | +|-----------|----------------------| +| **HTML berisi CSS atau gambar eksternal** | Gunakan URL absolut atau salin sumber daya di samping file HTML; Aspose.HTML mengikuti aturan yang sama seperti browser. | +| **File HTML besar (>10 MB)** | Tingkatkan batas memori default dengan mengatur `pdf_options.memory_limit` jika Anda menemui `OutOfMemoryException`. | +| **Anda memerlukan PDF yang dilindungi kata sandi** | Atur `pdf_options.encryption_details` dengan kata sandi pengguna sebelum memanggil `convert_html`. | +| **Menjalankan di server tanpa tampilan (headless)** | Tidak diperlukan konfigurasi tambahan; SDK tidak bergantung pada GUI. | + +Menangani skenario ini sejak awal menghindarkan Anda dari kesalahan runtime yang tidak terduga. + +## Memverifikasi hasil konversi + +Setelah skrip selesai, buka PDF yang dihasilkan dengan penampil apa pun (Adobe Reader, Chrome, dll.). Tata letak visual harus cocok dengan HTML asli, dan semua font harus muncul dengan benar karena telah disematkan. + +Anda juga dapat secara programatis memastikan bahwa file ada dan memiliki ukuran tidak nol: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Tips profesional untuk penggunaan produksi + +* **Pemrosesan batch** – Loop melalui daftar file HTML dan panggil `html_to_pdf` untuk masing‑masing; gunakan kembali satu instance `PDFSaveOptions` untuk mengurangi overhead pembuatan objek. +* **Logging** – Integrasikan modul `logging` Python untuk merekam timestamp konversi dan semua pengecualian. +* **Kinerja** – Saat mengonversi banyak file, pertimbangkan menjalankan konversi secara paralel menggunakan `concurrent.futures.ThreadPoolExecutor`, tetapi ingat bahwa SDK hanya thread‑safe untuk panggilan `Converter` yang terpisah. + +## Kesimpulan + +Anda kini memiliki metode lengkap yang siap produksi untuk **mengonversi file HTML lokal ke PDF** menggunakan Python. Solusi ini mencakup langkah-langkah penting—menginstal Aspose.HTML, mengonfigurasi opsi PDF, menangani kasus tepi umum, dan memverifikasi output—serta memperlihatkan alur kerja **convert html to pdf python** yang lebih luas. + +Dari sini Anda dapat menjelajahi fitur lanjutan seperti enkripsi PDF, ukuran halaman khusus, atau menambahkan watermark, semuanya didukung oleh SDK yang sama. Bereksperimenlah dengan opsi yang paling cocok untuk proyek Anda, dan Anda akan dapat mengotomatisasi konversi HTML‑ke‑PDF secara andal di lingkungan Python mana pun. + +--- + + +## Apa yang Harus Anda Pelajari Selanjutnya? + +Tutorial berikut mencakup topik terkait yang membangun teknik yang ditunjukkan dalam panduan ini. Setiap sumber menyertakan contoh kode lengkap yang berfungsi dengan penjelasan langkah demi langkah untuk membantu Anda menguasai fitur API tambahan dan menjelajahi pendekatan implementasi alternatif dalam proyek Anda. + +- [Mengonversi HTML ke PDF dengan Aspose.HTML – Panduan Langkah‑per‑Langkah Lengkap](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Mengonversi HTML ke PDF dengan Aspose.HTML – Panduan Manipulasi Lengkap](/html/english/) +- [Mengonversi HTML ke PDF di .NET dengan Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/indonesian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/indonesian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..677c5407ad --- /dev/null +++ b/html/indonesian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,219 @@ +--- +category: general +date: 2026-09-19 +description: Pelajari cara mengonversi HTML ke Markdown dalam Python. Tutorial ini + menunjukkan cara menyimpan HTML sebagai Markdown dan menghasilkan Markdown dari + HTML dengan cepat. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: id +lastmod: 2026-09-19 +og_description: Konversi HTML ke Markdown dengan Python. Ikuti panduan ini untuk menyimpan + HTML sebagai Markdown, menghasilkan Markdown dari HTML, dan membuat file HTML ke + Markdown. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Konversi HTML ke Markdown dengan Python – panduan pemrograman lengkap +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Cara mengonversi HTML ke Markdown dengan Python – panduan langkah demi langkah +url: /id/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cara mengonversi HTML ke Markdown dengan Python – panduan langkah demi langkah + +Jika Anda perlu **mengonversi HTML ke Markdown**, panduan ini akan membawa Anda melalui seluruh proses. Anda akan melihat cara **menyimpan HTML sebagai Markdown**, menghasilkan Markdown dari HTML, dan membuat sebuah *file html ke markdown* yang dapat digunakan dalam generator situs statis, pipeline dokumentasi, atau alur kerja apa pun yang lebih menyukai markup teks biasa. + +Tutorial ini mencakup semua hal mulai dari menginstal pustaka yang diperlukan hingga menangani kasus tepi seperti gambar tersemat dan format khusus. Pada akhir tutorial, Anda akan memiliki skrip siap‑jalankan dan pemahaman yang jelas mengapa setiap langkah penting. + +## Prasyarat + +- Python 3.8 atau yang lebih baru terinstal di mesin Anda. +- Familiaritas dasar dengan scripting Python. +- Akses ke terminal atau command prompt. +- Pustaka `aspose.html` (atau paket HTML‑to‑Markdown yang kompatibel). Tutorial ini menggunakan **Aspose.HTML for Python via .NET**, yang menyediakan kelas `HTMLDocument`, `MarkdownSaveOptions`, dan `Converter` seperti yang ditunjukkan dalam contoh kode. + +> **Tips pro:** Jika Anda lebih suka solusi murni‑Python, Anda dapat mengganti `aspose.html` dengan paket `html2text`. Alur keseluruhan tetap sama. + +## Langkah 1: Instal pustaka konversi + +Pertama, instal pustaka yang menyediakan `HTMLDocument`, `MarkdownSaveOptions`, dan `Converter`. Jalankan perintah berikut: + +```bash +pip install aspose-html +``` + +Paket ini menyertakan mesin native yang diperlukan untuk **menghasilkan markdown dari html** dengan cepat dan akurasi tinggi. Instalasi biasanya selesai dalam kurang dari satu menit pada koneksi broadband standar. + +## Langkah 2: Muat dokumen HTML sumber + +Memuat file HTML adalah tindakan konkret pertama dalam pipeline konversi. Kelas `HTMLDocument` mem-parsing file dan membangun DOM dalam memori, yang kemudian dilalui oleh konverter untuk menghasilkan Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Mengapa ini penting:** Dengan membuat objek `HTMLDocument`, Anda memastikan bahwa struktur kompleks—tabel, daftar, dan gaya inline—diinterpretasikan dengan benar sebelum konversi. Melewatkan langkah ini akan memaksa konverter membaca teks mentah, yang menyebabkan hilangnya format. + +## Langkah 3: Konfigurasikan opsi penyimpanan Markdown + +Objek `MarkdownSaveOptions` memungkinkan Anda menyesuaikan format output secara detail. Untuk menghasilkan **Git‑flavored Markdown**, atur properti `formatter` menjadi `"GIT"`. Ini cocok dengan sintaks yang digunakan oleh platform seperti GitHub, GitLab, dan Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Anda juga dapat menyesuaikan pengaturan lain, seperti `preserve_links` atau `code_block_style`, tergantung pada bagaimana Anda berencana **menyimpan html sebagai markdown** dalam alat hilir. + +## Langkah 4: Konversi HTML ke Markdown dan simpan hasilnya + +Dengan dokumen yang sudah dimuat dan opsi yang dikonfigurasi, panggil metode statis `convert_html`. Metode ini membaca DOM, menerapkan formatter yang dipilih, dan menulis file output. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Setelah menjalankan skrip, Anda akan menemukan file baru bernama `output.md` di direktori yang ditentukan. Membukanya akan menampilkan Markdown bersih yang kompatibel dengan Git, siap untuk kontrol versi atau publikasi. + +## Langkah 5: Verifikasi file markdown yang dihasilkan + +Pemeriksaan cepat membantu Anda memastikan bahwa konversi berhasil dan bahwa **file html ke markdown** berisi konten yang diharapkan. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Output tipikal untuk halaman HTML sederhana terlihat seperti: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Jika Anda melihat judul yang hilang atau daftar yang rusak, tinjau kembali **Langkah 3** dan coba nilai `formatter` yang berbeda (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Lanjutan: Menangani gambar dan jalur relatif + +Ketika HTML sumber berisi gambar, konverter dapat menanamkan mereka sebagai data URI atau mempertahankan atribut `src` asli. Untuk menjaga proses **menghasilkan markdown dari html** tetap ringan, Anda mungkin ingin menyalin file gambar ke folder paralel dan menyesuaikan jalur. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Setelah konversi, Markdown akan merujuk gambar seperti `![Alt text](images/picture.png)`. Pendekatan ini bekerja dengan baik ketika Anda kemudian **menyimpan html sebagai markdown** dalam generator situs statis yang mengharapkan aset di folder khusus. + +## Skrip lengkap yang dapat Anda salin‑tempel + +Berikut adalah skrip lengkap yang dapat dijalankan yang menggabungkan semua langkah yang dibahas. Simpan sebagai `convert_html_to_md.py` dan jalankan dengan `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Output yang diharapkan + +Menjalankan skrip mencetak pesan konfirmasi diikuti oleh sepuluh baris pertama file Markdown, seperti yang ditunjukkan sebelumnya. `output.md` yang dihasilkan dapat dibuka di editor teks apa pun, dipratinjau di VS Code, atau dikomit ke repositori Git. + +## Pertanyaan umum dan penanganan kasus‑tepi + +| Pertanyaan | Jawaban | +|------------|---------| +| **Bagaimana jika file HTML besar (> 10 MB)?** | `HTMLDocument` class melakukan streaming input, sehingga penggunaan memori tetap sedang. Namun, pertimbangkan untuk meningkatkan batas memori proses Python jika Anda menemui `MemoryError`. | +| **Bisakah saya mengonversi string HTML alih-alih file?** | Ya. Gunakan `HTMLDocument.from_string(html_string)` (atau konstruktor setara) sebelum memanggil `Converter.convert_html`. | +| **Bagaimana cara mempertahankan komentar HTML asli?** | Setel `md_options.preserve_comments = True`. Komentar akan muncul sebagai komentar HTML (`<!-- … -->`) di dalam file Markdown. | +| **Apakah memungkinkan menargetkan dialek Markdown yang berbeda?** | Ubah `md_options.formatter` menjadi `"COMMONMARK"` atau `"MARKDOWN_EXTRA"` tergantung pada platform target. | +| **Apakah saya perlu menginstal runtime .NET secara terpisah?** | Paket `aspose-html` menyertakan runtime yang diperlukan untuk sebagian besar platform. Pada Linux, pastikan `libgdiplus` terinstal (`sudo apt-get install libgdiplus`). | + +## Kesimpulan + +Anda sekarang tahu cara **mengonversi HTML ke Markdown** menggunakan Python, cara **menyimpan html sebagai markdown**, dan cara **menghasilkan markdown dari html** dengan kontrol detail atas format dan aset. Skrip ini menunjukkan alur kerja lengkap—dari memuat file sumber hingga menghasilkan *file html ke markdown* yang bersih, siap untuk kontrol versi atau publikasi. + +Selanjutnya, jelajahi topik terkait seperti **mengonversi batch banyak file HTML**, mengintegrasikan langkah konversi ke dalam pipeline CI/CD, atau menyesuaikan output Markdown untuk generator situs statis tertentu seperti Hugo atau Jekyll. Bereksperimenlah dengan berbagai pengaturan `MarkdownSaveOptions` untuk menyesuaikan hasil dengan panduan gaya proyek Anda. + +Selamat mengonversi! + +## Apa yang Harus Anda Pelajari Selanjutnya? + +Tutorial berikut mencakup topik yang sangat terkait yang membangun teknik yang ditunjukkan dalam panduan ini. Setiap sumber mencakup contoh kode lengkap yang berfungsi dengan penjelasan langkah demi langkah untuk membantu Anda menguasai fitur API tambahan dan mengeksplorasi pendekatan implementasi alternatif dalam proyek Anda. + +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/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/indonesian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/indonesian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..7561f3cdd0 --- /dev/null +++ b/html/indonesian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,222 @@ +--- +category: general +date: 2026-09-19 +description: Cara mengaktifkan fitur saat mengonversi HTML ke Markdown menggunakan + Python. Pelajari cara mengonversi dokumen HTML dan menyimpan HTML sebagai Markdown + dengan kontrol fitur yang tepat. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: id +lastmod: 2026-09-19 +og_description: Cara mengaktifkan fitur saat mengonversi HTML ke Markdown. Panduan + ini menunjukkan langkah demi langkah cara mengonversi dokumen HTML dan menyimpan + HTML sebagai Markdown dengan kontrol yang sangat terperinci. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Cara mengaktifkan fitur saat mengonversi HTML ke Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Cara mengaktifkan fitur saat mengonversi HTML ke Markdown +url: /id/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cara mengaktifkan fitur saat mengonversi HTML ke Markdown + +Jika Anda perlu **cara mengaktifkan fitur** selama konversi, panduan ini memberikan solusi lengkap yang dapat dijalankan. Anda akan melihat secara tepat cara mengonversi HTML ke Markdown, mengontrol fitur Markdown apa yang dihasilkan, dan menyimpan HTML sebagai Markdown dalam satu langkah. + +Contoh ini menggunakan **GroupDocs.Conversion** Python SDK yang populer, tetapi konsepnya berlaku untuk pustaka apa pun yang memungkinkan Anda mengonfigurasi set fitur. Pada akhir tutorial ini Anda dapat mengonversi dokumen HTML, menyimpan hanya tautan dan paragraf, serta menghindari tabel, gambar, atau blok kode yang tidak diinginkan. + +## Apa yang akan Anda capai + +* **cara mengaktifkan fitur** dalam opsi penyimpanan Markdown +* alur kerja **convert html to markdown** yang jelas +* kemampuan **cara mengonversi html** dengan output selektif +* skrip siap‑jalan yang **convert html document** dan **save html as markdown** + +### Prasyarat + +* Python 3.8+ terpasang +* paket `groupdocs-conversion` (pasang dengan `pip install groupdocs-conversion`) +* File HTML contoh (`sample.html`) di direktori yang diketahui + +--- + +## Cara mengaktifkan fitur dalam konversi Markdown + +Langkah pertama adalah membuat objek `MarkdownSaveOptions` dan memberi tahu konverter elemen mana yang ingin Anda pertahankan. Dalam tutorial ini kami hanya mengaktifkan **tautan** dan **paragraf**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Mengapa ini berhasil:** +* `HTMLDocument` membungkus file sumber sehingga konverter dapat membacanya. +* `MarkdownSaveOptions` menyimpan semua pengaturan konversi; daftar `features` adalah properti kunci yang **cara mengaktifkan fitur**. +* Dengan menetapkan `["Link", "Paragraph"]` Anda memberi tahu mesin untuk menghasilkan hanya tautan Markdown (`[text](url)`) dan paragraf biasa, mengabaikan gambar, tabel, dan markup lainnya. +* `Converter.convert_html` melakukan operasi **convert html to markdown** yang sesungguhnya dan menulis hasilnya ke `sample.md`. + +--- + +## Cara mengonversi dokumen HTML dengan opsi khusus + +Jika nanti Anda perlu menambahkan lebih banyak flag fitur—seperti `"Header"` atau `"Bold"`—cukup perpanjang daftar tersebut: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +Pemanggilan yang sama ke `Converter.convert_html` kini akan menyertakan elemen tambahan tersebut. Pola ini memungkinkan Anda **cara mengonversi html** dengan cara yang sangat dapat dikonfigurasi tanpa menulis parser khusus. + +--- + +## Cara menyimpan HTML sebagai Markdown di folder tertentu + +Metode `convert_html` menerima jalur output absolut atau relatif. Untuk **save html as markdown** di sub‑folder bernama `output`, sesuaikan argumen ketiga: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Menjalankan skrip akan membuat direktori `output` (jika belum ada) dan menulis file Markdown di sana. Pendekatan ini menjaga HTML sumber dan Markdown yang dihasilkan tetap terorganisir rapi. + +--- + +## Skrip lengkap yang dapat Anda salin‑tempel + +Berikut adalah seluruh program, siap dijalankan. Ganti `YOUR_DIRECTORY` dengan jalur yang berisi `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Output yang diharapkan** (dicetak ke konsol): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Buka `sample.md` dan Anda akan melihat hanya tautan Markdown dan paragraf biasa, misalnya: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Semua elemen HTML lainnya telah dihilangkan karena **cara mengaktifkan fitur** membatasi output hanya pada dua tipe yang dipilih. + +--- + +## Pertanyaan umum dan kasus tepi + +| Pertanyaan | Jawaban | +|------------|---------| +| *Bagaimana jika file HTML tidak mengandung tautan?* | Konverter tetap menulis paragraf; output akan berisi teks biasa tanpa sintaks tautan. | +| *Apakah saya dapat menonaktifkan semua fitur?* | Menetapkan `markdown_options.features = []` menghasilkan file Markdown kosong. Gunakan ini hanya untuk pengujian. | +| *Bagaimana SDK menangani HTML yang tidak valid?* | Parser berusaha membersihkan markup yang rusak sebelum menerapkan filter fitur. Kesalahan dicatat tetapi tidak menghentikan konversi. | +| *Apakah memungkinkan mempertahankan gambar sambil menghapus tabel?* | Ya. Tetapkan `markdown_options.features = ["Link", "Paragraph", "Image"]`. Daftar fitur bersifat aditif, bukan eksklusif. | +| *Bagaimana jika saya perlu mengonversi banyak file dalam satu folder?* | Bungkus logika konversi dalam loop yang mengiterasi `Path.glob("*.html")`. Konfigurasi **cara mengaktifkan fitur** yang sama dapat digunakan kembali untuk setiap file. | + +**Tips profesional:** Saat memproses batch besar, buat instance `MarkdownSaveOptions` sekali dan gunakan kembali. Ini mengurangi overhead pembuatan objek dan menjaga pipeline **convert html to markdown** tetap cepat. + +--- + +## Kesimpulan + +Anda kini mengetahui **cara mengaktifkan fitur** ketika **convert html to markdown**, bagaimana **cara mengonversi html** dengan output selektif, serta cara **convert html document** dan **save html as markdown** menggunakan skrip Python yang ringkas. Dengan mengonfigurasi `MarkdownSaveOptions.features`, Anda mendapatkan kontrol penuh atas elemen Markdown yang muncul di file akhir. + +### Langkah selanjutnya + +* Jelajahi flag fitur tambahan seperti `"Header"`, `"Bold"`, dan `"Italic"` untuk memperkaya output Markdown Anda. +* Gabungkan skrip ini dengan file‑watcher (misalnya, `watchdog`) untuk secara otomatis mengonversi file HTML baru saat muncul. +* Tinjau dokumentasi [GroupDocs.Conversion Python SDK](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) untuk skenario lanjutan seperti konversi PDF‑ke‑Markdown atau DOCX‑ke‑HTML. + +Silakan bereksperimen dengan set fitur yang berbeda dan bagikan temuan Anda dengan komunitas. Selamat mengonversi! + + +## Apa yang Harus Anda Pelajari Selanjutnya? + + +Tutorial berikut mencakup topik terkait yang membangun teknik yang ditunjukkan dalam panduan ini. Setiap sumber menyertakan contoh kode lengkap yang berfungsi dengan penjelasan langkah‑demi‑langkah untuk membantu Anda menguasai fitur API tambahan dan mengeksplorasi pendekatan implementasi alternatif dalam proyek Anda. + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/indonesian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/indonesian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..3629c9e513 --- /dev/null +++ b/html/indonesian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,246 @@ +--- +category: general +date: 2026-09-19 +description: Pelajari cara membatasi sumber daya bersarang di Aspose.HTML untuk Python + menggunakan ResourceHandlingOptions. Kendalikan kedalaman penanganan maksimum dan + hindari loop tak terbatas. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: id +lastmod: 2026-09-19 +og_description: Batasi sumber daya bersarang di Aspose.HTML untuk Python menggunakan + ResourceHandlingOptions. Atur kedalaman penanganan maksimum untuk mencegah rekursi + yang dalam dan meningkatkan kinerja. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Cara membatasi sumber daya bersarang di Aspose.HTML untuk Python – panduan + langkah demi langkah +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Cara membatasi sumber daya bersarang saat memproses HTML dengan Aspose.HTML + untuk Python +url: /id/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cara membatasi sumber daya bersarang saat memproses HTML dengan Aspose.HTML untuk Python + +Jika Anda perlu **membatasi sumber daya bersarang** saat merender atau mengonversi HTML, panduan ini menunjukkan langkah‑langkah tepat untuk mengonfigurasi Aspose.HTML untuk Python. Mengontrol kedalaman penanganan sumber daya mencegah rekursi tak terkendali ketika sebuah halaman menyertakan banyak lapisan CSS, JavaScript, atau referensi gambar. + +Membatasi sumber daya bersarang terutama penting untuk perayap berskala besar, pipeline rendering email, atau alur kerja otomatis apa pun yang harus tetap dalam batas memori dan waktu. Pada bagian berikut Anda akan mempelajari mengapa harus menetapkan batas kedalaman, cara menggunakan kelas `ResourceHandlingOptions`, dan cara memverifikasi bahwa batas tersebut berfungsi sebagaimana mestinya. + +## Mengapa Anda harus membatasi sumber daya bersarang + +Dokumen HTML sering merujuk ke sumber daya lain—lembar gaya, skrip, gambar, font, atau bahkan file HTML lainnya. Setiap sumber daya tersebut dapat, pada gilirannya, merujuk ke file tambahan, membentuk pohon ketergantungan. Tanpa pengaman, pohon tersebut dapat menjadi sangat dalam secara tak terbatas: + +* Sebuah halaman memuat file CSS yang mengimpor file CSS lain, yang mengimpor lagi, dan seterusnya. +* JavaScript dapat memuat skrip tambahan secara dinamis. +* Template email dapat menyematkan gambar yang merujuk ke URL eksternal yang mengarahkan ke aset lain. + +Ketika kedalaman rekursi tumbuh tanpa kontrol, Anda berisiko: + +* **Konsumsi memori berlebihan** – setiap sumber daya yang diambil menempati buffer. +* **Waktu pemrosesan lebih lama** – latensi jaringan berlipat ganda pada setiap level. +* **Kemungkinan loop tak berujung** – referensi sirkular dapat menyebabkan mesin tidak pernah kembali. + +Menetapkan **kedalaman penanganan maksimum** memberi tahu Aspose.HTML untuk berhenti mengikuti tautan sumber daya setelah sejumlah level tertentu, memastikan kinerja yang dapat diprediksi. + +## Cara membatasi sumber daya bersarang di Aspose.HTML untuk Python + +Aspose.HTML menyediakan kelas `ResourceHandlingOptions`, yang berisi properti `max_handling_depth`. Dengan menetapkan nilai numerik (misalnya `3`), Anda memberi instruksi kepada mesin untuk berhenti setelah tiga level bersarang. + +Berikut adalah contoh lengkap yang dapat dijalankan yang menunjukkan seluruh alur kerja: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Penjelasan setiap langkah + +1. **Instal paket** – Wheel `aspose-html` diperlukan. Perintah `pip install` ditampilkan sebagai komentar untuk melengkapi. +2. **Impor kelas** – `HtmlDocument` memuat halaman, `ResourceHandlingOptions` menyimpan batas, dan `HtmlLoadOptions` menghubungkan keduanya. +3. **Buat objek opsi** – Menginstansiasi `ResourceHandlingOptions` memberi Anda wadah yang dapat diubah. +4. **Setel `max_handling_depth`** – Tetapkan `3` (atau integer lain) untuk membatasi mesin pada tiga level sumber daya bersarang. Ini adalah inti dari **membatasi sumber daya bersarang**. +5. **Lampirkan opsi ke konfigurasi pemuatan** – `HtmlLoadOptions` memungkinkan Anda mengirim `resource_options` ke loader. +6. **Muat HTML** – Konstruktor `HtmlDocument` menerima URL atau jalur file bersama `load_options`. Mesin kini menghormati batas kedalaman. +7. **Verifikasi** – Dengan mengiterasi `document.resources`, Anda dapat melihat berapa banyak sumber daya yang sebenarnya diambil dan level terdalam yang ditemui. Jika level terdalam adalah `3` atau lebih rendah, batas berhasil. +8. **Simpan** – Simpan dokumen yang telah diproses. File yang disimpan hanya berisi sumber daya hingga kedalaman yang diizinkan. + +#### Output yang diharapkan + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +Angka-angka akan bervariasi tergantung pada halaman sumber, tetapi level terdalam tidak boleh melebihi `3` karena kami menetapkan `max_handling_depth = 3`. + +## Variasi umum dan kasus tepi + +### Mengubah batas kedalaman + +Anda mungkin memerlukan batas yang lebih dalam atau lebih dangkal tergantung pada lingkungan Anda: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Menonaktifkan batas sepenuhnya + +Menetapkan properti ke `0` memberi tahu Aspose.HTML untuk **menghapus semua pembatasan kedalaman**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Lakukan ini hanya ketika Anda yakin HTML sumber berperilaku baik. + +### Menangani referensi sirkular + +Bahkan dengan batas kedalaman, referensi sirkular masih dapat muncul pada level yang sama. Aspose.HTML mendeteksi siklus dan menghentikan pemuatan sumber daya yang sudah diproses, terlepas dari pengaturan kedalaman. Namun, menetapkan `max_handling_depth` yang lebih rendah mengurangi kemungkinan menemukan siklus sejak awal. + +### Menggunakan batas dengan file lokal + +Pendekatan yang sama berlaku untuk file HTML lokal: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +Mesin memperlakukan atribut `href` atau `src` relatif dengan cara yang sama seperti URL remote, menerapkan batas kedalaman juga pada sumber daya sistem file. + +### Mengintegrasikan dengan fitur Aspose.HTML lainnya + +Jika Anda juga perlu mengontrol **batas waktu unduhan sumber daya**, Anda dapat menggabungkan `ResourceHandlingOptions` dengan `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Kedua opsi bersifat independen, sehingga Anda dapat menyetel kinerja dan keamanan secara bersamaan. + +## Tips profesional untuk penggunaan produksi + +* **Log pohon sumber daya** – Saat debugging, iterasi `document.resources` dan catat URL serta kedalaman setiap sumber daya. Ini membantu Anda memahami mengapa halaman tertentu melebihi harapan. +* **Cache sumber daya yang diambil** – Jika Anda memproses aset eksternal yang sama berulang kali, aktifkan caching untuk menghindari panggilan jaringan yang berulang. +* **Gabungkan dengan whitelist** – Jika hanya domain tertentu yang dipercaya, filter `document.resources` setelah pemuatan dan buang yang berada di luar whitelist. +* **Uji dengan halaman kasus tepi** – Buat file HTML sintetis yang mengimpor rangkaian 10 file CSS. Verifikasi bahwa batas Anda memotong rangkaian tersebut sesuai yang diharapkan. + +## Kesimpulan + +Anda kini mengetahui cara **membatasi sumber daya bersarang** di Aspose.HTML untuk Python dengan mengonfigurasi `ResourceHandlingOptions.max_handling_depth`. Menetapkan batas kedalaman melindungi aplikasi Anda dari penggunaan memori berlebihan, waktu pemrosesan yang lama, dan potensi loop tak berujung yang disebabkan oleh referensi sumber daya yang sangat bersarang atau sirkular. + +Dari titik ini Anda dapat: + +* Menyesuaikan kedalaman agar sesuai dengan anggaran kinerja Anda (`resource_handling_options.max_handling_depth`). +* Menggabungkan batas dengan batas waktu jaringan, caching, atau whitelist domain untuk pipeline yang kuat. +* Menjelajahi topik terkait seperti **resource handling options**, **max handling depth**, dan **nested resource handling** untuk lebih memperketat kontrol atas pemrosesan HTML. + +Cobalah nilai kedalaman yang berbeda dan amati bagaimana jumlah sumber daya yang dimuat berubah. Saat Anda siap, integrasikan pola ini ke dalam layanan konversi atau rendering HTML yang lebih besar untuk memastikan eksekusi yang dapat diprediksi, aman, dan efisien. + +## Apa yang Harus Anda Pelajari Selanjutnya? + +Tutorial berikut mencakup topik yang sangat terkait yang membangun teknik yang ditunjukkan dalam panduan ini. Setiap sumber daya menyertakan contoh kode lengkap yang berfungsi dengan penjelasan langkah demi langkah untuk membantu Anda menguasai fitur API tambahan dan mengeksplorasi pendekatan implementasi alternatif dalam proyek Anda. + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/indonesian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/indonesian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..5ef6af17a2 --- /dev/null +++ b/html/indonesian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,262 @@ +--- +category: general +date: 2026-09-19 +description: Pelajari tutorial HTML ke PDF dalam Python yang menunjukkan cara menghasilkan + PDF dari HTML dengan cepat menggunakan Aspose.HTML. Ikuti panduan langkah demi langkah + sekarang. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: id +lastmod: 2026-09-19 +og_description: 'tutorial html ke pdf: Konversi halaman HTML apa pun menjadi file + PDF menggunakan Python dan Aspose.HTML. Panduan ini menunjukkan cara menghasilkan + PDF dari HTML dalam hitungan menit.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Tutorial HTML ke PDF dengan Python – panduan lengkap langkah demi langkah +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Cara melakukan tutorial html ke pdf menggunakan Python +url: /id/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cara melakukan tutorial html ke pdf menggunakan Python + +Jika Anda membutuhkan **html to pdf tutorial**, panduan ini menunjukkan secara tepat cara menghasilkan PDF dari HTML dengan hanya beberapa baris kode Python. Baik Anda mengotomatisasi pembuatan laporan maupun mengekspor konten web untuk dibaca secara offline, perpustakaan Aspose.HTML membuat konversi menjadi mudah. + +Dalam tutorial ini Anda akan belajar cara menyiapkan lingkungan, menulis skrip konversi, dan menangani kasus tepi umum seperti file yang hilang atau pengaturan halaman khusus. Pada akhir tutorial Anda dapat **how to generate pdf** file dari sumber HTML apa pun tanpa meninggalkan ekosistem Python. + +## Apa yang Anda perlukan + +Sebelum memulai, pastikan Anda memiliki: + +* Python 3.8 atau lebih baru terinstal +* Lisensi Aspose.HTML untuk Python yang aktif (versi percobaan gratis dapat digunakan untuk evaluasi) +* `pip` untuk menginstal paket `aspose-html` +* File HTML sederhana yang ingin Anda konversi (misalnya `input.html`) + +> **Pro tip:** Simpan HTML dan aset Anda (gambar, CSS) dalam direktori yang sama untuk menghindari masalah resolusi jalur selama konversi. + +## Langkah 1: Instal paket Aspose.HTML + +Buka terminal dan jalankan perintah berikut: + +```bash +pip install aspose-html +``` + +Wheel `aspose-html` menyertakan pustaka native yang diperlukan untuk rendering berkualitas tinggi, sehingga tidak ada dependensi sistem tambahan yang diperlukan. + +## Langkah 2: Buat skrip Python minimal + +Buat file baru bernama `convert_html_to_pdf.py` dan tempelkan kode di bawah ini. Skrip ini mengikuti pola **html to pdf tutorial** dengan proses tiga langkah: impor, mendefinisikan jalur, dan memanggil konversi. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Mengapa ini berhasil + +* **Mengimpor `Converter`** memberi Anda akses ke API tingkat tinggi yang menyembunyikan mesin rendering. +* **Mendefinisikan jalur absolut** mencegah bug jalur relatif ketika skrip dijalankan dari direktori kerja yang berbeda. +* **`Converter.convert_html`** melakukan seluruh pipeline rendering—parsing HTML, tata letak CSS, dan serialisasi PDF—dalam satu panggilan, yang merupakan cara yang direkomendasikan **how to generate pdf** dengan cepat. + +## Langkah 3: Jalankan skrip dan verifikasi output + +Jalankan skrip dari terminal: + +```bash +python convert_html_to_pdf.py +``` + +Jika semuanya telah disiapkan dengan benar, Anda akan melihat: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Buka `output.pdf` dengan penampil PDF apa pun. Dokumen tersebut harus terlihat identik dengan halaman HTML asli, termasuk font, gambar, dan gaya CSS dasar. + +![Generated PDF preview](https://example.com/images/pdf-preview.png "Tangkapan layar PDF yang dihasilkan dari HTML menggunakan Python"){: .center-image alt="Tangkapan layar PDF yang dihasilkan dari file HTML menggunakan Python"} + +## Langkah 4: Menyesuaikan konversi (opsional) + +Tutorial **html to pdf** dasar mencakup konversi satu‑ke‑satu, tetapi skenario dunia nyata sering memerlukan penyesuaian: + +| Persyaratan | Cara mencapainya dengan Aspose.HTML | +|-------------|------------------------------------| +| Menetapkan ukuran halaman (A4, Letter) | Kirim objek `PdfSaveOptions` ke `convert_html` | +| Menambahkan margin atau header/footer | Gunakan `PdfPageSettings` di dalam opsi | +| Menyematkan font khusus | Pastikan file font dapat diakses dan atur `FontSettings` | + +Berikut contoh yang mengatur ukuran halaman ke A4 dan menambahkan margin 1‑inci: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Catatan:** Menggunakan opsi khusus adalah teknik **generate pdf from html** yang disarankan ketika Anda memerlukan kontrol presisi atas tata letak. + +## Langkah 5: Menangani banyak file HTML (konversi batch) + +Jika Anda memiliki folder berisi banyak laporan HTML, Anda dapat melakukan loop melalui mereka: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Potongan kode ini menunjukkan alur kerja **python convert html pdf** yang skalabel dan cocok untuk pipeline CI atau pekerjaan terjadwal. + +## Kesalahan umum dan cara menghindarinya + +| Masalah | Penyebab | Solusi | +|-------|-------|-----| +| Gambar hilang dalam PDF | Jalur gambar relatif yang rusak ketika skrip dijalankan dari folder yang berbeda | Gunakan jalur absolut atau atur `base_uri` dalam opsi `Converter` | +| CSS tidak diterapkan | Stylesheet eksternal yang direferensikan dengan URL yang memerlukan akses internet | Unduh stylesheet secara lokal dan referensikan dengan jalur relatif | +| Substitusi font | Font tidak terpasang di mesin host | Sertakan file font dalam proyek dan konfigurasikan `FontSettings` | + +Menangani kasus tepi ini memastikan proses **export html as pdf** Anda kuat di berbagai lingkungan. + +## Contoh lengkap yang dapat dijalankan + +Berikut skrip lengkap yang mencakup pengaturan opsional, penanganan error, dan logika pemrosesan batch. Salin ke `full_html_to_pdf.py` dan jalankan seperti yang ditunjukkan sebelumnya. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Menjalankan skrip ini menghasilkan PDF untuk setiap file HTML di direktori target, menerapkan pengaturan halaman yang konsisten—solusi **python convert html pdf** lengkap yang siap untuk produksi. + +## Kesimpulan + +Anda kini memiliki **html to pdf tutorial** praktis yang menunjukkan cara menghasilkan file PDF dari HTML menggunakan Python dan Aspose.HTML. Panduan ini mencakup penyiapan lingkungan, skrip konversi minimal, kustomisasi opsional, pemrosesan batch, dan tips pemecahan masalah. + +Dari sini Anda dapat menjelajahi topik terkait seperti **how to generate pdf** dengan watermark, menggabungkan beberapa PDF, atau mengonversi HTML ke format lain seperti DOCX. Bereksperimenlah dengan API `PdfSaveOptions` untuk menyempurnakan output, dan integrasikan skrip ke layanan web atau pipeline pelaporan otomatis. + +Selamat coding, dan nikmati mengubah konten HTML Anda menjadi PDF yang rapi! + +## Apa yang Harus Anda Pelajari Selanjutnya? + +Tutorial berikut mencakup topik yang sangat terkait yang membangun teknik yang ditunjukkan dalam panduan ini. Setiap sumber menyertakan contoh kode lengkap yang berfungsi dengan penjelasan langkah demi langkah untuk membantu Anda menguasai fitur API tambahan dan mengeksplorasi pendekatan implementasi alternatif dalam proyek Anda. + +- [Konversi HTML ke PDF dengan Aspose.HTML – Panduan Lengkap Langkah‑per‑Langkah](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Konversi HTML ke PDF dengan Aspose.HTML – Panduan Manipulasi Lengkap](/html/english/) +- [Cara Mengonversi HTML ke PDF Java – Menggunakan Aspose.HTML untuk Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/italian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/italian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..1ab7e520e5 --- /dev/null +++ b/html/italian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-09-19 +description: Impara come cambiare il titolo in un file HTML con Python. Questa guida + copre la lettura dell'HTML, l'aggiornamento del tag title e il salvataggio dell'HTML + modificato. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: it +lastmod: 2026-09-19 +og_description: Come cambiare il titolo in un file HTML con Python. Segui questo esempio + completo per leggere l'HTML, aggiornare il tag title e salvare il documento modificato. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Come cambiare il titolo in un file HTML usando Python – guida passo passo +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Come cambiare il titolo in un file HTML usando Python +url: /it/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Come modificare il titolo in un file HTML usando Python + +Se hai bisogno di **come modificare il titolo** in un documento HTML in modo programmatico, Python rende il lavoro semplice. In questo tutorial leggerai un file HTML, aggiornerai l'elemento `<title>` e salverai l'HTML modificato su disco—tutto con codice chiaro e eseguibile. + +Cambiare il titolo della pagina è un passaggio comune quando generi siti statici, personalizzi pagine estratte o automatizzi aggiornamenti SEO. Alla fine di questa guida saprai come **aggiornare il titolo html**, come **leggere html con python** e come **salvare html modificato** in modo sicuro. + +## Prerequisiti + +Prima di iniziare, assicurati di avere: + +- Python 3.8 o versioni successive installate +- Il pacchetto `beautifulsoup4` (`pip install beautifulsoup4`) +- Un file HTML che desideri modificare (l'esempio utilizza `index.html` in una cartella a tua scelta) + +Non sono richiesti servizi esterni; tutto viene eseguito localmente. + +## Passo 1: Caricare il file HTML con Python + +Il primo compito è **caricare il file html con python**. Usare `BeautifulSoup` ti fornisce un parser indulgente che funziona anche con markup imperfetto. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Perché questo passo è importante:* +`BeautifulSoup` costruisce una rappresentazione ad albero, consentendoti di interrogare e modificare gli elementi senza gestire manualmente le stringhe. Il parser `html.parser` integrato è veloce e non richiede binari aggiuntivi. + +## Passo 2: Individuare l'elemento `<title>` + +I documenti HTML contengono solitamente un unico tag `<title>` all'interno di `<head>`. Recuperiamo la prima occorrenza, soddisfacendo il requisito di **aggiornare il titolo html**. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Perché controlliamo `None`*: +Alcuni frammenti HTML omettono il titolo. Aggiungerlo automaticamente evita errori successivi e mantiene lo script robusto. + +## Passo 3: Cambiare il testo del titolo + +Ora **aggiorniamo il titolo html** assegnando nuovo testo alla stringa del tag. Questo è il cuore dell'operazione **come modificare il titolo**. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +L'attributo `string` rappresenta il nodo di testo all'interno di `<title>`. Sovrascriverlo aggiorna il DOM in memoria. + +## Passo 4: Salvare l'HTML modificato + +Infine, scrivi il documento alterato in un nuovo file. Questo completa il passo **salvare html modificato** e lascia intatto l'originale. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` formatta l'output con rientri, rendendo il file facile da leggere dopo la modifica. + +### Output previsto + +Eseguendo lo script su un `index.html` di esempio che originariamente contiene: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +viene prodotto un output in console simile a: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +Il file salvato `index_modified.html` inizierà ora così: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Script completo per copia‑incolla veloce + +Di seguito trovi il programma completo, pronto all'uso, che combina tutti e quattro i passaggi. Salvalo come `change_title.py` e adatta `YOUR_DIRECTORY` secondo le tue esigenze. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Esegui lo script: + +```bash +python change_title.py +``` + +Vedrai i messaggi in console e un nuovo file `index_modified.html` con il titolo aggiornato. + +## Suggerimenti aggiuntivi e casi particolari + +| Situazione | Cosa fare | +|-----------|------------| +| **Tag `<title>` multipli** | `soup.find_all("title")` restituisce una lista; aggiorna il primo elemento o itera se devi modificare tutti. | +| **Problemi di codifica** | Apri i file con `encoding="utf-8-sig"` se è presente un BOM, oppure rileva la codifica con `chardet`. | +| **File HTML di grandi dimensioni** | Usa il parser `lxml` (`BeautifulSoup(html_content, "lxml")`) per migliori prestazioni. | +| **Preservare la formattazione originale** | Se devi mantenere gli spazi esatti, scrivi `str(soup)` invece di `prettify()`. | +| **Automatizzare su più file** | Avvolgi la logica in una funzione e itera su `Path.rglob("*.html")`. | + +Queste varianti mantengono intatta la logica di base **come modificare il titolo** adattandola a progetti reali. + +## Conclusione + +Ora sai come **come modificare il titolo** in qualsiasi documento HTML usando Python. Il tutorial ha coperto la lettura dell'HTML, l'individuazione del tag `<title>`, l'aggiornamento del suo testo e il **salvataggio dell'html modificato** in modo sicuro. Con lo script completo puoi integrare questo modello in generatori di siti statici, pipeline SEO o qualsiasi automazione che richieda modifiche dinamiche ai titoli. + +Successivamente, esplora argomenti correlati come **leggere html con python** per estrarre meta tag, o le tecniche **caricare file html con python** per gestire markup malformato. Sperimenta con l'elaborazione batch per aggiornare i titoli su un intero sito—la tua nuova competenza è la base per molte attività di automazione web. Buon coding! + +## Cosa dovresti imparare dopo? + +I tutorial seguenti trattano argomenti strettamente correlati che si basano sulle tecniche dimostrate in questa guida. Ogni risorsa include esempi di codice completi e spiegazioni passo‑passo per aiutarti a padroneggiare ulteriori funzionalità API ed esplorare approcci alternativi nei tuoi progetti. + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/italian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/italian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..58f550e392 --- /dev/null +++ b/html/italian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,202 @@ +--- +category: general +date: 2026-09-19 +description: Converti un file HTML locale in PDF usando Python e Aspose.HTML – una + guida completa passo‑passo che copre anche le opzioni per convertire HTML in PDF + con Python. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: it +lastmod: 2026-09-19 +og_description: Converti un file HTML locale in PDF usando Python. Scopri il modo + migliore per convertire HTML in PDF con Python usando Aspose.HTML, includendo l'incorporamento + dei font e la gestione degli errori. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Converti un file HTML locale in PDF con Python – guida completa +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Come convertire un file HTML locale in PDF con Python +url: /it/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Come convertire un file HTML locale in PDF con Python + +Se hai bisogno di **convertire un file HTML locale in PDF** in un progetto Python, questo tutorial ti mostra una soluzione pronta all'uso. Vedrai come configurare la libreria Aspose.HTML, impostare le opzioni PDF ed eseguire la conversione in poche righe di codice. La guida spiega anche le migliori pratiche per **convert html to pdf python**, così potrai adattare il codice ai tuoi flussi di lavoro. + +I passaggi seguenti coprono tutto ciò che devi sapere: installare l'SDK, preparare le opzioni di salvataggio, gestire le insidie comuni e verificare il risultato. Alla fine dell'articolo avrai una funzione riutilizzabile da inserire in qualsiasi applicazione Python. + +## Prerequisiti + +* Python 3.8 o successivo installato sulla tua macchina. +* Una licenza attiva di Aspose.HTML per Python (la versione di prova gratuita è valida per la valutazione). +* Un file HTML locale che desideri trasformare in PDF (ad es., `page.html`). + +Non hai bisogno di ulteriori dipendenze a livello di sistema; l'SDK include tutto il necessario per la generazione di PDF. + +## Installa il pacchetto Aspose.HTML + +L'SDK Aspose.HTML è distribuito tramite PyPI. Installalo con `pip` nel tuo ambiente virtuale: + +```bash +pip install aspose-html +``` + +L'esecuzione del comando stampa la versione installata, confermando che il pacchetto è disponibile per l'importazione. + +## Passo 1: Importa le classi richieste + +Il flusso di conversione si basa su due classi principali: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` fornisce il metodo statico `convert_html` che esegue la trasformazione effettiva. +* `PDFSaveOptions` ti consente di regolare finemente l'output PDF, ad esempio incorporando i font standard. + +## Passo 2: Crea le opzioni di salvataggio PDF e abilita l'incorporamento dei font standard + +L'incorporamento dei font garantisce che il PDF generato abbia lo stesso aspetto su ogni dispositivo, anche se il visualizzatore non ha i font installati localmente. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Impostare `embed_standard_fonts` su `True` è consigliato nella maggior parte degli scenari di produzione perché elimina gli avvisi di sostituzione dei font nei lettori PDF. + +## Passo 3: Converti il file HTML in PDF utilizzando le opzioni configurate + +Ora chiama `Converter.convert_html`, passando il percorso HTML di origine, il percorso PDF di destinazione e l'oggetto delle opzioni che hai preparato: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Se la conversione ha successo, il metodo restituisce `None` e il file PDF appare nella posizione specificata. + +## Esempio completo in una funzione riutilizzabile + +Raccogliere la logica in una funzione la rende facile da riutilizzare in più progetti: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Perché la funzione è utile + +* **Validazione dell'input** – Il `FileNotFoundError` semplifica il debug quando il percorso HTML è errato. +* **Creazione automatica della directory** – `os.makedirs(..., exist_ok=True)` previene gli errori “directory does not exist”. +* **Incorporamento dei font configurabile** – Puoi disattivare l'incorporamento dei font per file più piccoli se sai che l'ambiente di destinazione ha già i font richiesti. + +## Casi limite comuni e come gestirli + +| Situazione | Gestione consigliata | +|-----------|----------------------| +| **HTML contains external CSS or images** | Usa URL assoluti o copia le risorse accanto al file HTML; Aspose.HTML segue le stesse regole di un browser. | +| **Large HTML files (>10 MB)** | Aumenta il limite di memoria predefinito impostando `pdf_options.memory_limit` se incontri `OutOfMemoryException`. | +| **You need password‑protected PDFs** | Imposta `pdf_options.encryption_details` con una password utente prima di chiamare `convert_html`. | +| **Running in a headless server** | Non è necessaria alcuna configurazione aggiuntiva; l'SDK non dipende da una GUI. | + +Affrontare questi scenari in anticipo ti salva da errori di runtime inaspettati. + +## Verifica del risultato della conversione + +Dopo che lo script termina, apri il PDF generato con qualsiasi visualizzatore (Adobe Reader, Chrome, ecc.). Il layout visivo dovrebbe corrispondere all'HTML originale e tutti i font dovrebbero apparire correttamente perché sono stati incorporati. + +Puoi anche confermare programmaticamente che il file esiste e ha una dimensione diversa da zero: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Consigli professionali per l'uso in produzione + +* **Elaborazione batch** – Itera su un elenco di file HTML e chiama `html_to_pdf` per ciascuno; riutilizza una singola istanza di `PDFSaveOptions` per ridurre l'overhead di creazione degli oggetti. +* **Logging** – Integra il modulo `logging` di Python per catturare i timestamp di conversione e eventuali eccezioni. +* **Prestazioni** – Quando converti molti file, considera l'esecuzione delle conversioni in parallelo usando `concurrent.futures.ThreadPoolExecutor`, ma tieni presente che l'SDK è thread‑safe solo per chiamate separate a `Converter`. + +## Conclusione + +Ora disponi di un metodo completo e pronto per la produzione per **convertire un file HTML locale in PDF** usando Python. La soluzione copre i passaggi essenziali—installare Aspose.HTML, configurare le opzioni PDF, gestire i casi limite comuni e verificare il risultato—mostrando anche il più ampio flusso di lavoro **convert html to pdf python**. + +Da qui puoi esplorare funzionalità avanzate come la crittografia PDF, dimensioni di pagina personalizzate o l'aggiunta di filigrane, tutte supportate dallo stesso SDK. Sperimenta le opzioni che meglio si adattano al tuo progetto e potrai automatizzare la conversione da HTML a PDF in modo affidabile in qualsiasi ambiente Python. + +--- + +## Cosa dovresti imparare dopo? + +I seguenti tutorial coprono argomenti strettamente correlati che si basano sulle tecniche dimostrate in questa guida. Ogni risorsa include esempi di codice completi e funzionanti con spiegazioni passo‑passo per aiutarti a padroneggiare funzionalità API aggiuntive ed esplorare approcci di implementazione alternativi nei tuoi progetti. + +- [Converti HTML in PDF con Aspose.HTML – Guida completa passo‑per‑passo](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Converti HTML in PDF con Aspose.HTML – Guida completa alla manipolazione](/html/english/) +- [Converti HTML in PDF in .NET con Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/italian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/italian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..97dd9fb29a --- /dev/null +++ b/html/italian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,217 @@ +--- +category: general +date: 2026-09-19 +description: Impara a convertire HTML in Markdown con Python. Questo tutorial mostra + come salvare HTML come Markdown e generare Markdown da HTML rapidamente. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: it +lastmod: 2026-09-19 +og_description: Converti HTML in Markdown con Python. Segui questa guida per salvare + HTML come Markdown, generare Markdown da HTML e creare un file HTML in Markdown. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Converti HTML in Markdown in Python – guida completa di programmazione +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Come convertire HTML in Markdown con Python – guida passo passo +url: /it/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Come convertire HTML in Markdown con Python – guida passo‑passo + +Se hai bisogno di **convertire HTML in Markdown**, questa guida ti accompagna attraverso l'intero processo. Vedrai come **salvare HTML come Markdown**, generare Markdown da HTML e produrre un *html to markdown file* che può essere usato nei generatori di siti statici, nelle pipeline di documentazione o in qualsiasi flusso di lavoro che preferisce markup in testo semplice. + +Il tutorial copre tutto, dall'installazione della libreria necessaria alla gestione dei casi limite come immagini incorporate e formattazione personalizzata. Alla fine, avrai uno script pronto all'uso e una chiara comprensione del motivo per cui ogni passaggio è importante. + +## Prerequisiti + +- Python 3.8 o versioni successive installato sulla tua macchina. +- Familiarità di base con la programmazione Python. +- Accesso a un terminale o prompt dei comandi. +- La libreria `aspose.html` (o qualsiasi pacchetto compatibile HTML‑to‑Markdown). Questo tutorial utilizza **Aspose.HTML for Python via .NET**, che fornisce le classi `HTMLDocument`, `MarkdownSaveOptions` e `Converter` mostrate nell'esempio di codice. + +> **Consiglio professionale:** Se preferisci una soluzione pure‑Python, puoi sostituire `aspose.html` con il pacchetto `html2text`. Il flusso complessivo rimane lo stesso. + +## Passo 1: Installa la libreria di conversione + +Per prima cosa, installa la libreria che fornisce `HTMLDocument`, `MarkdownSaveOptions` e `Converter`. Esegui il comando seguente: + +```bash +pip install aspose-html +``` + +Il pacchetto include il motore nativo necessario per **generare markdown da html** rapidamente e con alta fedeltà. L'installazione di solito termina in meno di un minuto su una connessione a banda larga standard. + +## Passo 2: Carica il documento HTML sorgente + +Caricare il file HTML è la prima azione concreta nella pipeline di conversione. La classe `HTMLDocument` analizza il file e costruisce un DOM in memoria, che il convertitore utilizza successivamente per produrre Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Perché è importante:** Creando un oggetto `HTMLDocument`, ti assicuri che strutture complesse—tabelle, elenchi e stili inline—siano interpretate correttamente prima della conversione. Saltare questo passaggio costringerebbe il convertitore a leggere testo grezzo, con perdita di formattazione. + +## Passo 3: Configura le opzioni di salvataggio Markdown + +L'oggetto `MarkdownSaveOptions` ti consente di perfezionare il formato di output. Per produrre **Markdown in stile Git**, imposta la proprietà `formatter` su `"GIT"`. Questo corrisponde alla sintassi usata da piattaforme come GitHub, GitLab e Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Puoi anche modificare altre impostazioni, come `preserve_links` o `code_block_style`, a seconda di come intendi **salvare html come markdown** negli strumenti a valle. + +## Passo 4: Converti l'HTML in Markdown e salva il risultato + +Con il documento caricato e le opzioni configurate, invoca il metodo statico `convert_html`. Questo metodo legge il DOM, applica il formatter scelto e scrive il file di output. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Dopo aver eseguito lo script, troverai un nuovo file chiamato `output.md` nella directory specificata. Aprendolo vedrai un Markdown pulito e compatibile con Git, pronto per il controllo di versione o la pubblicazione. + +## Passo 5: Verifica il file markdown generato + +Un rapido controllo di coerenza ti aiuta a confermare che la conversione sia avvenuta con successo e che il **html to markdown file** contenga il contenuto previsto. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +L'output tipico per una semplice pagina HTML appare così: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Se noti intestazioni mancanti o elenchi malformati, torna al **Passo 3** e sperimenta con valori diversi di `formatter` (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Avanzato: Gestione di immagini e percorsi relativi + +Quando l'HTML sorgente contiene immagini, il convertitore può incorporarle come data URI o preservare gli attributi `src` originali. Per mantenere il processo di **generate markdown from html** leggero, potresti voler copiare i file immagine in una cartella parallela e regolare i percorsi. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Dopo la conversione, il Markdown farà riferimento alle immagini come `![Alt text](images/picture.png)`. Questo approccio funziona bene quando in seguito **salvi html come markdown** in un generatore di siti statici che si aspetta le risorse in una cartella dedicata. + +## Script completo da copiare‑incollare + +Di seguito trovi lo script completo, eseguibile, che incorpora tutti i passaggi discussi. Salvalo come `convert_html_to_md.py` ed eseguilo con `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Output previsto + +Eseguendo lo script stampa un messaggio di conferma seguito dalle prime dieci righe del file Markdown, come mostrato in precedenza. Il `output.md` generato può essere aperto in qualsiasi editor di testo, visualizzato in VS Code o inserito in un repository Git. + +## Domande comuni e gestione dei casi limite + +| Question | Answer | +|----------|--------| +| **Cosa succede se il file HTML è grande (> 10 MB)?** | La classe `HTMLDocument` esegue lo streaming dell'input, quindi l'uso della memoria rimane moderato. Tuttavia, considera di aumentare il limite di memoria del processo Python se incontri `MemoryError`. | +| **Posso convertire una stringa HTML invece di un file?** | Sì. Usa `HTMLDocument.from_string(html_string)` (o il costruttore equivalente) prima di chiamare `Converter.convert_html`. | +| **Come posso mantenere i commenti HTML originali?** | Imposta `md_options.preserve_comments = True`. I commenti appariranno come commenti HTML (`<!-- … -->`) all'interno del file Markdown. | +| **È possibile puntare a un dialetto Markdown diverso?** | Modifica `md_options.formatter` in `"COMMONMARK"` o `"MARKDOWN_EXTRA"` a seconda della piattaforma di destinazione. | +| **Devo installare .NET runtime separatamente?** | Il pacchetto `aspose-html` include il runtime necessario per la maggior parte delle piattaforme. Su Linux, assicurati che `libgdiplus` sia installato (`sudo apt-get install libgdiplus`). | + +## Conclusione + +Ora sai come **convertire HTML in Markdown** usando Python, come **salvare html come markdown**, e come **generare markdown da html** con controllo dettagliato su formattazione e risorse. Lo script dimostra l'intero flusso di lavoro—dal caricamento del file sorgente alla produzione di un pulito *html to markdown file* pronto per il controllo di versione o la pubblicazione. + +Successivamente, esplora argomenti correlati come **convertire in batch più file HTML**, integrare il passaggio di conversione in una pipeline CI/CD, o personalizzare l'output Markdown per generatori di siti statici specifici come Hugo o Jekyll. Sperimenta con le varie impostazioni di `MarkdownSaveOptions` per adattare il risultato alla guida di stile del tuo progetto. + +Buona conversione! + +## Cosa dovresti imparare dopo? + +I seguenti tutorial coprono argomenti strettamente correlati che si basano sulle tecniche dimostrate in questa guida. Ogni risorsa include esempi di codice completi e funzionanti con spiegazioni passo‑passo per aiutarti a padroneggiare funzionalità API aggiuntive ed esplorare approcci di implementazione alternativi nei tuoi progetti. + +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/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/italian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/italian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..1e50d994ec --- /dev/null +++ b/html/italian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Come abilitare le funzionalità durante la conversione da HTML a Markdown + usando Python. Impara a convertire un documento HTML e a salvare l'HTML come Markdown + con un controllo preciso delle funzionalità. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: it +lastmod: 2026-09-19 +og_description: Come abilitare le funzionalità durante la conversione da HTML a Markdown. + Questa guida ti mostra passo passo come convertire un documento HTML e salvare l'HTML + come Markdown con un controllo dettagliato. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Come abilitare le funzionalità durante la conversione da HTML a Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Come abilitare le funzionalità durante la conversione da HTML a Markdown +url: /it/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Come abilitare le funzionalità durante la conversione da HTML a Markdown + +Se hai bisogno di **how to enable features** durante una conversione, questa guida ti offre una soluzione completa e eseguibile. Vedrai esattamente come convertire HTML in Markdown, controllare quali funzionalità Markdown vengono generate e salvare l'HTML come Markdown in un unico passaggio. + +L'esempio utilizza il popolare **GroupDocs.Conversion** Python SDK, ma i concetti si applicano a qualsiasi libreria che consenta di configurare set di funzionalità. Alla fine di questo tutorial potrai convertire un documento HTML, mantenere solo link e paragrafi, ed evitare tabelle, immagini o blocchi di codice indesiderati. + +## Cosa otterrai + +* **how to enable features** nelle opzioni di salvataggio Markdown +* un chiaro flusso di lavoro **convert html to markdown** +* la capacità di **how to convert html** con output selettivo +* uno script pronto‑all'uso che **convert html document** e **save html as markdown** + +### Prerequisiti + +* Python 3.8+ installato +* `groupdocs-conversion` package (install with `pip install groupdocs-conversion`) +* Un file HTML di esempio (`sample.html`) in una directory nota + +--- + +## Come abilitare le funzionalità nella conversione Markdown + +Il primo passo è creare un oggetto `MarkdownSaveOptions` e indicare al convertitore quali elementi conservare. In questa guida abilitiamo solo **links** e **paragraphs**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Perché funziona:** +* `HTMLDocument` avvolge il file sorgente in modo che il convertitore possa leggerlo. +* `MarkdownSaveOptions` contiene tutte le impostazioni di conversione; la lista `features` è la proprietà chiave che **how to enable features**. +* Assegnando `["Link", "Paragraph"]` si indica al motore di generare solo link Markdown (`[text](url)`) e paragrafi semplici, scartando immagini, tabelle e altri markup. +* `Converter.convert_html` esegue l'operazione reale **convert html to markdown** e scrive il risultato in `sample.md`. + +--- + +## Come convertire un documento HTML con opzioni personalizzate + +Se in seguito hai bisogno di aggiungere altri flag di funzionalità—come `"Header"` o `"Bold"`—basta estendere la lista: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +La stessa chiamata a `Converter.convert_html` includerà ora quegli elementi aggiuntivi. Questo modello ti consente di **how to convert html** in modo altamente configurabile senza scrivere parser personalizzati. + +--- + +## Come salvare HTML come Markdown in una cartella specifica + +Il metodo `convert_html` accetta un percorso di output assoluto o relativo. Per **save html as markdown** in una sottocartella chiamata `output`, regola il terzo argomento: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Eseguendo lo script si crea la directory `output` (se non esiste) e vi si scrive il file Markdown. Questo approccio mantiene ordinati il tuo HTML di origine e il Markdown generato. + +--- + +## Script completo da copiare‑incollare + +Di seguito trovi l'intero programma, pronto per l'esecuzione. Sostituisci `YOUR_DIRECTORY` con il percorso che contiene `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Output previsto** (stampato sulla console): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Apri `sample.md` e vedrai solo link Markdown e paragrafi semplici, ad esempio: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Tutti gli altri elementi HTML sono stati omessi perché **how to enable features** ha limitato l'output ai due tipi selezionati. + +--- + +## Domande comuni e casi particolari + +| Domanda | Risposta | +|----------|--------| +| *Cosa succede se il file HTML non contiene link?* | Il convertitore scrive comunque i paragrafi; l'output conterrà testo semplice senza sintassi dei link. | +| *Posso disabilitare tutte le funzionalità?* | Impostando `markdown_options.features = []` si ottiene un file Markdown vuoto. Usa questa opzione solo per test. | +| *Come gestisce l'SDK l'HTML non valido?* | Il parser tenta di pulire il markup malformato prima di applicare il filtro delle funzionalità. Gli errori vengono registrati ma non interrompono la conversione. | +| *È possibile mantenere le immagini eliminando le tabelle?* | Sì. Imposta `markdown_options.features = ["Link", "Paragraph", "Image"]`. L'elenco delle funzionalità è additivo, non esclusivo. | +| *Cosa fare se devo convertire molti file in una cartella?* | Avvolgi la logica di conversione in un ciclo che itera su `Path.glob("*.html")`. La stessa **how to enable features** configurazione può essere riutilizzata per ogni file. | + +**Suggerimento professionale:** Quando si elaborano grandi lotti, istanziare `MarkdownSaveOptions` una sola volta e riutilizzarlo. Questo riduce il sovraccarico di creazione degli oggetti e mantiene veloce la pipeline **convert html to markdown**. + +--- + +## Conclusione + +Ora sai **how to enable features** quando **convert html to markdown**, come **how to convert html** con output selettivo, e come **convert html document** e **save html as markdown** usando uno script Python conciso. Configurando `MarkdownSaveOptions.features`, ottieni il pieno controllo sugli elementi Markdown che compaiono nel file finale. + +### Prossimi passi + +* Esplora flag di funzionalità aggiuntivi come `"Header"`, `"Bold"` e `"Italic"` per arricchire l'output Markdown. +* Combina questo script con un file‑watcher (ad esempio `watchdog`) per convertire automaticamente i nuovi file HTML man mano che arrivano. +* Consulta la [documentazione del GroupDocs.Conversion Python SDK](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) per scenari avanzati come conversioni da PDF a Markdown o da DOCX a HTML. + +Sentiti libero di sperimentare con diversi set di funzionalità e condividi i tuoi risultati con la community. Buona conversione! + +## Cosa dovresti imparare dopo? + +I tutorial seguenti coprono argomenti strettamente correlati che si basano sulle tecniche dimostrate in questa guida. Ogni risorsa include esempi di codice completi e funzionanti con spiegazioni passo‑passo per aiutarti a padroneggiare funzionalità API aggiuntive ed esplorare approcci di implementazione alternativi nei tuoi progetti. + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/italian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/italian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..a9927a7bba --- /dev/null +++ b/html/italian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,246 @@ +--- +category: general +date: 2026-09-19 +description: Scopri come limitare le risorse annidate in Aspose.HTML per Python usando + ResourceHandlingOptions. Controlla la profondità massima di gestione ed evita loop + infiniti. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: it +lastmod: 2026-09-19 +og_description: Limita le risorse annidate in Aspose.HTML per Python usando ResourceHandlingOptions. + Imposta la profondità massima di gestione per prevenire ricorsioni profonde e migliorare + le prestazioni. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Come limitare le risorse annidate in Aspose.HTML per Python – guida passo + passo +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Come limitare le risorse nidificate durante l'elaborazione di HTML con Aspose.HTML + per Python +url: /it/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Come limitare le risorse nidificate durante l'elaborazione di HTML con Aspose.HTML per Python + +Se hai bisogno di **limitare le risorse nidificate** durante il rendering o la conversione di HTML, questa guida mostra i passaggi esatti per configurare Aspose.HTML per Python. Controllare la profondità della gestione delle risorse impedisce ricorsioni incontrollate quando una pagina include molti livelli di riferimenti a CSS, JavaScript o immagini. + +Limitare le risorse nidificate è particolarmente importante per crawler su larga scala, pipeline di rendering di email o qualsiasi flusso di lavoro automatizzato che deve rimanere entro limiti di memoria e tempo. Nelle sezioni seguenti imparerai perché impostare un limite di profondità, come utilizzare la classe `ResourceHandlingOptions` e come verificare che il limite funzioni come previsto. + +## Perché dovresti limitare le risorse nidificate + +I documenti HTML spesso fanno riferimento ad altre risorse—fogli di stile, script, immagini, font o anche altri file HTML. Ognuna di queste risorse può, a sua volta, fare riferimento a file aggiuntivi, formando un albero di dipendenze. Senza una guardia, l'albero può diventare arbitrariamente profondo: + +* Una pagina carica un file CSS che importa un altro file CSS, che ne importa un altro, e così via. +* JavaScript può caricare dinamicamente script aggiuntivi. +* Un modello di email può incorporare immagini che fanno riferimento a URL esterni che reindirizzano a ulteriori asset. + +Quando la profondità della ricorsione cresce senza controllo, rischi di: + +* **Consumo eccessivo di memoria** – ogni risorsa recuperata occupa buffer. +* **Tempi di elaborazione più lunghi** – la latenza di rete si moltiplica a ogni livello. +* **Possibili loop infiniti** – riferimenti circolari possono far sì che il motore non ritorni mai. + +Impostare una **profondità massima di gestione** dice ad Aspose.HTML di smettere di seguire i collegamenti alle risorse dopo un certo numero di livelli, garantendo prestazioni prevedibili. + +## Come limitare le risorse nidificate in Aspose.HTML per Python + +Aspose.HTML fornisce la classe `ResourceHandlingOptions`, che contiene la proprietà `max_handling_depth`. Assegnando un valore numerico (ad esempio `3`), istruisci il motore a fermarsi dopo tre livelli nidificati. + +Di seguito trovi un esempio completo e eseguibile che dimostra l'intero flusso di lavoro: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Spiegazione di ogni passaggio + +1. **Installa il pacchetto** – È necessario il wheel `aspose-html`. Il comando `pip install` è mostrato come commento per completezza. +2. **Importa le classi** – `HtmlDocument` carica la pagina, `ResourceHandlingOptions` contiene il limite e `HtmlLoadOptions` collega i due. +3. **Crea l'oggetto delle opzioni** – L'istanziazione di `ResourceHandlingOptions` ti fornisce un contenitore mutabile. +4. **Imposta `max_handling_depth`** – Assegna `3` (o qualsiasi intero) per limitare il motore a tre livelli di risorse nidificate. Questo è il cuore del **limit nested resources**. +5. **Allega le opzioni alla configurazione di caricamento** – `HtmlLoadOptions` ti permette di passare `resource_options` al loader. +6. **Carica l'HTML** – Il costruttore di `HtmlDocument` accetta un URL o un percorso file insieme a `load_options`. Il motore ora rispetta il limite di profondità. +7. **Verifica** – Iterando su `document.resources`, puoi vedere quante risorse sono state effettivamente recuperate e il livello più profondo incontrato. Se il livello più profondo è `3` o inferiore, il limite ha avuto successo. +8. **Salva** – Persiste il documento elaborato. Il file salvato contiene solo le risorse fino alla profondità consentita. + +#### Output previsto + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +I numeri varieranno a seconda della pagina di origine, ma il livello più profondo non dovrebbe mai superare `3` perché abbiamo impostato `max_handling_depth = 3`. + +## Varianti comuni e casi limite + +### Modificare il limite di profondità + +Potresti aver bisogno di un limite più profondo o più superficiale in base al tuo ambiente: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Disabilitare completamente il limite + +Impostare la proprietà a `0` dice ad Aspose.HTML di **rimuovere qualsiasi restrizione di profondità**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Fallo solo quando sei certo che l'HTML di origine sia ben comportato. + +### Gestire riferimenti circolari + +Anche con un limite di profondità, i riferimenti circolari possono comunque apparire allo stesso livello. Aspose.HTML rileva i cicli e interrompe il caricamento di una risorsa già processata, indipendentemente dall'impostazione di profondità. Tuttavia, impostare un `max_handling_depth` più basso riduce la probabilità di incontrare un ciclo in primo luogo. + +### Utilizzare il limite con file locali + +Lo stesso approccio funziona per file HTML locali: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +Il motore tratta gli attributi `href` o `src` relativi allo stesso modo degli URL remoti, applicando il limite di profondità anche alle risorse del file system. + +### Integrazione con altre funzionalità di Aspose.HTML + +Se devi anche controllare il **timeout di download delle risorse**, puoi combinare `ResourceHandlingOptions` con `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Entrambe le opzioni sono indipendenti, così puoi affinare prestazioni e sicurezza simultaneamente. + +## Consigli pratici per l'uso in produzione + +* **Registra l'albero delle risorse** – In fase di debug, itera su `document.resources` e registra l'URL e la profondità di ciascuna risorsa. Questo ti aiuta a capire perché una pagina supera le tue aspettative. +* **Cache delle risorse recuperate** – Se elabori gli stessi asset esterni più volte, abilita il caching per evitare chiamate di rete ridondanti. +* **Combina con una whitelist** – Se solo certi domini sono considerati affidabili, filtra `document.resources` dopo il caricamento e scarta quelli fuori dalla whitelist. +* **Testa con pagine edge‑case** – Crea un file HTML sintetico che importa una catena di 10 file CSS. Verifica che il tuo limite tronchi la catena come previsto. + +## Conclusione + +Ora sai come **limitare le risorse nidificate** in Aspose.HTML per Python configurando `ResourceHandlingOptions.max_handling_depth`. Impostare un limite di profondità protegge la tua applicazione da un uso eccessivo della memoria, tempi di elaborazione lunghi e potenziali loop infiniti causati da riferimenti a risorse profondamente nidificate o circolari. + +Da questo punto puoi: + +* Regolare la profondità per adattarla al tuo budget di prestazioni (`resource_handling_options.max_handling_depth`). +* Combinare il limite con timeout di rete, caching o whitelist di dominio per pipeline robuste. +* Esplorare argomenti correlati come **resource handling options**, **max handling depth** e **nested resource handling** per affinare ulteriormente il controllo sull'elaborazione di HTML. + +Sperimenta con valori di profondità diversi e osserva come cambia il conteggio delle risorse caricate. Quando sei pronto, integra questo pattern nel tuo servizio più ampio di conversione o rendering HTML per garantire un'esecuzione prevedibile, sicura ed efficiente. + +## Cosa dovresti imparare dopo? + +I tutorial seguenti coprono argomenti strettamente correlati che si basano sulle tecniche dimostrate in questa guida. Ogni risorsa include esempi di codice completi e funzionanti con spiegazioni passo‑passo per aiutarti a padroneggiare ulteriori funzionalità dell'API e a esplorare approcci alternativi nei tuoi progetti. + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/italian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/italian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..c6c081a300 --- /dev/null +++ b/html/italian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,261 @@ +--- +category: general +date: 2026-09-19 +description: Impara un tutoriale HTML‑to‑PDF in Python che mostra come generare PDF + da HTML rapidamente con Aspose.HTML. Segui subito la guida passo‑passo. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: it +lastmod: 2026-09-19 +og_description: 'tutorial html to pdf: Converti qualsiasi pagina HTML in un file PDF + usando Python e Aspose.HTML. Questa guida mostra come generare PDF da HTML in pochi + minuti.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Tutorial da HTML a PDF in Python – guida completa passo passo +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Come eseguire un tutorial da HTML a PDF usando Python +url: /it/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Come eseguire un tutorial html to pdf usando Python + +Se ti serve un **html to pdf tutorial**, questa guida ti mostra esattamente come generare un PDF da HTML con poche righe di codice Python. Che tu stia automatizzando la creazione di report o esportando contenuti web per la lettura offline, la libreria Aspose.HTML rende la conversione indolore. + +In questo tutorial imparerai a configurare l'ambiente, scrivere lo script di conversione e gestire casi particolari comuni come file mancanti o impostazioni di pagina personalizzate. Alla fine saprai **come generare pdf** da qualsiasi sorgente HTML senza uscire dall'ecosistema Python. + +## Cosa ti serve + +Prima di iniziare, assicurati di avere: + +* Python 3.8 o versioni successive installato +* Una licenza attiva di Aspose.HTML per Python (una prova gratuita è sufficiente per la valutazione) +* Accesso a `pip` per installare il pacchetto `aspose-html` +* Un semplice file HTML da convertire (ad es., `input.html`) + +> **Consiglio professionale:** Tieni il tuo HTML e le risorse (immagini, CSS) nella stessa cartella per evitare problemi di risoluzione dei percorsi durante la conversione. + +## Passo 1: Installa il pacchetto Aspose.HTML + +Apri un terminale ed esegui il comando seguente: + +```bash +pip install aspose-html +``` + +Il wheel `aspose-html` include le librerie native necessarie per il rendering ad alta qualità, quindi non sono richieste dipendenze di sistema aggiuntive. + +## Passo 2: Crea uno script Python minimale + +Crea un nuovo file chiamato `convert_html_to_pdf.py` e incolla il codice qui sotto. Questo script segue il modello **html to pdf tutorial** a tre passaggi: import, definizione dei percorsi e invocazione della conversione. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Perché funziona + +* **Importare `Converter`** ti dà accesso a un'API di alto livello che astrae il motore di rendering. +* **Definire percorsi assoluti** evita bug legati ai percorsi relativi quando lo script viene eseguito da una directory di lavoro diversa. +* **`Converter.convert_html`** esegue l'intera pipeline di rendering — parsing HTML, layout CSS e serializzazione PDF — in una sola chiamata, il modo consigliato per **come generare pdf** rapidamente. + +## Passo 3: Esegui lo script e verifica l'output + +Esegui lo script dal terminale: + +```bash +python convert_html_to_pdf.py +``` + +Se tutto è configurato correttamente, vedrai: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Apri `output.pdf` con qualsiasi visualizzatore PDF. Il documento dovrebbe apparire identico alla pagina HTML originale, includendo caratteri, immagini e lo styling CSS di base. + +![Generated PDF preview](https://example.com/images/pdf-preview.png "Screenshot di un PDF generato da un file HTML usando Python"){: .center-image alt="Screenshot di un PDF generato da un file HTML usando Python"} + +## Passo 4: Personalizzare la conversione (opzionale) + +Il **html to pdf tutorial** di base copre una conversione uno‑a‑uno, ma scenari reali spesso richiedono aggiustamenti: + +| Requisito | Come ottenerlo con Aspose.HTML | +|-----------|--------------------------------| +| Impostare la dimensione della pagina (A4, Letter) | Passare un oggetto `PdfSaveOptions` a `convert_html` | +| Aggiungere margini o intestazioni/piè di pagina | Usare `PdfPageSettings` all'interno delle opzioni | +| Incorporare font personalizzati | Assicurarsi che i file dei font siano raggiungibili e impostare `FontSettings` | + +Di seguito un esempio che imposta la dimensione della pagina su A4 e aggiunge un margine di 1 pollice: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Nota:** L'uso di opzioni personalizzate è la tecnica preferita per **generare pdf da html** quando è necessario un controllo preciso sul layout. + +## Passo 5: Gestire più file HTML (conversione batch) + +Se hai una cartella piena di report HTML, puoi iterare su di essi: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Questo frammento dimostra un flusso di lavoro **python convert html pdf** scalabile, adatto a pipeline CI o job programmati. + +## Problemi comuni e come evitarli + +| Problema | Causa | Soluzione | +|----------|-------|-----------| +| Immagini mancanti nel PDF | Percorsi immagine relativi che si rompono quando lo script è eseguito da una cartella diversa | Usare percorsi assoluti o impostare `base_uri` nelle opzioni di `Converter` | +| CSS non applicato | Foglio di stile esterno referenziato con URL che richiede accesso a Internet | Scaricare il foglio di stile localmente e referenziarlo con un percorso relativo | +| Sostituzione dei font | Font non installato sulla macchina host | Includere il file del font nel progetto e configurare `FontSettings` | + +Affrontare questi casi limite garantisce che il tuo processo **esportare html come pdf** sia solido in tutti gli ambienti. + +## Esempio completo e eseguibile + +Di seguito lo script completo che include impostazioni opzionali, gestione degli errori e logica di elaborazione batch. Copialo in `full_html_to_pdf.py` ed eseguilo come mostrato in precedenza. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +L'esecuzione di questo script produce un PDF per ogni file HTML nella directory di destinazione, applicando impostazioni di pagina coerenti — una soluzione **python convert html pdf** pronta per la produzione. + +## Conclusione + +Ora disponi di un pratico **html to pdf tutorial** che mostra come generare file PDF da HTML usando Python e Aspose.HTML. La guida ha coperto la configurazione dell'ambiente, uno script di conversione minimale, personalizzazioni opzionali, elaborazione batch e suggerimenti di risoluzione dei problemi. + +Da qui puoi approfondire argomenti correlati come **come generare pdf** con filigrane, unire più PDF o convertire HTML in altri formati come DOCX. Sperimenta con l'API `PdfSaveOptions` per perfezionare l'output e integra lo script in servizi web o pipeline di reporting automatizzate. + +Buon coding e divertiti a trasformare i tuoi contenuti HTML in PDF di alta qualità! + +## Cosa dovresti imparare dopo? + +I tutorial seguenti trattano argomenti strettamente correlati che si basano sulle tecniche dimostrate in questa guida. Ogni risorsa include esempi di codice completi e funzionanti con spiegazioni passo‑passo per aiutarti a padroneggiare funzionalità aggiuntive dell'API e a esplorare approcci di implementazione alternativi nei tuoi progetti. + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [How to Convert HTML to PDF Java – Using Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/japanese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/japanese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..91144b1fb2 --- /dev/null +++ b/html/japanese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,258 @@ +--- +category: general +date: 2026-09-19 +description: PythonでHTMLファイルのタイトルを変更する方法を学びましょう。このガイドでは、HTMLの読み込み、titleタグの更新、そして変更後のHTMLの保存について解説します。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: ja +lastmod: 2026-09-19 +og_description: PythonでHTMLファイルのタイトルを変更する方法。HTMLを読み込み、titleタグを更新し、変更されたドキュメントを保存する完全な例をご覧ください。 +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Python を使って HTML ファイルのタイトルを変更する方法 – ステップバイステップガイド +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Python を使って HTML ファイルのタイトルを変更する方法 +url: /ja/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# PythonでHTMLファイルのタイトルを変更する方法 + +HTMLドキュメントの **タイトルの変更方法** をプログラムで行いたい場合、Pythonなら簡単に実装できます。このチュートリアルでは、HTMLファイルを読み込み、`<title>` 要素を更新し、変更後のHTMLをディスクに保存する手順を、実行可能なコードとともに解説します。 + +ページタイトルの変更は、静的サイトを生成したり、スクレイピングしたページをカスタマイズしたり、SEO の自動更新を行う際に頻繁に行われます。このガイドを終える頃には、**HTML タイトルの更新**、**PythonでHTMLを読む**、そして **変更したHTMLを安全に保存** する方法が身についているはずです。 + +## 前提条件 + +開始する前に、以下が揃っていることを確認してください。 + +- Python 3.8 以上がインストールされていること +- `beautifulsoup4` パッケージ(`pip install beautifulsoup4`) +- 編集したい HTML ファイル(例では任意のフォルダーにある `index.html` を使用) + +外部サービスは不要で、すべてローカルで実行できます。 + +## 手順 1: PythonでHTMLファイルを読み込む + +最初のタスクは **PythonでHTMLファイルを読み込む** ことです。`BeautifulSoup` を使うと、多少不完全なマークアップでも寛容にパースできます。 + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*このステップが重要な理由:* +`BeautifulSoup` はツリー構造を構築し、文字列操作をせずに要素の検索や変更が可能になります。組み込みの `html.parser` は高速で、追加のバイナリも不要です。 + +## 手順 2: `<title>` 要素を取得する + +HTML 文書は通常、`<head>` 内に 1 つの `<title>` タグを持ちます。最初に見つかったものを取得すれば、**HTML タイトルの更新** 要件を満たせます。 + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*`None` をチェックする理由:* +HTML の一部断片にはタイトルが含まれないことがあります。自動で追加しておくと、後続のエラーを防ぎ、スクリプトの堅牢性が向上します。 + +## 手順 3: タイトルテキストを変更する + +ここで **HTML タイトルを更新** し、タグの文字列に新しいテキストを代入します。これが **タイトルの変更方法** の核心です。 + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +`string` 属性は `<title>` 内のテキストノードを表します。上書きすることで、メモリ上の DOM が更新されます。 + +## 手順 4: 変更後のHTMLを保存する + +最後に、変更されたドキュメントを新しいファイルに書き出します。これで **変更したHTMLの保存** が完了し、元のファイルはそのまま残ります。 + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` はインデント付きで出力を整形し、変更後のファイルを読みやすくします。 + +### 期待される出力 + +サンプルの `index.html`(元の内容は以下)でスクリプトを実行すると、コンソール出力は次のようになります。 + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +保存された `index_modified.html` の冒頭は次のようになります。 + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## すぐにコピー&ペーストできる完全スクリプト + +以下は 4 つの手順をすべて組み合わせた、実行可能な完全プログラムです。`change_title.py` として保存し、`YOUR_DIRECTORY` を適切に設定してください。 + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +スクリプトを実行: + +```bash +python change_title.py +``` + +コンソールメッセージとともに、タイトルが更新された新しい `index_modified.html` が生成されます。 + +## 追加のヒントとエッジケース + +| 状況 | 対処方法 | +|-----------|------------| +| **複数の `<title>` タグがある** | `soup.find_all("title")` はリストを返すので、最初の要素を更新するか、すべて変更したい場合はループで処理します。 | +| **エンコーディングの問題** | BOM がある場合は `encoding="utf-8-sig"` で開くか、`chardet` でエンコーディングを検出します。 | +| **大容量のHTMLファイル** | パフォーマンス向上のため `lxml` パーサー (`BeautifulSoup(html_content, "lxml")`) を使用します。 | +| **元のフォーマットを保持したい** | 正確な空白を保ちたい場合は `prettify()` の代わりに `str(soup)` を書き出します。 | +| **多数のファイルを自動処理** | ロジックを関数化し、`Path.rglob("*.html")` でループ処理します。 | + +これらのバリエーションは、**タイトルの変更方法** のコアロジックを保ちつつ、実務での様々なケースに対応できます。 + +## 結論 + +これで、Python を使って任意の HTML ドキュメントの **タイトルの変更方法** が習得できました。チュートリアルでは、HTML の読み込み、`<title>` タグの取得、テキストの更新、そして **変更したHTMLの安全な保存** までを解説しました。完全スクリプトを活用すれば、静的サイトジェネレータや SEO パイプライン、その他タイトルを動的に変更する自動化タスクに簡単に組み込めます。 + +次は、**PythonでHTMLを読む** 方法でメタタグ抽出を学んだり、**HTMLファイルをPythonで読み込む** テクニックで不正確なマークアップの処理に挑戦してみましょう。バッチ処理でサイト全体のタイトルを一括更新すれば、あなたの新しいスキルは多くのウェブ自動化タスクの基盤となります。コーディングを楽しんでください! + +## 次に学ぶべきこと + +以下のチュートリアルは、本ガイドで示したテクニックを応用した関連トピックを扱っています。各リソースには、完全な動作コード例とステップバイステップの解説が含まれており、API の追加機能を習得したり、独自の実装アプローチを探求したりするのに役立ちます。 + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/japanese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/japanese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..c108258d75 --- /dev/null +++ b/html/japanese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,203 @@ +--- +category: general +date: 2026-09-19 +description: Python と Aspose.HTML を使用してローカルの HTML ファイルを PDF に変換する – 完全なステップバイステップガイドで、HTML + を PDF に変換する Python のオプションもカバーしています。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: ja +lastmod: 2026-09-19 +og_description: Python を使用してローカルの HTML ファイルを PDF に変換します。Aspose.HTML を使った HTML から PDF + への変換方法を学び、フォント埋め込みやエラーハンドリングを含む最適な手法をご紹介します。 +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: PythonでローカルHTMLファイルをPDFに変換する – 完全ガイド +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: PythonでローカルHTMLファイルをPDFに変換する方法 +url: /ja/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# ローカル HTML ファイルを Python で PDF に変換する方法 + +Python プロジェクトで **ローカル HTML ファイルを PDF に変換** したい場合、このチュートリアルではすぐに実行できるソリューションを示します。Aspose.HTML ライブラリのセットアップ方法、PDF オプションの設定方法、数行のコードで変換を実行する方法が分かります。また、**convert html to pdf python** のベストプラクティスも解説しているので、コードを自分のワークフローに合わせてカスタマイズできます。 + +以下の手順では、SDK のインストール、保存オプションの準備、一般的な落とし穴の対処、出力の検証まで、必要なすべてをカバーします。記事の最後まで読むと、任意の Python アプリケーションに組み込める再利用可能な関数が手に入ります。 + +## 前提条件 + +開始する前に、以下を確認してください。 + +* Python 3.8 以上がマシンにインストールされていること。 +* 有効な Aspose.HTML for Python ライセンス(評価用の無料トライアルでも可)。 +* PDF に変換したいローカル HTML ファイル(例: `page.html`)。 + +追加のシステムレベルの依存関係は不要です。SDK には PDF 生成に必要なすべてが同梱されています。 + +## Aspose.HTML パッケージのインストール + +Aspose.HTML SDK は PyPI 経由で配布されています。仮想環境で `pip` を使ってインストールします。 + +```bash +pip install aspose-html +``` + +コマンドを実行するとインストールされたバージョンが表示され、パッケージがインポート可能であることが確認できます。 + +## 手順 1: 必要なクラスをインポート + +変換ワークフローは主に 2 つのクラスに依存します。 + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` は実際の変換を行う静的メソッド `convert_html` を提供します。 +* `PDFSaveOptions` は PDF 出力を細かく調整でき、標準フォントの埋め込みなどが設定可能です。 + +## 手順 2: PDF 保存オプションを作成し、標準フォントの埋め込みを有効化 + +フォントを埋め込むことで、閲覧側にフォントがインストールされていなくても、生成された PDF がすべてのデバイスで同一に表示されます。 + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +`embed_standard_fonts` を `True` に設定することは、ほとんどの本番シナリオで推奨されます。これにより PDF リーダーでのフォント置換警告が回避されます。 + +## 手順 3: 設定したオプションを使って HTML ファイルを PDF に変換 + +次に `Converter.convert_html` を呼び出し、ソース HTML のパス、出力 PDF のパス、そして先ほど作成したオプションオブジェクトを渡します。 + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +変換が成功するとメソッドは `None` を返し、指定した場所に PDF ファイルが生成されます。 + +## 再利用可能な関数での完全例 + +ロジックを関数にまとめることで、複数プロジェクトで簡単に再利用できます。 + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### 関数が役立つ理由 + +* **入力検証** – `FileNotFoundError` により、HTML パスが間違っている場合のデバッグが容易になります。 +* **ディレクトリ自動作成** – `os.makedirs(..., exist_ok=True)` が「ディレクトリが存在しない」エラーを防ぎます。 +* **フォント埋め込みの切替** – 必要なフォントが既に環境にあることが分かっている場合は、埋め込みをオフにしてファイルサイズを小さくできます。 + +## 一般的なエッジケースと対処方法 + +| 状況 | 推奨される対処 | +|-----------|----------------------| +| **HTML に外部 CSS や画像が含まれる** | 絶対 URL を使用するか、リソースを HTML ファイルと同じディレクトリにコピーしてください。Aspose.HTML はブラウザと同様のルールでリソースを取得します。 | +| **大容量 HTML ファイル(>10 MB)** | `pdf_options.memory_limit` を設定してデフォルトのメモリ上限を引き上げ、`OutOfMemoryException` が発生した場合に対処します。 | +| **パスワード保護された PDF が必要** | `convert_html` を呼び出す前に `pdf_options.encryption_details` にユーザーパスワードを設定してください。 | +| **ヘッドレスサーバーで実行** | 追加設定は不要です。SDK は GUI に依存しません。 | + +これらのシナリオに事前に対応しておくことで、予期しないランタイムエラーを防げます。 + +## 変換結果の検証 + +スクリプト実行後、任意のビューア(Adobe Reader、Chrome など)で生成された PDF を開きます。レイアウトが元の HTML と一致し、フォントが正しく埋め込まれていることを確認してください。 + +プログラム上でも、ファイルが存在しサイズが 0 でないことを確認できます。 + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## 本番環境でのプロ向けヒント + +* **バッチ処理** – HTML ファイルのリストをループし、各ファイルに対して `html_to_pdf` を呼び出します。`PDFSaveOptions` のインスタンスを再利用すればオブジェクト生成のオーバーヘッドを削減できます。 +* **ロギング** – Python の `logging` モジュールを組み込んで、変換タイムスタンプや例外情報を記録します。 +* **パフォーマンス** – 多数のファイルを変換する場合は `concurrent.futures.ThreadPoolExecutor` を使って並列実行を検討してください。ただし、SDK は別々の `Converter` 呼び出しに対してのみスレッドセーフである点に留意してください。 + +## 結論 + +これで、Python を使って **ローカル HTML ファイルを PDF に変換** するための完全な本番対応手法が手に入りました。Aspose.HTML のインストール、PDF オプションの設定、一般的なエッジケースの処理、出力の検証という必須ステップを網羅しつつ、**convert html to pdf python** の全体的なワークフローも示しました。 + +ここからは、PDF 暗号化、カスタムページサイズ、透かし追加など、同じ SDK がサポートする高度な機能を探求できます。プロジェクトに最適なオプションを試し、任意の Python 環境で HTML‑to‑PDF 変換を確実に自動化できるようになります。 + +--- + + +## 次に学ぶべきことは? + +以下のチュートリアルは、本ガイドで示した手法に基づく関連トピックを扱っています。各リソースには、ステップバイステップの解説と完全な動作コード例が含まれており、追加の API 機能を習得したり、独自の実装アプローチを検討したりするのに役立ちます。 + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [Convert HTML to PDF in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/japanese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/japanese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..f132acc2a1 --- /dev/null +++ b/html/japanese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,205 @@ +--- +category: general +date: 2026-09-19 +description: PythonでHTMLをMarkdownに変換する方法を学びましょう。このチュートリアルでは、HTMLをMarkdownとして保存し、HTMLからMarkdownを迅速に生成する手順を示します。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: ja +lastmod: 2026-09-19 +og_description: PythonでHTMLをMarkdownに変換する。HTMLをMarkdownとして保存し、HTMLからMarkdownを生成し、HTMLからMarkdownへのファイルを作成する方法をご覧ください。 +og_image_alt: Screenshot showing convert html to markdown script output +og_title: PythonでHTMLをMarkdownに変換する – 完全プログラミングガイド +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: PythonでHTMLをMarkdownに変換する方法 – ステップバイステップガイド +url: /ja/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# PythonでHTMLをMarkdownに変換する方法 – ステップバイステップガイド + +HTMLをMarkdownに**変換**する必要がある場合、このガイドではプロセス全体を順を追って説明します。**HTMLをMarkdownとして保存**する方法、HTMLからMarkdownを生成する方法、そして静的サイトジェネレータやドキュメントパイプライン、プレーンテキストのマークアップを好むあらゆるワークフローで使用できる*html to markdown file*の作成方法をご覧いただけます。 + +本チュートリアルでは、必要なライブラリのインストールから、埋め込み画像やカスタムフォーマットといったエッジケースの処理まで、すべてを網羅しています。最後まで実行できるスクリプトが手に入り、各ステップが重要である理由を明確に理解できるようになります。 + +## Prerequisites + +- Python 3.8以上がマシンにインストールされていること。 +- Pythonスクリプトの基本的な知識があること。 +- ターミナルまたはコマンドプロンプトにアクセスできること。 +- `aspose.html` ライブラリ(または互換性のある HTML‑to‑Markdown パッケージ)。本チュートリアルでは **Aspose.HTML for Python via .NET** を使用しており、コード例に示す `HTMLDocument`、`MarkdownSaveOptions`、`Converter` クラスを提供します。 + +> **Pro tip:** 純粋なPythonソリューションを好む場合、`aspose.html` を `html2text` パッケージに置き換えることができます。全体のフローは同じです。 + +## Step 1: Install the conversion library + +```bash +pip install aspose-html +``` + +このパッケージには、**HTMLからMarkdownを生成**するために必要なネイティブエンジンが同梱されており、迅速かつ高忠実度で変換できます。標準的なブロードバンド接続であれば、インストールは通常1分未満で完了します。 + +## Step 2: Load the source HTML document + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Why this matters:** `HTMLDocument` オブジェクトを作成することで、テーブル、リスト、インラインスタイルといった複雑な構造が変換前に正しく解釈されます。このステップを省略すると、コンバータは生テキストを読み取ることになり、フォーマットが失われる可能性があります。 + +## Step 3: Configure Markdown save options + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +`preserve_links` や `code_block_style` など、他の設定も調整できます。これは、下流ツールで**htmlをmarkdownとして保存**する方法に応じて設定してください。 + +## Step 4: Convert the HTML to Markdown and save the result + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +スクリプトを実行すると、指定したディレクトリに `output.md` という新しいファイルが作成されます。これを開くと、バージョン管理や公開に適した、クリーンなGit互換のMarkdownが確認できます。 + +## Step 5: Verify the generated markdown file + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +簡単なサニティチェックを行うことで、変換が正常に完了し、**html to markdown file** に期待通りの内容が含まれていることを確認できます。 + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +見出しが欠落している、またはリストが正しく形成されていない場合は、**Step 3** に戻り、異なる `formatter` の値(`"COMMONMARK"`、`"MARKDOWN_EXTRA"`)を試してみてください。 + +## Advanced: Handling images and relative paths + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +ソースHTMLに画像が含まれている場合、コンバータはそれらをデータURIとして埋め込むか、元の `src` 属性を保持するかを選択できます。**generate markdown from html** プロセスを軽量に保つため、画像ファイルを平行フォルダにコピーし、パスを調整するとよいでしょう。 + +変換後、Markdownは `![Alt text](images/picture.png)` のように画像を参照します。この方法は、後で静的サイトジェネレータで**htmlをmarkdownとして保存**する際に、アセットが専用フォルダにあることを前提としている場合に有効です。 + +## Full script you can copy‑paste + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +以下は、説明したすべてのステップを組み込んだ完全な実行可能スクリプトです。`convert_html_to_md.py` として保存し、`python convert_html_to_md.py` で実行してください。 + +### Expected output + +スクリプトを実行すると、確認メッセージが表示され、続いてMarkdownファイルの最初の10行が出力されます(前述の通り)。生成された `output.md` は任意のテキストエディタで開くことができ、VS Codeでプレビューしたり、Gitリポジトリにコミットしたりできます。 + +## Common questions and edge‑case handling + +| Question | Answer | +|----------|--------| +| **HTMLファイルが大きい(> 10 MB)場合はどうしますか?** | `HTMLDocument` クラスは入力をストリーミングするため、メモリ使用量は適度に抑えられます。ただし、`MemoryError` が発生した場合は、Pythonプロセスのメモリ上限を増やすことを検討してください。 | +| **ファイルではなくHTML文字列を変換できますか?** | はい。`Converter.convert_html` を呼び出す前に、`HTMLDocument.from_string(html_string)`(または同等のコンストラクタ)を使用してください。 | +| **元のHTMLコメントを保持するには?** | `md_options.preserve_comments = True` を設定します。コメントはMarkdownファイル内でHTMLコメント(`<!-- … -->`)として表示されます。 | +| **別のMarkdown方言を対象にできますか?** | ターゲットプラットフォームに応じて、`md_options.formatter` を `"COMMONMARK"` または `"MARKDOWN_EXTRA"` に変更してください。 | +| **.NETランタイムを別途インストールする必要がありますか?** | `aspose-html` パッケージにはほとんどのプラットフォーム向けに必要なランタイムが同梱されています。Linuxの場合は、`libgdiplus` がインストールされていることを確認してください(`sudo apt-get install libgdiplus`)。 | + +## Conclusion + +Pythonを使用して**HTMLをMarkdownに変換**する方法、**htmlをmarkdownとして保存**する方法、そして**htmlからmarkdownを生成**する際にフォーマットやアセットを細かく制御する方法が分かりました。このスクリプトは、ソースファイルの読み込みからクリーンな*html to markdown file* の生成まで、フルワークフローを実演しています。 + +次は、**複数のHTMLファイルをバッチ変換**する方法や、CI/CDパイプラインへの変換ステップの組み込み、HugoやJekyllといった特定の静的サイトジェネレータ向けにMarkdown出力をカスタマイズする方法など、関連トピックを探求してください。さまざまな `MarkdownSaveOptions` 設定を試して、プロジェクトのスタイルガイドに合わせた結果を得られるように実験してみましょう。 + +Happy converting! + +## What Should You Learn Next? + +以下のチュートリアルは、本ガイドで示した手法を基にした、密接に関連するトピックをカバーしています。各リソースには、ステップバイステップの解説と完全な動作コード例が含まれており、追加のAPI機能を習得したり、独自プロジェクトで代替実装アプローチを検討したりするのに役立ちます。 + +- [Aspose.HTML を使用した .NET での HTML から Markdown への変換](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Aspose.HTML for Java での HTML から Markdown への変換](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown から HTML への変換(Java) - 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/japanese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/japanese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..1ff929d386 --- /dev/null +++ b/html/japanese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,218 @@ +--- +category: general +date: 2026-09-19 +description: Python を使用して HTML を Markdown に変換する際に機能を有効にする方法。HTML ドキュメントを変換し、機能を正確に制御しながら + HTML を Markdown として保存する方法を学びましょう。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: ja +lastmod: 2026-09-19 +og_description: HTML を Markdown に変換する際に機能を有効にする方法。このガイドでは、HTML ドキュメントを変換し、細かい制御で HTML + を Markdown として保存する手順をステップバイステップで示します。 +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: HTML を Markdown に変換する際に機能を有効にする方法 +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: HTML を Markdown に変換する際に機能を有効にする方法 +url: /ja/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# HTML を Markdown に変換する際の機能の有効化方法 + +変換中に **how to enable features** が必要な場合、このガイドは完全で実行可能なソリューションを提供します。HTML を Markdown に変換する方法、どの Markdown 機能を出力するかを制御する方法、そして HTML を Markdown として保存する方法を一度の処理で確認できます。 + +この例は人気のある **GroupDocs.Conversion** Python SDK を使用していますが、概念は機能セットを設定できる任意のライブラリに適用できます。本チュートリアルの最後までに、HTML ドキュメントを変換し、リンクと段落だけを残し、不要なテーブル、画像、コードブロックを除外できるようになります。 + +## 本チュートリアルで達成できること + +* Markdown 保存オプションで **how to enable features** +* 明確な **convert html to markdown** ワークフロー +* 選択的出力で **how to convert html** が可能 +* **convert html document** と **save html as markdown** を行う実行可能なスクリプト + +### 前提条件 + +* Python 3.8+ がインストールされていること +* `groupdocs-conversion` パッケージ(`pip install groupdocs-conversion` でインストール) +* 既知のディレクトリにあるサンプル HTML ファイル(`sample.html`) + +--- + +## Markdown 変換で機能を有効化する方法 + +最初のステップは `MarkdownSaveOptions` オブジェクトを作成し、コンバータに保持したい要素を指示することです。このチュートリアルでは **links** と **paragraphs** のみを有効にします。 + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Why this works:** +* `HTMLDocument` はソースファイルをラップし、コンバータが読み取れるようにします。 +* `MarkdownSaveOptions` はすべての変換設定を保持し、`features` リストが **how to enable features** の鍵となるプロパティです。 +* `["Link", "Paragraph"]` を割り当てることで、エンジンは Markdown リンク(`[text](url)`)とプレーンな段落だけを出力し、画像、テーブル、その他のマークアップは破棄されます。 +* `Converter.convert_html` が実際の **convert html to markdown** 操作を実行し、結果を `sample.md` に書き込みます。 + +--- + +## カスタムオプションで HTML ドキュメントを変換する方法 + +後で `"Header"` や `"Bold"` といった追加の機能フラグが必要になった場合は、リストを拡張するだけです: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +同じ `Converter.convert_html` の呼び出しで、これらの追加要素が含まれるようになります。このパターンにより、カスタムパーサーを書かずに **how to convert html** を高度に構成可能な方法で実現できます。 + +--- + +## 特定のフォルダーに HTML を Markdown として保存する方法 + +`convert_html` メソッドは絶対パスまたは相対パスの出力先を受け取ります。`output` というサブフォルダーに **save html as markdown** するには、3 番目の引数を調整します: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +スクリプトを実行すると `output` ディレクトリが(存在しない場合は)作成され、Markdown ファイルがそこに書き込まれます。このアプローチにより、元の HTML と生成された Markdown がきれいに整理されます。 + +--- + +## コピー&ペーストできる完全なスクリプト + +以下はそのまま実行可能な全プログラムです。`YOUR_DIRECTORY` を `sample.html` が格納されているパスに置き換えてください。 + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Expected output** (printed to the console): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +`sample.md` を開くと、たとえば次のように Markdown リンクとプレーンな段落だけが表示されます: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +他のすべての HTML 要素は **how to enable features** によって出力が 2 つの選択されたタイプに限定されたため、省略されています。 + +--- + +## よくある質問とエッジケース + +| Question | Answer | +|----------|--------| +| *HTML ファイルにリンクが全く含まれていない場合は?* | コンバータは段落は引き続き書き出します。出力はリンク構文のないプレーンテキストになります。 | +| *すべての機能を無効にできるか?* | `markdown_options.features = []` と設定すると空の Markdown ファイルが生成されます。テスト目的でのみ使用してください。 | +| *SDK は無効な HTML をどのように処理するか?* | パーサーは機能フィルタを適用する前に不正なマークアップをクリーンアップしようとします。エラーはログに記録されますが、変換は中断されません。 | +| *テーブルは除外しつつ画像は保持できるか?* | はい。`markdown_options.features = ["Link", "Paragraph", "Image"]` と設定します。機能リストは加算的で、排他的ではありません。 | +| *フォルダー内の多数のファイルを変換したい場合は?* | `Path.glob("*.html")` でイテレートするループに変換ロジックをラップします。同じ **how to enable features** 設定を各ファイルで再利用できます。 | + +**Pro tip:** 大量バッチを処理する際は、`MarkdownSaveOptions` を一度だけインスタンス化して再利用してください。これによりオブジェクト生成のオーバーヘッドが削減され、**convert html to markdown** パイプラインが高速化します。 + +--- + +## 結論 + +これで **how to enable features** を使用して **convert html to markdown** する方法、選択的出力で **how to convert html** できる方法、そして簡潔な Python スクリプトで **convert html document** と **save html as markdown** を実行する方法が分かりました。`MarkdownSaveOptions.features` を設定することで、最終ファイルに含める Markdown 要素を完全にコントロールできます。 + +### 次のステップ + +* `"Header"`、`"Bold"`、`"Italic"` などの追加機能フラグを探求し、Markdown 出力を充実させましょう。 +* このスクリプトをファイルウォッチャー(例: `watchdog`)と組み合わせて、新しい HTML ファイルが到着したときに自動変換できるようにします。 +* 詳細なシナリオ(PDF‑to‑Markdown や DOCX‑to‑HTML 変換など)については、[GroupDocs.Conversion Python SDK documentation](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) を確認してください。 + +さまざまな機能セットで実験し、コミュニティと成果を共有してください。変換を楽しんでください! + +## 次に学ぶべきことは? + +以下のチュートリアルは、本ガイドで示した手法を基にした密接に関連するトピックをカバーしています。各リソースには、完全に動作するコード例とステップバイステップの解説が含まれており、追加の API 機能を習得し、独自プロジェクトで代替実装アプローチを探求するのに役立ちます。 + +- [Java 用 Aspose.HTML で HTML を Markdown に変換](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown を HTML に変換(Java) - Aspose.HTML で変換](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [Aspose HTML で JavaScript を有効化 – HTML を読み込みテキスト取得](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/japanese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/japanese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..7d201b75a2 --- /dev/null +++ b/html/japanese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,240 @@ +--- +category: general +date: 2026-09-19 +description: Aspose.HTML for Python の ResourceHandlingOptions を使用して、ネストされたリソースの制限方法を学びましょう。最大処理深度を制御し、無限ループを防止します。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: ja +lastmod: 2026-09-19 +og_description: Aspose.HTML for PythonでResourceHandlingOptionsを使用してネストされたリソースを制限します。最大ハンドリング深度を設定して、深い再帰を防ぎ、パフォーマンスを向上させます。 +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Aspose.HTML for Pythonでネストされたリソースを制限する方法 – ステップバイステップガイド +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Aspose.HTML for PythonでHTMLを処理する際に、ネストされたリソースを制限する方法 +url: /ja/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Aspose.HTML for Python で HTML を処理する際にネストされたリソースを制限する方法 + +HTML をレンダリングまたは変換する際に **ネストされたリソースを制限** したい場合、このガイドでは Aspose.HTML for Python の設定手順を正確に示します。リソース処理の深さを制御することで、CSS、JavaScript、画像参照が多数階層化したページでの無制限な再帰を防止できます。 + +ネストされたリソースの制限は、大規模クローラー、メールレンダリングパイプライン、またはメモリ・時間予算内で動作させる必要がある自動化ワークフローに特に重要です。以下のセクションでは、深さ制限を設定すべき理由、`ResourceHandlingOptions` クラスの使用方法、そして制限が期待通りに機能しているかを検証する方法を学びます。 + +## ネストされたリソースを制限すべき理由 + +HTML ドキュメントはしばしば他のリソース(スタイルシート、スクリプト、画像、フォント、さらには別の HTML ファイル)を参照します。これらのリソースもさらにファイルを参照でき、依存関係のツリーが形成されます。ガードがなければ、このツリーは任意の深さに成長します。 + +* ページが CSS ファイルを読み込み、さらに別の CSS をインポートし、また別の CSS をインポート…という連鎖。 +* JavaScript が動的に追加スクリプトをロードする場合。 +* メールテンプレートが外部 URL を指す画像を埋め込み、その URL がさらに別のアセットへリダイレクトするケース。 + +再帰深度が制御されないと、次のようなリスクが生じます。 + +* **過剰なメモリ消費** – 取得したリソースごとにバッファが確保されます。 +* **処理時間の増大** – ネットワーク遅延がレベルごとに乗算されます。 +* **無限ループの可能性** – 循環参照によりエンジンが終了しなくなることがあります。 + +**最大処理深度** を設定することで、Aspose.HTML は指定したレベル数を超えてリソースリンクの追跡を停止し、予測可能なパフォーマンスを保証します。 + +## Aspose.HTML for Python でネストされたリソースを制限する方法 + +Aspose.HTML には `ResourceHandlingOptions` クラスが用意されており、`max_handling_depth` プロパティで深さを指定できます。数値(例: `3`)を設定すると、エンジンは 3 階層までのネストされたリソースのみを処理します。 + +以下は、全体のワークフローを示す完全な実行可能サンプルです。 + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### 各ステップの説明 + +1. **パッケージのインストール** – `aspose-html` の wheel が必要です。`pip install` コマンドはコメントとして示しています。 +2. **クラスのインポート** – `HtmlDocument` がページを読み込み、`ResourceHandlingOptions` が制限を保持し、`HtmlLoadOptions` が両者を結び付けます。 +3. **オプションオブジェクトの作成** – `ResourceHandlingOptions` をインスタンス化すると、変更可能なコンテナが得られます。 +4. **`max_handling_depth` の設定** – `3`(または任意の整数)を代入して、エンジンを 3 階層に制限します。これが **ネストされたリソースを制限** する核心です。 +5. **ロード設定にオプションを付与** – `HtmlLoadOptions` に `resource_options` を渡すことで、ローダーに制限を適用します。 +6. **HTML のロード** – `HtmlDocument` のコンストラクタは URL またはファイルパスと `load_options` を受け取ります。エンジンは深さ制限を遵守します。 +7. **検証** – `document.resources` を反復処理し、実際に取得されたリソース数と最深レベルを確認します。最深レベルが `3` 以下であれば制限は成功です。 +8. **保存** – 処理後のドキュメントを保存します。保存されたファイルには許可された深さまでのリソースのみが含まれます。 + +#### 期待される出力 + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +ソースページに依存して数値は変わりますが、`max_handling_depth = 3` を設定したため、最深レベルが `3` を超えることはありません。 + +## よくあるバリエーションとエッジケース + +### 深さ制限の変更 + +環境に応じて、より深いまたは浅い制限が必要になることがあります。 + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### 制限を完全に無効化する + +プロパティに `0` を設定すると、Aspose.HTML は **深さ制限を解除** します。 + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +ソース HTML が適切に動作することが確実な場合にのみ使用してください。 + +### 循環参照の取り扱い + +深さ制限があっても、同一レベルで循環参照が発生することがあります。Aspose.HTML はサイクルを検出し、既に処理されたリソースの再読み込みを深さ設定に関係なく停止します。ただし、`max_handling_depth` を低く設定すれば、サイクルに遭遇する可能性自体を減らせます。 + +### ローカルファイルでの使用 + +同様の手法はローカル HTML ファイルでも機能します。 + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +エンジンは相対 `href` や `src` 属性をリモート URL と同様に扱い、ファイルシステム上のリソースにも深さ制限を適用します。 + +### 他の Aspose.HTML 機能との統合 + +**リソースダウンロードのタイムアウト** も制御したい場合は、`ResourceHandlingOptions` と `NetworkOptions` を組み合わせられます。 + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +両オプションは独立しているため、パフォーマンスと安全性を同時に微調整できます。 + +## 本番環境でのプロフェッショナルな活用法 + +* **リソースツリーのログ出力** – デバッグ時に `document.resources` を反復し、各リソースの URL と深さをログに残すと、ページが期待を超える原因が把握しやすくなります。 +* **取得リソースのキャッシュ** – 同一外部アセットを繰り返し処理する場合はキャッシュを有効にし、冗長なネットワーク呼び出しを回避します。 +* **ホワイトリストとの併用** – 信頼できるドメインだけを許可したい場合は、ロード後に `document.resources` をフィルタリングし、ホワイトリスト外のリソースを除外します。 +* **エッジケースページでのテスト** – 10 個の CSS ファイルをチェーンでインポートする合成 HTML を作成し、制限が意図通りにチェーンを切り捨てるか検証します。 + +## 結論 + +`ResourceHandlingOptions.max_handling_depth` を設定することで、Aspose.HTML for Python における **ネストされたリソースの制限** 方法が理解できました。深さ制限を設けることで、過剰なメモリ使用、長時間の処理、深くネストしたまたは循環的なリソース参照による無限ループからアプリケーションを保護できます。 + +これからは次のことが可能です。 + +* パフォーマンス予算に合わせて深さを調整する(`resource_handling_options.max_handling_depth`)。 +* ネットワークタイムアウト、キャッシュ、ドメインホワイトリストと組み合わせて堅牢なパイプラインを構築する。 +* **resource handling options**、**max handling depth**、**nested resource handling** などの関連トピックを探求し、HTML 処理の制御をさらに強化する。 + +さまざまな深さ値で実験し、取得リソース数の変化を観察してください。準備ができたら、このパターンを大規模な HTML 変換またはレンダリングサービスに組み込み、予測可能で安全かつ効率的な実行を実現しましょう。 + +## 次に学ぶべきこと + +以下のチュートリアルは、本ガイドで示した手法に密接に関連するトピックを扱っており、ステップバイステップのコード例と解説が含まれています。これらを活用して、さらに高度な API 機能や代替実装アプローチを習得してください。 + +- [Aspose.HTML for Java のメッセージ処理とネットワーキング](/html/english/java/message-handling-networking/) +- [Aspose.HTML for Java のカスタムスキーマフィルタとメッセージ処理](/html/english/java/custom-schema-message-handling/) +- [Aspose.HTML for Java のデータ処理とストリーム管理](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/japanese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/japanese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..4329387f9d --- /dev/null +++ b/html/japanese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,259 @@ +--- +category: general +date: 2026-09-19 +description: PythonでHTMLからPDFを素早く生成する方法を示す、Aspose.HTMLを使用したHTMLからPDFへのチュートリアルを学びましょう。今すぐステップバイステップのガイドをご確認ください。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: ja +lastmod: 2026-09-19 +og_description: HTMLからPDFへのチュートリアル:Python と Aspose.HTML を使用して任意の HTML ページを PDF ファイルに変換します。このガイドでは、数分で + HTML から PDF を生成する方法を示します。 +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: PythonでHTMLをPDFに変換するチュートリアル – 完全ステップバイステップガイド +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: PythonでHTMLからPDFへのチュートリアルを実行する方法 +url: /ja/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python を使用した HTML から PDF への変換チュートリアル + +**HTML から PDF への変換チュートリアル** が必要な方へ。本ガイドでは、数行の Python コードだけで HTML から PDF を生成する方法を正確に示します。レポート作成の自動化や、オフライン閲覧用に Web コンテンツをエクスポートする場合でも、Aspose.HTML ライブラリを使えば変換はとても簡単です。 + +このチュートリアルでは、環境設定、変換スクリプトの作成、ファイルが見つからない場合やカスタムページ設定といった一般的なエッジケースの処理方法を学びます。最後まで実践すれば、Python のエコシステム内で **HTML から PDF を生成する方法** を習得できます。 + +## 必要なもの + +開始する前に、以下を用意してください。 + +* Python 3.8 以上がインストールされていること +* 有効な Aspose.HTML for Python ライセンス(評価用の無料トライアルでも可) +* `aspose-html` パッケージをインストールできる `pip` 環境 +* 変換したいシンプルな HTML ファイル(例: `input.html`) + +> **プロのコツ:** HTML とアセット(画像、CSS)は同じディレクトリに置いておくと、変換時のパス解決問題を防げます。 + +## 手順 1: Aspose.HTML パッケージをインストール + +ターミナルを開き、次のコマンドを実行します。 + +```bash +pip install aspose-html +``` + +`aspose-html` のホイールには高品質なレンダリングに必要なネイティブライブラリが同梱されているため、追加のシステム依存関係は不要です。 + +## 手順 2: 最小限の Python スクリプトを作成 + +`convert_html_to_pdf.py` という名前の新しいファイルを作成し、以下のコードを貼り付けます。このスクリプトは **HTML から PDF へのチュートリアル** で紹介されている 3 ステップ(インポート、パス定義、変換呼び出し)に従っています。 + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### なぜこの方法が有効なのか + +* **`Converter` のインポート** により、レンダリングエンジンを抽象化したハイレベル API が利用可能になります。 +* **絶対パスの定義** によって、スクリプトが別の作業ディレクトリから実行された場合でも相対パスのバグを防げます。 +* **`Converter.convert_html`** は、HTML の解析、CSS のレイアウト、PDF へのシリアライズという一連のレンダリングパイプラインを 1 回の呼び出しで実行します。これが **PDF を高速に生成する方法** として推奨されています。 + +## 手順 3: スクリプトを実行し、出力を確認 + +ターミナルからスクリプトを実行します。 + +```bash +python convert_html_to_pdf.py +``` + +正しく設定されていれば、次のような出力が表示されます。 + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +`output.pdf` を任意の PDF ビューアで開きます。フォント、画像、基本的な CSS スタイルが元の HTML ページと同一に表示されるはずです。 + +![生成された PDF のプレビュー](https://example.com/images/pdf-preview.png "HTML を Python で PDF に変換したスクリーンショット"){: .center-image alt="HTML ファイルから Python で生成された PDF のスクリーンショット"} + +## 手順 4: 変換のカスタマイズ(任意) + +基本的な **HTML から PDF へのチュートリアル** は 1 対 1 の変換を扱いますが、実務では調整が必要になることが多いです。 + +| 要件 | Aspose.HTML での実現方法 | +|------|--------------------------| +| ページサイズの設定(A4、Letter など) | `convert_html` に `PdfSaveOptions` オブジェクトを渡す | +| マージンやヘッダー/フッターの追加 | オプション内で `PdfPageSettings` を使用 | +| カスタムフォントの埋め込み | フォントファイルへのパスを確保し、`FontSettings` を設定 | + +以下はページサイズを A4、マージンを 1 インチに設定する例です。 + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **注記:** カスタムオプションを使用するのが、レイアウトを正確に制御したい場合の **HTML から PDF を生成するテクニック** として推奨されます。 + +## 手順 5: 複数の HTML ファイルを処理(バッチ変換) + +HTML レポートが多数あるフォルダーがある場合は、次のようにループ処理できます。 + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +このスニペットは、CI パイプラインや定期ジョブに組み込めるスケーラブルな **Python で HTML を PDF に変換** ワークフローを示しています。 + +## よくある落とし穴と回避策 + +| 問題 | 原因 | 対策 | +|------|------|------| +| PDF に画像が表示されない | スクリプト実行時に相対画像パスが壊れる | 絶対パスを使用するか、`Converter` オプションで `base_uri` を設定 | +| CSS が適用されない | 外部スタイルシートが URL で参照され、インターネット接続が必要 | スタイルシートをローカルにダウンロードし、相対パスで参照 | +| フォントが置き換わる | ホストマシンにフォントがインストールされていない | プロジェクトにフォントファイルを含め、`FontSettings` を設定 | + +これらのエッジケースに対処すれば、**HTML を PDF にエクスポート** するプロセスが環境に依存せず堅牢になります。 + +## 完全な実行可能サンプル + +以下は、オプション設定、エラーハンドリング、バッチ処理ロジックをすべて含んだ完全版スクリプトです。`full_html_to_pdf.py` にコピーして、前述の手順と同様に実行してください。 + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +このスクリプトを実行すると、対象ディレクトリ内のすべての HTML ファイルに対して PDF が生成され、ページ設定が一貫して適用されます。これが **Python で HTML を PDF に変換** する本番環境向けのソリューションです。 + +## 結論 + +これで、Python と Aspose.HTML を使用して HTML から PDF を生成する実践的な **HTML から PDF へのチュートリアル** が完成しました。本ガイドでは環境構築、最小限の変換スクリプト、オプションのカスタマイズ、バッチ処理、トラブルシューティングのポイントを網羅しました。 + +ここからは、**PDF に透かしを入れる方法**、複数 PDF の結合、HTML を DOCX など他形式に変換する方法など、関連トピックに挑戦してみてください。`PdfSaveOptions` API を使って出力を微調整し、スクリプトを Web サービスや自動レポートパイプラインに統合すれば、HTML コンテンツを洗練された PDF に変換する作業がさらに快適になります。 + +Happy coding, and enjoy turning your HTML content into polished PDFs! + +## 次に学ぶべきこと + +以下のチュートリアルは、本ガイドで示した手法を基にした、密接に関連するトピックをカバーしています。各リソースには、ステップバイステップの解説と完全なコード例が含まれており、API の追加機能を習得したり、独自プロジェクトで代替実装を検討したりする際に役立ちます。 + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [How to Convert HTML to PDF Java – Using Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/korean/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/korean/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..8566e5608f --- /dev/null +++ b/html/korean/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,262 @@ +--- +category: general +date: 2026-09-19 +description: Python을 사용하여 HTML 파일의 제목을 변경하는 방법을 배웁니다. 이 가이드는 HTML을 읽고, title 태그를 업데이트하며, + 수정된 HTML을 저장하는 과정을 다룹니다. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: ko +lastmod: 2026-09-19 +og_description: Python으로 HTML 파일의 제목을 변경하는 방법. HTML을 읽고, title 태그를 업데이트한 뒤 수정된 문서를 + 저장하는 전체 예제를 따라 보세요. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Python을 사용하여 HTML 파일의 제목을 변경하는 방법 – 단계별 가이드 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Python을 사용하여 HTML 파일의 제목을 변경하는 방법 +url: /ko/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python을 사용하여 HTML 파일의 제목을 변경하는 방법 + +HTML 문서의 **제목을 변경하는 방법**을 프로그래밍으로 처리해야 할 때, Python을 사용하면 작업이 간단합니다. 이 튜토리얼에서는 HTML 파일을 읽고, `<title>` 요소를 업데이트한 뒤, 수정된 HTML을 디스크에 저장하는 과정을 명확하고 실행 가능한 코드와 함께 보여줍니다. + +페이지 제목을 변경하는 것은 정적 사이트를 생성하거나, 스크랩한 페이지를 커스터마이징하거나, SEO 업데이트를 자동화할 때 흔히 수행하는 단계입니다. 이 가이드를 마치면 **html 제목 업데이트**, **python으로 html 읽기**, **수정된 html 저장** 방법을 알게 됩니다. + +## Prerequisites + +시작하기 전에 다음이 준비되어 있는지 확인하세요: + +- Python 3.8 이상 설치 +- `beautifulsoup4` 패키지 (`pip install beautifulsoup4`) +- 편집하려는 HTML 파일 (예제에서는 사용자가 선택한 폴더에 있는 `index.html` 사용) + +외부 서비스는 필요 없으며, 모든 작업은 로컬에서 실행됩니다. + +## Step 1: Load the HTML file with Python + +첫 번째 작업은 **python 스타일로 html 파일 로드**하는 것입니다. `BeautifulSoup`을 사용하면 불완전한 마크업도 관대하게 파싱할 수 있습니다. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*이 단계가 중요한 이유:* +`BeautifulSoup`은 트리 구조를 만들고, 문자열을 직접 다루지 않아도 요소를 조회하고 수정할 수 있게 해줍니다. 내장된 `html.parser`는 빠르고 별도의 바이너리가 필요 없습니다. + +## Step 2: Locate the `<title>` element + +HTML 문서는 일반적으로 `<head>` 안에 하나의 `<title>` 태그를 포함합니다. 우리는 첫 번째 발생을 찾아 **html 제목 업데이트** 요구를 만족시킵니다. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*`None`을 확인하는 이유:* +일부 HTML 조각에는 제목이 없을 수 있습니다. 자동으로 추가하면 이후 오류를 방지하고 스크립트가 견고해집니다. + +## Step 3: Change the title text + +이제 **html 제목 업데이트**를 위해 태그의 문자열에 새 텍스트를 할당합니다. 이것이 **제목을 변경하는 방법**의 핵심 작업입니다. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +`string` 속성은 `<title>` 내부의 텍스트 노드를 나타냅니다. 이를 덮어쓰면 메모리상의 DOM이 업데이트됩니다. + +## Step 4: Save the modified HTML + +마지막으로 변경된 문서를 새 파일에 기록합니다. 이는 **수정된 html 저장** 단계를 완성하고 원본 파일은 그대로 유지합니다. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()`는 들여쓰기를 포함해 출력 형식을 정리해 주므로, 변경 후 파일을 쉽게 읽을 수 있습니다. + +### Expected output + +원본에 다음과 같이 들어 있는 샘플 `index.html`에 스크립트를 실행하면: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +다음과 유사한 콘솔 출력이 나타납니다: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +저장된 `index_modified.html` 파일은 이제 다음과 같이 시작됩니다: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Full script for quick copy‑paste + +아래는 네 단계를 모두 결합한 완전한 실행 가능한 프로그램입니다. `change_title.py`라는 이름으로 저장하고 `YOUR_DIRECTORY`를 필요에 맞게 수정하세요. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +스크립트 실행: + +```bash +python change_title.py +``` + +콘솔 메시지와 함께 업데이트된 제목을 가진 새로운 `index_modified.html` 파일이 생성됩니다. + +## Additional tips and edge cases + +| Situation | What to do | +|-----------|------------| +| **Multiple `<title>` tags** | `soup.find_all("title")`는 리스트를 반환합니다; 첫 번째 요소를 업데이트하거나 모두 변경해야 하면 반복하세요. | +| **Encoding problems** | BOM이 있는 경우 `encoding="utf-8-sig"`로 파일을 열거나 `chardet`으로 인코딩을 감지하세요. | +| **Large HTML files** | 성능이 더 좋은 `lxml` 파서 (`BeautifulSoup(html_content, "lxml")`)를 사용하세요. | +| **Preserving original formatting** | 정확한 공백을 유지해야 하면 `prettify()` 대신 `str(soup)`를 기록하세요. | +| **Automating across many files** | 로직을 함수로 감싸고 `Path.rglob("*.html")`을 순회하세요. | + +이러한 변형을 통해 핵심 **제목을 변경하는 방법** 로직은 유지하면서 실제 프로젝트에 맞게 조정할 수 있습니다. + +## Conclusion + +이제 Python을 사용해 어떤 HTML 문서에서도 **제목을 변경하는 방법**을 알게 되었습니다. 튜토리얼에서는 HTML 읽기, `<title>` 태그 찾기, 텍스트 업데이트, 그리고 **수정된 html 저장**까지 다루었습니다. 전체 스크립트를 활용하면 정적 사이트 생성기, SEO 파이프라인, 혹은 동적 제목 변경이 필요한 모든 자동화 작업에 이 패턴을 쉽게 통합할 수 있습니다. + +다음으로는 **python으로 html 읽기**를 통해 메타 태그를 추출하거나, **python html 파일 로드** 기술을 활용해 손상된 마크업을 처리하는 방법을 살펴보세요. 배치 처리를 시도해 전체 웹사이트의 제목을 일괄 업데이트해 보세요—새로운 스킬이 다양한 웹 자동화 작업의 기반이 될 것입니다. Happy coding! + +## What Should You Learn Next? + +다음 튜토리얼들은 이 가이드에서 시연한 기술을 기반으로 하며, 관련 주제를 깊이 있게 다룹니다. 각 리소스는 완전한 코드 예제와 단계별 설명을 제공해 추가 API 기능을 마스터하고 프로젝트에 다양한 구현 방식을 적용할 수 있도록 돕습니다. + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/korean/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/korean/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..c4a0237836 --- /dev/null +++ b/html/korean/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,204 @@ +--- +category: general +date: 2026-09-19 +description: Python 및 Aspose.HTML을 사용하여 로컬 HTML 파일을 PDF로 변환하기 – 변환 옵션을 포함한 완전한 단계별 + 가이드. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: ko +lastmod: 2026-09-19 +og_description: Python을 사용하여 로컬 HTML 파일을 PDF로 변환합니다. Aspose.HTML를 활용한 HTML을 PDF로 변환하는 + 최적의 방법을 배우고, 글꼴 임베딩 및 오류 처리까지 포함합니다. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Python으로 로컬 HTML 파일을 PDF로 변환하기 – 전체 가이드 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Python으로 로컬 HTML 파일을 PDF로 변환하는 방법 +url: /ko/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 로컬 HTML 파일을 Python으로 PDF 변환하는 방법 + +Python 프로젝트에서 **로컬 HTML 파일을 PDF로 변환**해야 할 경우, 이 튜토리얼은 바로 실행 가능한 솔루션을 제공합니다. Aspose.HTML 라이브러리를 설정하고, PDF 옵션을 구성하며, 몇 줄의 코드만으로 변환을 수행하는 방법을 확인할 수 있습니다. 또한 **convert html to pdf python** 모범 사례를 설명하므로 코드를 자신의 워크플로에 맞게 조정할 수 있습니다. + +아래 단계에서는 SDK 설치, 저장 옵션 준비, 일반적인 함정 처리, 출력 검증 등 필요한 모든 내용을 다룹니다. 기사 끝까지 읽으면 어떤 Python 애플리케이션에도 삽입할 수 있는 재사용 가능한 함수를 얻게 됩니다. + +## 사전 요구 사항 + +시작하기 전에 다음이 준비되어 있는지 확인하세요: + +* 머신에 Python 3.8 이상 설치 +* 활성화된 Aspose.HTML for Python 라이선스 (무료 체험판으로 평가 가능) +* PDF로 변환하려는 로컬 HTML 파일 (예: `page.html`) + +추가적인 시스템 수준 의존성은 필요하지 않으며, SDK에 PDF 생성에 필요한 모든 것이 포함되어 있습니다. + +## Aspose.HTML 패키지 설치 + +Aspose.HTML SDK는 PyPI를 통해 배포됩니다. 가상 환경에서 `pip`으로 설치하세요: + +```bash +pip install aspose-html +``` + +명령을 실행하면 설치된 버전이 출력되어 패키지를 import할 수 있음을 확인합니다. + +## 1단계: 필요한 클래스 가져오기 + +변환 워크플로는 두 개의 주요 클래스를 사용합니다: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter`는 실제 변환을 수행하는 정적 `convert_html` 메서드를 제공합니다. +* `PDFSaveOptions`는 표준 글꼴 임베딩 등 PDF 출력 옵션을 세밀하게 조정할 수 있게 해줍니다. + +## 2단계: PDF 저장 옵션을 만들고 표준 글꼴 임베딩 활성화 + +글꼴을 임베딩하면 뷰어에 해당 글꼴이 로컬에 없더라도 모든 장치에서 생성된 PDF가 동일하게 표시됩니다. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +대부분의 프로덕션 시나리오에서는 `embed_standard_fonts`를 `True`로 설정하는 것이 권장됩니다. 이렇게 하면 PDF 리더에서 글꼴 대체 경고가 사라집니다. + +## 3단계: 구성한 옵션을 사용해 HTML 파일을 PDF로 변환 + +이제 `Converter.convert_html`을 호출하고, 원본 HTML 경로, 대상 PDF 경로, 그리고 앞서 만든 옵션 객체를 전달합니다: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +변환이 성공하면 메서드는 `None`을 반환하고, 지정한 위치에 PDF 파일이 생성됩니다. + +## 재사용 가능한 함수로 전체 예제 만들기 + +논리를 함수로 감싸면 여러 프로젝트에서 쉽게 재사용할 수 있습니다: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### 함수가 도움이 되는 이유 + +* **입력 검증** – `FileNotFoundError`는 HTML 경로가 잘못됐을 때 디버깅을 용이하게 합니다. +* **자동 디렉터리 생성** – `os.makedirs(..., exist_ok=True)`는 “디렉터리가 존재하지 않음” 오류를 방지합니다. +* **글꼴 임베딩 설정 가능** – 대상 환경에 이미 필요한 글꼴이 있다면 파일 크기를 줄이기 위해 임베딩을 끌 수 있습니다. + +## 일반적인 엣지 케이스와 처리 방법 + +| 상황 | 권장 처리 방법 | +|-----------|----------------------| +| **HTML에 외부 CSS 또는 이미지가 포함된 경우** | 절대 URL을 사용하거나 리소스를 HTML 파일 옆에 복사하세요. Aspose.HTML은 브라우저와 동일한 규칙을 따릅니다. | +| **대용량 HTML 파일 (>10 MB)** | `OutOfMemoryException`이 발생하면 `pdf_options.memory_limit`을 설정해 기본 메모리 제한을 늘리세요. | +| **비밀번호 보호 PDF가 필요할 때** | `convert_html` 호출 전에 `pdf_options.encryption_details`에 사용자 비밀번호를 설정하세요. | +| **헤드리스 서버에서 실행** | 추가 설정이 필요 없습니다. SDK는 GUI에 의존하지 않습니다. | + +이러한 시나리오를 미리 고려하면 예기치 않은 런타임 오류를 방지할 수 있습니다. + +## 변환 결과 검증 + +스크립트가 끝난 후, Adobe Reader, Chrome 등任意의 뷰어로 생성된 PDF를 열어보세요. 레이아웃이 원본 HTML과 일치하고, 임베딩된 글꼴이 모두 올바르게 표시되어야 합니다. + +파일 존재 여부와 크기가 0이 아닌지도 프로그래밍적으로 확인할 수 있습니다: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## 프로덕션 사용을 위한 팁 + +* **배치 처리** – HTML 파일 리스트를 순회하면서 `html_to_pdf`를 호출하세요. `PDFSaveOptions` 인스턴스를 하나만 재사용하면 객체 생성 오버헤드를 줄일 수 있습니다. +* **로깅** – Python의 `logging` 모듈을 통합해 변환 타임스탬프와 예외를 기록하세요. +* **성능** – 많은 파일을 변환할 때는 `concurrent.futures.ThreadPoolExecutor`를 사용해 병렬 처리할 수 있지만, SDK는 별도 `Converter` 호출에 대해서만 스레드 안전하다는 점을 기억하세요. + +## 결론 + +이제 Python을 사용해 **로컬 HTML 파일을 PDF로 변환**하는 완전하고 프로덕션 준비가 된 방법을 갖추었습니다. 이 솔루션은 Aspose.HTML 설치, PDF 옵션 구성, 일반적인 엣지 케이스 처리, 출력 검증 등 핵심 단계를 모두 포함하며, **convert html to pdf python** 워크플로 전체를 보여줍니다. + +앞으로 PDF 암호화, 사용자 정의 페이지 크기, 워터마크 추가 등 고급 기능을 탐색할 수 있습니다. 모두 동일한 SDK에서 지원하므로 프로젝트에 가장 적합한 옵션을 실험해 보세요. 이제 어떤 Python 환경에서도 HTML‑to‑PDF 변환을 안정적으로 자동화할 수 있습니다. + +--- + + +## 다음에 배워야 할 내용은? + + +다음 튜토리얼은 이 가이드에서 시연한 기술을 기반으로 하는 밀접한 관련 주제를 다룹니다. 각 리소스는 단계별 설명과 완전한 코드 예제를 제공하여 추가 API 기능을 마스터하고 프로젝트에 다양한 구현 방식을 적용할 수 있도록 돕습니다. + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [Convert HTML to PDF in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/korean/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/korean/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..e1fb4e0d93 --- /dev/null +++ b/html/korean/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,217 @@ +--- +category: general +date: 2026-09-19 +description: Python에서 HTML을 Markdown으로 변환하는 방법을 배웁니다. 이 튜토리얼에서는 HTML을 Markdown으로 저장하고 + HTML에서 Markdown을 빠르게 생성하는 방법을 보여줍니다. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: ko +lastmod: 2026-09-19 +og_description: Python으로 HTML을 Markdown으로 변환하세요. 이 가이드를 따라 HTML을 Markdown으로 저장하고, + HTML에서 Markdown을 생성하며, HTML을 Markdown 파일로 만들 수 있습니다. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Python에서 HTML을 Markdown으로 변환하기 – 완전한 프로그래밍 가이드 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Python으로 HTML을 Markdown으로 변환하는 방법 – 단계별 가이드 +url: /ko/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python으로 HTML을 Markdown으로 변환하는 방법 – 단계별 가이드 + +HTML을 **convert HTML to Markdown**해야 한다면, 이 가이드는 전체 과정을 단계별로 안내합니다. **save HTML as Markdown**하는 방법, HTML에서 Markdown을 생성하고, *html to markdown file*을 만들어 정적 사이트 생성기, 문서 파이프라인, 혹은 일반 텍스트 마크업을 선호하는 모든 워크플로에 사용할 수 있습니다. + +이 튜토리얼은 필수 라이브러리 설치부터 삽입된 이미지와 사용자 지정 포맷과 같은 엣지 케이스 처리까지 모든 내용을 다룹니다. 끝까지 진행하면 바로 실행 가능한 스크립트를 얻고 각 단계가 왜 중요한지 명확히 이해하게 됩니다. + +## 전제 조건 + +- Python 3.8 이상 버전이 머신에 설치되어 있어야 합니다. +- Python 스크립팅에 대한 기본적인 이해. +- 터미널 또는 명령 프롬프트에 접근 가능. +- `aspose.html` 라이브러리(또는 호환 가능한 HTML‑to‑Markdown 패키지). 이 튜토리얼은 **Aspose.HTML for Python via .NET**를 사용하며, 코드 예제에 표시된 `HTMLDocument`, `MarkdownSaveOptions`, `Converter` 클래스를 제공합니다. + +> **Pro tip:** 순수 Python 솔루션을 선호한다면 `aspose.html`을 `html2text` 패키지로 교체할 수 있습니다. 전체 흐름은 동일하게 유지됩니다. + +## Step 1: 변환 라이브러리 설치 + +먼저, `HTMLDocument`, `MarkdownSaveOptions`, `Converter`를 제공하는 라이브러리를 설치합니다. 다음 명령을 실행하세요: + +```bash +pip install aspose-html +``` + +이 패키지는 **generate markdown from html**을 빠르고 높은 정확도로 수행하는 네이티브 엔진을 포함합니다. 일반적인 광대역 연결에서는 설치가 보통 1분 이내에 완료됩니다. + +## Step 2: 원본 HTML 문서 로드 + +HTML 파일을 로드하는 것은 변환 파이프라인에서 첫 번째 구체적인 작업입니다. `HTMLDocument` 클래스는 파일을 파싱하고 메모리 내 DOM을 구축하며, 변환기는 이후 이 DOM을 순회해 Markdown을 생성합니다. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Why this matters:** `HTMLDocument` 객체를 생성함으로써 복잡한 구조—테이블, 리스트, 인라인 스타일—가 변환 전에 올바르게 해석됩니다. 이 단계를 생략하면 변환기가 원시 텍스트를 읽게 되어 포맷이 손실됩니다. + +## Step 3: Markdown 저장 옵션 구성 + +`MarkdownSaveOptions` 객체를 사용하면 출력 포맷을 세밀하게 조정할 수 있습니다. **Git‑flavored Markdown**을 만들려면 `formatter` 속성을 `"GIT"`으로 설정합니다. 이는 GitHub, GitLab, Bitbucket 등에서 사용하는 구문과 일치합니다. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +`preserve_links` 또는 `code_block_style`와 같은 다른 설정도 조정할 수 있으며, 이는 다운스트림 도구에서 **save html as markdown**하는 방식에 따라 달라집니다. + +## Step 4: HTML을 Markdown으로 변환하고 결과 저장 + +문서를 로드하고 옵션을 구성한 뒤, 정적 `convert_html` 메서드를 호출합니다. 이 메서드는 DOM을 읽고 선택한 포맷터를 적용한 뒤 출력 파일을 씁니다. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +스크립트를 실행하면 지정된 디렉터리에 `output.md`라는 새 파일이 생성됩니다. 파일을 열면 버전 관리나 퍼블리싱에 적합한 깔끔한 Git‑compatible Markdown을 확인할 수 있습니다. + +## Step 5: 생성된 markdown 파일 검증 + +간단한 검증을 통해 변환이 성공했는지와 **html to markdown file**에 기대한 내용이 들어있는지 확인할 수 있습니다. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +간단한 HTML 페이지에 대한 일반적인 출력 예시는 다음과 같습니다: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +헤딩이 누락되었거나 리스트가 잘못된 경우, **Step 3**을 다시 확인하고 다른 `formatter` 값(`"COMMONMARK"`, `"MARKDOWN_EXTRA"`)을 실험해 보세요. + +## Advanced: 이미지 및 상대 경로 처리 + +소스 HTML에 이미지가 포함된 경우, 변환기는 이를 데이터 URI로 삽입하거나 원본 `src` 속성을 유지할 수 있습니다. **generate markdown from html** 프로세스를 가볍게 유지하려면 이미지 파일을 별도 폴더에 복사하고 경로를 조정하는 것이 좋습니다. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +변환 후 Markdown은 `![Alt text](images/picture.png)`와 같이 이미지를 참조합니다. 이 방법은 나중에 정적 사이트 생성기에서 **save html as markdown**할 때 자산을 전용 폴더에 두는 경우에 잘 작동합니다. + +## 전체 스크립트 (복사‑붙여넣기 가능) + +아래는 논의된 모든 단계를 포함한 완전한 실행 가능한 스크립트입니다. `convert_html_to_md.py`라는 파일명으로 저장하고 `python convert_html_to_md.py`로 실행하세요. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### 예상 출력 + +스크립트를 실행하면 앞서 보여준 대로 확인 메시지와 Markdown 파일의 처음 10줄이 출력됩니다. 생성된 `output.md`는 모든 텍스트 편집기에서 열 수 있고, VS Code에서 미리 보기하거나 Git 저장소에 커밋할 수 있습니다. + +## 일반적인 질문 및 엣지 케이스 처리 + +| Question | Answer | +|----------|--------| +| **HTML 파일이 큰 경우 (> 10 MB) 어떻게 해야 하나요?** | `HTMLDocument` 클래스는 입력을 스트리밍하므로 메모리 사용량이 적당하게 유지됩니다. 하지만 `MemoryError`가 발생하면 Python 프로세스의 메모리 제한을 늘리는 것을 고려하세요. | +| **파일 대신 HTML 문자열을 변환할 수 있나요?** | 예. `Converter.convert_html`을 호출하기 전에 `HTMLDocument.from_string(html_string)`(또는 동등한 생성자)를 사용하세요. | +| **원본 HTML 주석을 유지하려면 어떻게 해야 하나요?** | `md_options.preserve_comments = True`로 설정합니다. 주석은 Markdown 파일 내에 HTML 주석(`<!-- … -->`) 형태로 나타납니다. | +| **다른 Markdown 방언을 목표로 할 수 있나요?** | 대상 플랫폼에 따라 `md_options.formatter`를 `"COMMONMARK"` 또는 `"MARKDOWN_EXTRA"`로 변경합니다. | +| **.NET 런타임을 별도로 설치해야 하나요?** | `aspose-html` 패키지는 대부분의 플랫폼에 필요한 런타임을 포함합니다. Linux에서는 `libgdiplus`가 설치되어 있는지 확인하세요(`sudo apt-get install libgdiplus`). | + +## 결론 + +이제 Python을 사용해 **convert HTML to Markdown**하는 방법, **save html as markdown**하는 방법, 그리고 포맷과 자산을 세밀하게 제어하며 **generate markdown from html**하는 방법을 알게 되었습니다. 스크립트는 원본 파일 로드부터 버전 관리나 퍼블리싱에 적합한 깔끔한 *html to markdown file*을 생성하는 전체 워크플로를 보여줍니다. + +다음으로 **batch converting multiple HTML files**와 같은 관련 주제를 탐색하고, 변환 단계를 CI/CD 파이프라인에 통합하거나 Hugo 또는 Jekyll과 같은 특정 정적 사이트 생성기에 맞게 Markdown 출력을 커스터마이징해 보세요. 다양한 `MarkdownSaveOptions` 설정을 실험하여 프로젝트 스타일 가이드에 맞게 결과를 조정할 수 있습니다. + +변환을 즐기세요! + +## 다음에 배울 내용은? + +다음 튜토리얼들은 이 가이드에서 보여준 기술을 기반으로 하는 밀접한 관련 주제를 다룹니다. 각 자료는 완전한 코드 예제와 단계별 설명을 포함해 추가 API 기능을 마스터하고 프로젝트에서 대체 구현 방식을 탐색하는 데 도움을 줍니다. + +- [Aspose.HTML을 사용한 .NET에서 HTML을 Markdown으로 변환](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Aspose.HTML for Java에서 HTML을 Markdown으로 변환](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown을 HTML로 변환 Java - 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/korean/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/korean/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..ba43dce5a0 --- /dev/null +++ b/html/korean/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,216 @@ +--- +category: general +date: 2026-09-19 +description: Python을 사용해 HTML을 Markdown으로 변환할 때 기능을 활성화하는 방법. HTML 문서를 변환하고 기능을 정밀하게 + 제어하여 HTML을 Markdown으로 저장하는 방법을 배워보세요. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: ko +lastmod: 2026-09-19 +og_description: HTML을 Markdown으로 변환하면서 기능을 활성화하는 방법. 이 가이드는 HTML 문서를 변환하고 세밀한 제어를 + 통해 HTML을 Markdown으로 저장하는 과정을 단계별로 보여줍니다. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: HTML을 Markdown으로 변환하면서 기능을 활성화하는 방법 +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: HTML을 Markdown으로 변환하면서 기능을 활성화하는 방법 +url: /ko/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# HTML을 Markdown으로 변환하면서 기능 활성화하기 + +변환 중에 **기능 활성화 방법**이 필요하다면, 이 가이드는 완전하고 실행 가능한 솔루션을 제공합니다. HTML을 Markdown으로 변환하는 방법, 어떤 Markdown 기능이 출력되는지 제어하는 방법, 그리고 HTML을 한 번에 Markdown으로 저장하는 방법을 정확히 확인할 수 있습니다. + +예제는 널리 사용되는 **GroupDocs.Conversion** Python SDK를 사용하지만, 개념은 기능 집합을 구성할 수 있는 모든 라이브러리에 적용됩니다. 이 튜토리얼을 마치면 HTML 문서를 변환하고, 링크와 단락만 유지하며, 원하지 않는 표, 이미지 또는 코드 블록을 제외할 수 있습니다. + +## 달성할 내용 + +* **기능 활성화 방법** in the Markdown save options +* a clear **HTML을 Markdown으로 변환** workflow +* the ability to **HTML 변환 방법** with selective output +* a ready‑to‑run script that **HTML 문서 변환** and **HTML을 Markdown으로 저장** + +### 사전 요구 사항 + +* Python 3.8+ 설치됨 +* `groupdocs-conversion` 패키지 (`pip install groupdocs-conversion` 로 설치) +* 알려진 디렉터리에 있는 샘플 HTML 파일 (`sample.html`) + +--- + +## Markdown 변환에서 기능 활성화 방법 + +첫 번째 단계는 `MarkdownSaveOptions` 객체를 생성하고 변환기에 유지하고 싶은 요소를 지정하는 것입니다. 이 튜토리얼에서는 **links**와 **paragraphs**만 활성화합니다. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**왜 이렇게 작동하나요:** +* `HTMLDocument`는 소스 파일을 래핑하여 변환기가 읽을 수 있게 합니다. +* `MarkdownSaveOptions`는 모든 변환 설정을 보관하며, `features` 리스트는 **기능 활성화 방법**의 핵심 속성입니다. +* `["Link", "Paragraph"]`을 할당하면 엔진에 Markdown 링크(`[text](url)`)와 일반 단락만 출력하도록 지시하고, 이미지, 표 및 기타 마크업은 제외합니다. +* `Converter.convert_html`은 실제 **HTML을 Markdown으로 변환** 작업을 수행하고 결과를 `sample.md`에 기록합니다. + +--- + +## 사용자 지정 옵션으로 HTML 문서 변환하기 + +나중에 `"Header"` 또는 `"Bold"`와 같은 추가 기능 플래그가 필요하면 리스트에 확장하기만 하면 됩니다: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +동일한 `Converter.convert_html` 호출은 이제 추가 요소들을 포함합니다. 이 패턴을 사용하면 **HTML 변환 방법**을 매우 구성 가능하게 할 수 있으며, 커스텀 파서를 작성할 필요가 없습니다. + +--- + +## 특정 폴더에 HTML을 Markdown으로 저장하는 방법 + +`convert_html` 메서드는 절대 경로나 상대 경로의 출력 경로를 받습니다. `output`이라는 하위 폴더에 **HTML을 Markdown으로 저장**하려면 세 번째 인수를 조정하세요: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +스크립트를 실행하면 `output` 디렉터리가 (존재하지 않을 경우) 생성되고 그곳에 Markdown 파일이 기록됩니다. 이 방법은 원본 HTML과 생성된 Markdown을 깔끔하게 정리해 줍니다. + +--- + +## 복사‑붙여넣기 가능한 전체 스크립트 + +아래는 실행 준비가 된 전체 프로그램입니다. `YOUR_DIRECTORY`를 `sample.html`이 위치한 경로로 교체하세요. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**예상 출력** (콘솔에 출력됨): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +`sample.md`를 열면 예를 들어 Markdown 링크와 일반 단락만 표시됩니다: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +다른 모든 HTML 요소는 **기능 활성화 방법**이 출력을 두 가지 선택된 유형으로 제한했기 때문에 제외되었습니다. + +--- + +## 일반적인 질문 및 엣지 케이스 + +| 질문 | 답변 | +|----------|--------| +| *HTML 파일에 링크가 없으면 어떻게 되나요?* | 변환기는 여전히 단락을 기록하며, 출력에는 링크 구문 없이 일반 텍스트만 포함됩니다. | +| *모든 기능을 비활성화할 수 있나요?* | `markdown_options.features = []`를 설정하면 빈 Markdown 파일이 생성됩니다. 테스트용으로만 사용하세요. | +| *SDK는 잘못된 HTML을 어떻게 처리하나요?* | 파서는 기능 필터를 적용하기 전에 잘못된 마크업을 정리하려고 시도합니다. 오류는 로그에 기록되지만 변환을 중단하지는 않습니다. | +| *표는 제외하고 이미지는 유지할 수 있나요?* | 예. `markdown_options.features = ["Link", "Paragraph", "Image"]`로 설정합니다. 기능 리스트는 추가적인 것이며, 배타적이지 않습니다. | +| *폴더에 많은 파일을 변환해야 하면 어떻게 하나요?* | `Path.glob("*.html")`을 반복하는 루프에 변환 로직을 감싸세요. 동일한 **기능 활성화 방법** 구성을 각 파일에 재사용할 수 있습니다. | + +**팁:** 대량 배치를 처리할 때는 `MarkdownSaveOptions`를 한 번 인스턴스화하고 재사용하세요. 이렇게 하면 객체 생성 오버헤드가 줄어들고 **HTML을 Markdown으로 변환** 파이프라인이 빠르게 유지됩니다. + +--- + +## 결론 + +이제 **기능 활성화 방법**을 알게 되었으며, **HTML을 Markdown으로 변환**할 때 선택적 출력으로 **HTML 변환 방법**을 사용할 수 있고, 간결한 Python 스크립트를 사용해 **HTML 문서 변환** 및 **HTML을 Markdown으로 저장**하는 방법을 알게 되었습니다. `MarkdownSaveOptions.features`를 구성하면 최종 파일에 나타나는 Markdown 요소를 완전히 제어할 수 있습니다. + +### 다음 단계 + +* `"Header"`, `"Bold"`, `"Italic"`와 같은 추가 기능 플래그를 탐색하여 Markdown 출력을 풍부하게 만드세요. +* 이 스크립트를 파일 감시자(예: `watchdog`)와 결합하여 새로운 HTML 파일이 도착하면 자동으로 변환하세요. +* PDF‑to‑Markdown 또는 DOCX‑to‑HTML 변환과 같은 고급 시나리오를 위해 [GroupDocs.Conversion Python SDK documentation](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) 을 검토하세요. + +## 다음에 배워야 할 내용은? + +다음 튜토리얼은 이 가이드에서 시연한 기술을 기반으로 하는 밀접한 관련 주제를 다룹니다. 각 자료는 단계별 설명과 함께 완전한 작동 코드 예제를 포함하여 추가 API 기능을 마스터하고 자체 프로젝트에서 대체 구현 방식을 탐색하는 데 도움이 됩니다. + +- [Aspose.HTML for Java에서 HTML을 Markdown으로 변환](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Aspose.HTML로 변환하는 Java용 Markdown을 HTML로 변환](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [Aspose HTML에서 JavaScript 활성화 방법 – HTML 로드 및 텍스트 가져오기](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/korean/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/korean/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..1ced59ca15 --- /dev/null +++ b/html/korean/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,242 @@ +--- +category: general +date: 2026-09-19 +description: ResourceHandlingOptions를 사용하여 Aspose.HTML for Python에서 중첩된 리소스를 제한하는 + 방법을 배웁니다. 최대 처리 깊이를 제어하고 무한 루프를 방지하세요. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: ko +lastmod: 2026-09-19 +og_description: Aspose.HTML for Python에서 ResourceHandlingOptions를 사용하여 중첩된 리소스를 제한하십시오. + 최대 처리 깊이를 설정하여 깊은 재귀를 방지하고 성능을 향상시킵니다. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Aspose.HTML for Python에서 중첩 리소스를 제한하는 방법 – 단계별 가이드 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Aspose.HTML for Python을 사용하여 HTML을 처리할 때 중첩 리소스를 제한하는 방법 +url: /ko/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Aspose.HTML for Python으로 HTML을 처리할 때 중첩 리소스 제한하는 방법 + +HTML을 렌더링하거나 변환할 때 **중첩 리소스를 제한**해야 한다면, 이 가이드는 Aspose.HTML for Python을 구성하는 정확한 단계를 보여줍니다. 리소스 처리 깊이를 제어하면 페이지에 CSS, JavaScript, 이미지 참조가 여러 계층으로 포함될 때 무한 재귀를 방지할 수 있습니다. + +중첩 리소스 제한은 대규모 크롤러, 이메일 렌더링 파이프라인, 또는 메모리와 시간 예산 내에서 동작해야 하는 모든 자동화 워크플로에 특히 중요합니다. 다음 섹션에서는 깊이 제한을 설정해야 하는 이유, `ResourceHandlingOptions` 클래스를 사용하는 방법, 그리고 제한이 기대대로 작동하는지 확인하는 방법을 배웁니다. + +## 중첩 리소스를 제한해야 하는 이유 + +HTML 문서는 종종 다른 리소스—스타일시트, 스크립트, 이미지, 폰트, 혹은 다른 HTML 파일—를 참조합니다. 이러한 리소스 각각은 다시 추가 파일을 참조할 수 있어 의존성 트리를 형성합니다. 보호 장치가 없으면 트리는 임의로 깊어질 수 있습니다: + +* 페이지가 CSS 파일을 로드하고, 그 파일이 또 다른 CSS 파일을 import하고, 또 다른 파일을 import하는 식으로 계속 이어집니다. +* JavaScript가 동적으로 추가 스크립트를 로드할 수 있습니다. +* 이메일 템플릿이 외부 URL을 참조하는 이미지를 포함하고, 그 URL이 다시 다른 자산으로 리다이렉트될 수 있습니다. + +재귀 깊이가 제한 없이 증가하면 다음과 같은 위험이 있습니다: + +* **과도한 메모리 사용** – 가져온 각 리소스가 버퍼를 차지합니다. +* **처리 시간 증가** – 네트워크 지연이 각 레벨마다 곱해집니다. +* **무한 루프 가능성** – 순환 참조가 엔진을 영원히 반환하지 못하게 할 수 있습니다. + +**max handling depth**를 설정하면 Aspose.HTML이 지정된 레벨 수 이후에 리소스 링크를 따라가지 않게 하여 예측 가능한 성능을 보장합니다. + +## Aspose.HTML for Python에서 중첩 리소스를 제한하는 방법 + +Aspose.HTML은 `max_handling_depth` 속성을 포함하는 `ResourceHandlingOptions` 클래스를 제공합니다. 숫자 값(예: `3`)을 할당하면 엔진이 세 단계의 중첩 레벨 이후에 중지하도록 지시합니다. + +다음은 전체 워크플로를 보여주는 완전하고 실행 가능한 예제입니다: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### 각 단계 설명 + +1. **패키지 설치** – `aspose-html` 휠이 필요합니다. 완전성을 위해 `pip install` 명령이 주석으로 표시되어 있습니다. +2. **클래스 가져오기** – `HtmlDocument`는 페이지를 로드하고, `ResourceHandlingOptions`는 제한을 보관하며, `HtmlLoadOptions`는 두 객체를 연결합니다. +3. **옵션 객체 생성** – `ResourceHandlingOptions`를 인스턴스화하면 변경 가능한 컨테이너를 얻습니다. +4. **`max_handling_depth` 설정** – `3`(또는 원하는 정수) 값을 할당하여 엔진이 세 단계의 중첩 리소스로 제한하도록 합니다. 이것이 **중첩 리소스 제한**의 핵심입니다. +5. **로드 구성에 옵션 연결** – `HtmlLoadOptions`를 사용하면 `resource_options`를 로더에 전달할 수 있습니다. +6. **HTML 로드** – `HtmlDocument` 생성자는 URL 또는 파일 경로와 `load_options`를 함께 받아들입니다. 이제 엔진은 깊이 제한을 준수합니다. +7. **검증** – `document.resources`를 반복하면서 실제로 가져온 리소스 수와 가장 깊은 레벨을 확인할 수 있습니다. 가장 깊은 레벨이 `3` 이하이면 제한이 성공한 것입니다. +8. **저장** – 처리된 문서를 영구 저장합니다. 저장된 파일에는 허용된 깊이까지의 리소스만 포함됩니다. + +#### 예상 출력 + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +숫자는 소스 페이지에 따라 달라지지만, 가장 깊은 레벨은 `max_handling_depth = 3`을 설정했으므로 `3`을 초과하지 않아야 합니다. + +## 일반적인 변형 및 엣지 케이스 + +### 깊이 제한 변경 + +환경에 따라 더 깊거나 얕은 제한이 필요할 수 있습니다: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### 제한 완전 해제 + +`0`으로 설정하면 Aspose.HTML이 **깊이 제한을 완전히 제거**하도록 합니다: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +소스 HTML이 정상적으로 동작한다는 확신이 있을 때만 수행하십시오. + +### 순환 참조 처리 + +깊이 제한이 있더라도 동일 레벨에서 순환 참조가 발생할 수 있습니다. Aspose.HTML은 사이클을 감지하고 깊이 설정과 관계없이 이미 처리된 리소스의 로드를 중단합니다. 그러나 `max_handling_depth`를 낮게 설정하면 처음부터 사이클에 걸릴 가능성이 줄어듭니다. + +### 로컬 파일에 제한 적용 + +같은 방법을 로컬 HTML 파일에도 적용할 수 있습니다: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +엔진은 상대 `href` 또는 `src` 속성을 원격 URL과 동일하게 처리하여 파일 시스템 리소스에도 깊이 제한을 적용합니다. + +### 다른 Aspose.HTML 기능과 통합 + +**리소스 다운로드 타임아웃**을 제어해야 하는 경우 `ResourceHandlingOptions`와 `NetworkOptions`를 결합할 수 있습니다: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +두 옵션은 독립적이므로 성능과 안전성을 동시에 미세 조정할 수 있습니다. + +## 프로덕션 사용을 위한 팁 + +* **리소스 트리 로그** – 디버깅 시 `document.resources`를 반복하면서 각 리소스의 URL과 깊이를 기록합니다. 이를 통해 특정 페이지가 기대치를 초과하는 이유를 파악할 수 있습니다. +* **가져온 리소스 캐시** – 동일한 외부 자산을 반복 처리한다면 캐싱을 활성화하여 중복 네트워크 호출을 방지합니다. +* **화이트리스트와 결합** – 신뢰할 수 있는 도메인만 허용하려면 로드 후 `document.resources`를 필터링하여 화이트리스트 외의 항목을 삭제합니다. +* **엣지 케이스 페이지 테스트** – 10개의 CSS 파일을 연속으로 import하는 합성 HTML 파일을 만들어 제한이 의도대로 체인을 잘라내는지 확인합니다. + +## 결론 + +이제 `ResourceHandlingOptions.max_handling_depth`를 구성하여 Aspose.HTML for Python에서 **중첩 리소스를 제한**하는 방법을 알게 되었습니다. 깊이 제한을 설정하면 과도한 메모리 사용, 긴 처리 시간, 깊게 중첩되거나 순환하는 리소스 참조로 인한 무한 루프 위험으로부터 애플리케이션을 보호할 수 있습니다. + +이제 다음과 같이 활용할 수 있습니다: + +* 성능 예산에 맞게 깊이를 조정합니다(`resource_handling_options.max_handling_depth`). +* 제한을 네트워크 타임아웃, 캐싱, 도메인 화이트리스트와 결합하여 견고한 파이프라인을 구축합니다. +* **resource handling options**, **max handling depth**, **nested resource handling** 등 관련 주제를 탐색하여 HTML 처리 제어를 더욱 강화합니다. + +다양한 깊이 값을 실험해 보고 로드된 리소스 수가 어떻게 변하는지 확인하세요. 준비가 되면 이 패턴을 더 큰 HTML 변환 또는 렌더링 서비스에 통합하여 예측 가능하고 안전하며 효율적인 실행을 보장하십시오. + +## 다음에 배울 내용은? + +다음 튜토리얼은 이 가이드에서 시연한 기술을 기반으로 하는 밀접한 관련 주제를 다룹니다. 각 자료에는 단계별 설명과 함께 완전한 동작 코드 예제가 포함되어 있어 추가 API 기능을 마스터하고 프로젝트에서 대체 구현 방식을 탐색하는 데 도움이 됩니다. + +- [Aspose.HTML for Java에서 메시지 처리 및 네트워킹](/html/english/java/message-handling-networking/) +- [Aspose.HTML for Java에서 사용자 정의 스키마 필터 및 메시지 처리](/html/english/java/custom-schema-message-handling/) +- [Aspose.HTML for Java에서 데이터 처리 및 스트림 관리](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/korean/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/korean/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..7b58adc741 --- /dev/null +++ b/html/korean/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,292 @@ +--- +category: general +date: 2026-09-19 +description: Aspose.HTML를 사용하여 HTML에서 PDF를 빠르게 생성하는 방법을 보여주는 Python HTML‑to‑PDF 튜토리얼을 + 배워보세요. 지금 단계별 가이드를 따라가세요. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: ko +lastmod: 2026-09-19 +og_description: 'HTML을 PDF로 변환 튜토리얼: Python과 Aspose.HTML을 사용하여 모든 HTML 페이지를 PDF 파일로 + 변환합니다. 이 가이드는 몇 분 안에 HTML에서 PDF를 생성하는 방법을 보여줍니다.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Python에서 HTML을 PDF로 변환하는 튜토리얼 – 완전한 단계별 가이드 +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Python을 사용한 HTML을 PDF로 변환하는 튜토리얼 수행 방법 +url: /ko/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python을 사용한 html to pdf 튜토리얼 수행 방법 + +If you need an **html to pdf tutorial**, this guide shows you exactly how to generate a PDF from HTML with just a few lines of Python code. Whether you are automating report creation or exporting web content for offline reading, the Aspose.HTML library makes the conversion painless. + +이 **html to pdf tutorial**이 필요하다면, 이 가이드는 몇 줄의 Python 코드만으로 HTML에서 PDF를 생성하는 방법을 정확히 보여줍니다. 보고서 자동화이든 웹 콘텐츠를 오프라인으로 읽기 위해 내보내는 것이든, Aspose.HTML 라이브러리는 변환을 손쉽게 해줍니다. + +In this tutorial you will learn how to set up the environment, write the conversion script, and handle common edge cases such as missing files or custom page settings. By the end you can **how to generate pdf** files from any HTML source without leaving the Python ecosystem. + +이 튜토리얼에서는 환경 설정, 변환 스크립트 작성, 누락된 파일이나 사용자 지정 페이지 설정과 같은 일반적인 엣지 케이스를 처리하는 방법을 배웁니다. 마지막에는 Python 환경을 떠나지 않고 모든 HTML 소스에서 **how to generate pdf** 파일을 생성할 수 있게 됩니다. + +## 필요 사항 + +Before you start, make sure you have: + +* Python 3.8 or newer installed → Python 3.8 이상 설치 +* An active Aspose.HTML for Python license (a free trial works for evaluation) → 활성화된 Aspose.HTML for Python 라이선스(평가용 무료 체험 가능) +* `pip` access to install the `aspose-html` package → `pip`을 사용해 `aspose-html` 패키지를 설치할 수 있는 권한 +* A simple HTML file you want to convert (e.g., `input.html`) → 변환하려는 간단한 HTML 파일(예: `input.html`) + +> **Pro tip:** Keep your HTML and assets (images, CSS) in the same directory to avoid path‑resolution problems during conversion. +> **Pro tip:** 변환 중 경로 해결 문제를 피하려면 HTML과 자산(이미지, CSS)을 동일한 디렉터리에 보관하세요. + +## 단계 1: Aspose.HTML 패키지 설치 + +Open a terminal and run the following command: + +```bash +pip install aspose-html +``` + +The `aspose-html` wheel bundles the native libraries needed for high‑quality rendering, so no additional system dependencies are required. + +`aspose-html` 휠은 고품질 렌더링에 필요한 네이티브 라이브러리를 포함하므로 추가 시스템 종속성이 필요하지 않습니다. + +## 단계 2: 최소 Python 스크립트 만들기 + +Create a new file named `convert_html_to_pdf.py` and paste the code below. This script follows the **html to pdf tutorial** pattern of a three‑step process: import, define paths, and invoke the conversion. + +`convert_html_to_pdf.py`라는 새 파일을 만들고 아래 코드를 붙여넣으세요. 이 스크립트는 **html to pdf tutorial**의 3단계 프로세스(임포트, 경로 정의, 변환 호출)를 따릅니다. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### 왜 이렇게 동작하나요 + +* **Importing `Converter`** gives you access to a high‑level API that abstracts away the rendering engine. → **`Converter` 가져오기**는 렌더링 엔진을 추상화한 고수준 API에 접근할 수 있게 합니다. +* **Defining absolute paths** prevents relative‑path bugs when the script runs from a different working directory. → **절대 경로 정의**는 스크립트가 다른 작업 디렉터리에서 실행될 때 상대 경로 버그를 방지합니다. +* **`Converter.convert_html`** performs the entire rendering pipeline—HTML parsing, CSS layout, and PDF serialization—in one call, which is the recommended way **how to generate pdf** quickly. → **`Converter.convert_html`**은 HTML 파싱, CSS 레이아웃, PDF 직렬화를 한 번에 수행하며, 이는 **how to generate pdf**를 빠르게 수행하는 권장 방법입니다. + +## 단계 3: 스크립트 실행 및 출력 확인 + +Execute the script from the terminal: + +```bash +python convert_html_to_pdf.py +``` + +If everything is set up correctly, you will see: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Open `output.pdf` with any PDF viewer. The document should look identical to the original HTML page, including fonts, images, and basic CSS styling. + +`output.pdf`를 PDF 뷰어로 열어보세요. 문서는 글꼴, 이미지 및 기본 CSS 스타일을 포함해 원본 HTML 페이지와 동일하게 보여야 합니다. + +![Generated PDF preview](https://example.com/images/pdf-preview.png "Screenshot of generated PDF from HTML using Python"){: .center-image alt="Python을 사용해 HTML에서 생성된 PDF 스크린샷"} + +## 단계 4: 변환 맞춤 설정 (선택 사항) + +The basic **html to pdf tutorial** covers a one‑to‑one conversion, but real‑world scenarios often require tweaks: + +기본 **html to pdf tutorial**은 일대일 변환을 다루지만, 실제 상황에서는 종종 조정이 필요합니다: + +| 요구 사항 | Aspose.HTML로 구현 방법 | +|-------------|------------------------------------| +| 페이지 크기 설정 (A4, Letter) | `convert_html`에 `PdfSaveOptions` 객체 전달 | +| 여백 또는 머리글/바닥글 추가 | 옵션에 `PdfPageSettings` 사용 | +| 사용자 정의 글꼴 포함 | 글꼴 파일에 접근 가능하도록 하고 `FontSettings` 설정 | + +Below is an example that sets the page size to A4 and adds a 1‑inch margin: + +다음 예제는 페이지 크기를 A4로 설정하고 1인치 여백을 추가합니다: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Note:** Using custom options is the preferred **generate pdf from html** technique when you need precise control over layout. +> **Note:** 레이아웃에 대한 정밀한 제어가 필요할 때 사용자 정의 옵션을 사용하는 것이 **generate pdf from html** 기술의 선호되는 방법입니다. + +## 단계 5: 여러 HTML 파일 처리 (배치 변환) + +If you have a folder full of HTML reports, you can loop through them: + +HTML 보고서가 들어 있는 폴더가 있다면, 다음과 같이 반복할 수 있습니다: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +This snippet demonstrates a scalable **python convert html pdf** workflow that fits into CI pipelines or scheduled jobs. + +이 스니펫은 CI 파이프라인이나 예약 작업에 맞는 확장 가능한 **python convert html pdf** 워크플로를 보여줍니다. + +## 일반적인 함정 및 회피 방법 + +| 문제 | 원인 | 해결 방법 | +|-------|-------|-----| +| PDF에서 이미지 누락 | 스크립트가 다른 폴더에서 실행될 때 깨지는 상대 이미지 경로 | 절대 경로 사용 또는 `Converter` 옵션에서 `base_uri` 설정 | +| CSS 적용되지 않음 | 인터넷 접근이 필요한 URL로 외부 스타일시트 참조 | 스타일시트를 로컬에 다운로드하고 상대 경로로 참조 | +| 글꼴 대체 | 호스트 머신에 글꼴이 설치되지 않음 | 프로젝트에 글꼴 파일을 포함하고 `FontSettings` 구성 | + +Addressing these edge cases ensures your **export html as pdf** process is robust across environments. + +이러한 엣지 케이스를 해결하면 **export html as pdf** 프로세스가 다양한 환경에서도 견고해집니다. + +## 전체 실행 가능한 예제 + +Below is the complete script that includes optional settings, error handling, and batch processing logic. Copy it into `full_html_to_pdf.py` and run it as shown earlier. + +다음은 선택적 설정, 오류 처리 및 배치 처리 로직을 포함한 전체 스크립트입니다. `full_html_to_pdf.py`에 복사하고 앞서 보여준 대로 실행하세요. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Running this script produces a PDF for every HTML file in the target directory, applying consistent page settings—a complete **python convert html pdf** solution ready for production. + +이 스크립트를 실행하면 대상 디렉터리의 모든 HTML 파일에 대해 일관된 페이지 설정을 적용한 PDF가 생성되며, 이는 프로덕션에 바로 사용할 수 있는 완전한 **python convert html pdf** 솔루션입니다. + +## 결론 + +You now have a practical **html to pdf tutorial** that shows how to generate PDF files from HTML using Python and Aspose.HTML. The guide covered environment setup, a minimal conversion script, optional customization, batch processing, and troubleshooting tips. + +이제 Python과 Aspose.HTML을 사용해 HTML에서 PDF 파일을 생성하는 실용적인 **html to pdf tutorial**을 갖추었습니다. 가이드는 환경 설정, 최소 변환 스크립트, 선택적 맞춤 설정, 배치 처리 및 문제 해결 팁을 다루었습니다. + +From here you can explore related topics such as **how to generate pdf** with watermarks, merging multiple PDFs, or converting HTML to other formats like DOCX. Experiment with the `PdfSaveOptions` API to fine‑tune output, and integrate the script into web services or automated reporting pipelines. + +여기서부터 워터마크가 있는 **how to generate pdf**, 여러 PDF 병합, DOCX와 같은 다른 형식으로 HTML 변환 등 관련 주제를 탐색할 수 있습니다. `PdfSaveOptions` API를 실험해 출력물을 미세 조정하고, 스크립트를 웹 서비스나 자동 보고 파이프라인에 통합해 보세요. + +Happy coding, and enjoy turning your HTML content into polished PDFs! + +## 다음에 배워야 할 내용은? + +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. + +다음 튜토리얼은 이 가이드에서 시연한 기술을 기반으로 하는 밀접한 관련 주제를 다룹니다. 각 자료에는 단계별 설명과 함께 완전한 코드 예제가 포함되어 있어 추가 API 기능을 마스터하고 프로젝트에서 대체 구현 방식을 탐색하는 데 도움이 됩니다. + +- [Aspose.HTML를 사용한 HTML to PDF 변환 – 전체 단계별 가이드](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Aspose.HTML를 사용한 HTML to PDF 변환 – 전체 조작 가이드](/html/english/) +- [HTML to PDF Java 변환 방법 – Aspose.HTML for Java 사용](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/polish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/polish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..6ee4235972 --- /dev/null +++ b/html/polish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,265 @@ +--- +category: general +date: 2026-09-19 +description: Dowiedz się, jak zmienić tytuł w pliku HTML za pomocą Pythona. Ten przewodnik + obejmuje odczytywanie HTML, aktualizację tagu title oraz zapisywanie zmodyfikowanego + HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: pl +lastmod: 2026-09-19 +og_description: Jak zmienić tytuł w pliku HTML przy użyciu Pythona. Skorzystaj z tego + pełnego przykładu, aby odczytać HTML, zaktualizować znacznik title i zapisać zmodyfikowany + dokument. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Jak zmienić tytuł w pliku HTML przy użyciu Pythona – przewodnik krok po + kroku +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Jak zmienić tytuł w pliku HTML przy użyciu Pythona +url: /pl/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak zmienić tytuł w pliku HTML przy użyciu Pythona + +Jeśli potrzebujesz **jak zmienić tytuł** w dokumencie HTML programowo, Python ułatwia to zadanie. W tym samouczku odczytasz plik HTML, zaktualizujesz element `<title>` i zapiszesz zmodyfikowany HTML z powrotem na dysk — wszystko przy użyciu przejrzystego, gotowego do uruchomienia kodu. + +Zmiana tytułu strony to częsty krok przy generowaniu statycznych witryn, dostosowywaniu pobranych stron lub automatyzacji aktualizacji SEO. Po przeczytaniu tego przewodnika będziesz wiedział, jak **zaktualizować tytuł html**, jak **odczytać html w pythonie** oraz jak **zapisać zmodyfikowany html** w bezpieczny sposób. + +## Wymagania wstępne + +Zanim zaczniesz, upewnij się, że masz: + +- Python 3.8 lub nowszy zainstalowany +- Pakiet `beautifulsoup4` (`pip install beautifulsoup4`) +- Plik HTML, który chcesz edytować (przykład używa `index.html` w wybranym folderze) + +Żadne zewnętrzne usługi nie są potrzebne; wszystko działa lokalnie. + +## Krok 1: Wczytaj plik HTML w Pythonie + +Pierwszym zadaniem jest **wczytanie pliku html w pythonie**. Użycie `BeautifulSoup` zapewnia wyrozumiały parser, który radzi sobie z nieidealnym markupem. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Dlaczego ten krok jest ważny:* +`BeautifulSoup` buduje drzewiastą reprezentację, umożliwiając zapytania i modyfikacje elementów bez ręcznego operowania na łańcuchach znaków. Wbudowany parser `html.parser` jest szybki i nie wymaga dodatkowych binarek. + +## Krok 2: Znajdź element `<title>` + +Dokumenty HTML zazwyczaj zawierają pojedynczy znacznik `<title>` wewnątrz `<head>`. Pobieramy pierwsze wystąpienie, co spełnia wymóg **aktualizacji tytułu html**. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Dlaczego sprawdzamy, czy wartość nie jest `None`*: +Niektóre fragmenty HTML pomijają tytuł. Dodanie go automatycznie zapobiega późniejszym błędom i utrzymuje skrypt odpornym. + +## Krok 3: Zmień tekst tytułu + +Teraz **aktualizujemy tytuł html**, przypisując nowy tekst do atrybutu `string` znacznika. To jest sedno operacji **jak zmienić tytuł**. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +Atrybut `string` reprezentuje węzeł tekstowy wewnątrz `<title>`. Nadpisanie go aktualizuje DOM w pamięci. + +## Krok 4: Zapisz zmodyfikowany HTML + +Na koniec zapisz zmieniony dokument do nowego pliku. To spełnia krok **zapisz zmodyfikowany html** i pozostawia oryginał nietknięty. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` formatuje wyjście z wcięciami, dzięki czemu plik jest łatwy do odczytania po zmianie. + +### Oczekiwany wynik + +Uruchomienie skryptu na przykładowym `index.html`, który początkowo zawiera: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +produkuje wyjście w konsoli podobne do: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +Zapisany plik `index_modified.html` będzie teraz zaczynał się od: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Pełny skrypt do szybkiego kopiowania‑wklejenia + +Poniżej znajduje się kompletny, gotowy do uruchomienia program, łączący wszystkie cztery kroki. Zapisz go jako `change_title.py` i dostosuj `YOUR_DIRECTORY` według potrzeb. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Uruchom skrypt: + +```bash +python change_title.py +``` + +Zobaczysz komunikaty w konsoli oraz nowy plik `index_modified.html` z zaktualizowanym tytułem. + +## Dodatkowe wskazówki i przypadki brzegowe + +| Sytuacja | Co zrobić | +|-----------|------------| +| **Wiele znaczników `<title>`** | `soup.find_all("title")` zwraca listę; zaktualizuj pierwszy element lub iteruj, jeśli musisz zmienić wszystkie. | +| **Problemy z kodowaniem** | Otwieraj pliki z `encoding="utf-8-sig"` jeśli występuje BOM, lub wykrywaj kodowanie przy pomocy `chardet`. | +| **Duże pliki HTML** | Użyj parsera `lxml` (`BeautifulSoup(html_content, "lxml")`) dla lepszej wydajności. | +| **Zachowanie oryginalnego formatowania** | Jeśli musisz zachować dokładne białe znaki, zapisz `str(soup)` zamiast `prettify()`. | +| **Automatyzacja wielu plików** | Umieść logikę w funkcji i iteruj po `Path.rglob("*.html")`. | + +Te warianty zachowują podstawową logikę **jak zmienić tytuł**, jednocześnie dostosowując się do realnych projektów. + +## Zakończenie + +Teraz wiesz, jak **jak zmienić tytuł** w dowolnym dokumencie HTML przy użyciu Pythona. Samouczek obejmował odczyt HTML, odnalezienie znacznika `<title>`, aktualizację jego tekstu oraz **zapis zmodyfikowanego html** w bezpieczny sposób. Dzięki pełnemu skryptowi możesz włączyć ten wzorzec do generatorów statycznych stron, potoków SEO lub dowolnej automatyzacji wymagającej dynamicznej zmiany tytułu. + +Następnie poznaj pokrewne tematy, takie jak **odczyt html w pythonie** w celu wyciągania meta‑tagów, czy techniki **wczytywania pliku html w pythonie** przy obsłudze niepoprawnego markupu. Eksperymentuj z przetwarzaniem wsadowym, aby aktualizować tytuły w całej witrynie — nowa umiejętność jest fundamentem wielu zadań automatyzacji webowej. Powodzenia w kodowaniu! + +## Co powinieneś nauczyć się dalej? + +Poniższe samouczki dotyczą ściśle powiązanych tematów, które rozwijają techniki przedstawione w tym przewodniku. Każdy zasób zawiera kompletne, działające przykłady kodu oraz wyjaśnienia krok po kroku, aby pomóc Ci opanować dodatkowe funkcje API i odkrywać alternatywne podejścia w własnych projektach. + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/polish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/polish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..7e3742a4d4 --- /dev/null +++ b/html/polish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,202 @@ +--- +category: general +date: 2026-09-19 +description: Konwertuj lokalny plik HTML na PDF przy użyciu Pythona i Aspose.HTML + – kompletny przewodnik krok po kroku, który także omawia opcje konwersji HTML do + PDF w Pythonie. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: pl +lastmod: 2026-09-19 +og_description: Konwertuj lokalny plik HTML do PDF przy użyciu Pythona. Dowiedz się, + jak najlepiej konwertować HTML na PDF w Pythonie z Aspose.HTML, w tym osadzanie + czcionek i obsługę błędów. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Konwertuj lokalny plik HTML do PDF za pomocą Pythona – pełny przewodnik +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Jak przekonwertować lokalny plik HTML na PDF przy użyciu Pythona +url: /pl/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak przekonwertować lokalny plik HTML na PDF przy użyciu Pythona + +Jeśli potrzebujesz **przekonwertować lokalny plik HTML na PDF** w projekcie Pythona, ten tutorial przedstawia gotowe rozwiązanie. Zobaczysz, jak skonfigurować bibliotekę Aspose.HTML, ustawić opcje PDF i wykonać konwersję w kilku linijkach kodu. Poradnik wyjaśnia także najlepsze praktyki **convert html to pdf python**, abyś mógł dostosować kod do własnych przepływów pracy. + +Poniższe kroki obejmują wszystko, co musisz wiedzieć: instalację SDK, przygotowanie opcji zapisu, obsługę typowych problemów i weryfikację wyniku. Po przeczytaniu artykułu będziesz mieć funkcję wielokrotnego użytku, którą możesz wstawić do dowolnej aplikacji Python. + +## Wymagania wstępne + +* Python 3.8 lub nowszy zainstalowany na Twoim komputerze. +* Aktywna licencja Aspose.HTML for Python (bezpłatna wersja próbna działa w trybie ewaluacji). +* Lokalny plik HTML, który chcesz przekształcić w PDF (np. `page.html`). + +Nie potrzebujesz żadnych dodatkowych zależności systemowych; SDK zawiera wszystko, co jest potrzebne do generowania PDF. + +## Zainstaluj pakiet Aspose.HTML + +SDK Aspose.HTML jest dystrybuowany przez PyPI. Zainstaluj go przy użyciu `pip` w swoim środowisku wirtualnym: + +```bash +pip install aspose-html +``` + +Uruchomienie polecenia wyświetla zainstalowaną wersję, potwierdzając, że pakiet jest dostępny do importu. + +## Krok 1: Importuj wymagane klasy + +Proces konwersji opiera się na dwóch głównych klasach: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` udostępnia statyczną metodę `convert_html`, która wykonuje rzeczywistą transformację. +* `PDFSaveOptions` pozwala precyzyjnie dostosować wyjście PDF, np. wstawiając standardowe czcionki. + +## Krok 2: Utwórz opcje zapisu PDF i włącz wstawianie standardowych czcionek + +Wstawianie czcionek zapewnia, że wygenerowany PDF wygląda tak samo na każdym urządzeniu, nawet jeśli przeglądarka nie ma czcionek zainstalowanych lokalnie. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Ustawienie `embed_standard_fonts` na `True` jest zalecane w większości scenariuszy produkcyjnych, ponieważ eliminuje ostrzeżenia o zastępowaniu czcionek w czytnikach PDF. + +## Krok 3: Konwertuj plik HTML na PDF używając skonfigurowanych opcji + +Teraz wywołaj `Converter.convert_html`, przekazując ścieżkę źródłowego pliku HTML, ścieżkę docelowego pliku PDF oraz przygotowany obiekt opcji: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Jeśli konwersja się powiedzie, metoda zwraca `None`, a plik PDF pojawia się w określonym miejscu. + +## Pełny przykład w funkcji wielokrotnego użytku + +Umieszczenie logiki w funkcji ułatwia jej ponowne użycie w wielu projektach: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Dlaczego funkcja jest przydatna + +* **Walidacja wejścia** – `FileNotFoundError` ułatwia debugowanie, gdy ścieżka do HTML jest nieprawidłowa. +* **Automatyczne tworzenie katalogu** – `os.makedirs(..., exist_ok=True)` zapobiega błędom „katalog nie istnieje”. +* **Konfigurowalne wstawianie czcionek** – możesz wyłączyć wstawianie czcionek dla mniejszych plików, jeśli wiesz, że docelowe środowisko już posiada wymagane czcionki. + +## Typowe przypadki brzegowe i jak je obsłużyć + +| Sytuacja | Zalecane postępowanie | +|-----------|----------------------| +| **HTML zawiera zewnętrzny CSS lub obrazy** | Użyj bezwzględnych URL‑ów lub skopiuj zasoby obok pliku HTML; Aspose.HTML stosuje te same zasady co przeglądarka. | +| **Duże pliki HTML (>10 MB)** | Zwiększ domyślny limit pamięci, ustawiając `pdf_options.memory_limit`, jeśli napotkasz `OutOfMemoryException`. | +| **Potrzebujesz PDF‑ów zabezpieczonych hasłem** | Ustaw `pdf_options.encryption_details` z hasłem użytkownika przed wywołaniem `convert_html`. | +| **Uruchamianie na serwerze bez interfejsu graficznego** | Nie wymaga dodatkowej konfiguracji; SDK nie zależy od GUI. | + +Rozwiązanie tych scenariuszy z wyprzedzeniem chroni Cię przed nieoczekiwanymi błędami w czasie wykonywania. + +## Weryfikacja wyniku konwersji + +Po zakończeniu skryptu otwórz wygenerowany PDF w dowolnym przeglądarce (Adobe Reader, Chrome itp.). Układ wizualny powinien odpowiadać oryginalnemu HTML, a wszystkie czcionki powinny wyświetlać się poprawnie, ponieważ zostały wstawione. + +Możesz również programowo potwierdzić, że plik istnieje i ma niezerowy rozmiar: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Porady dla środowiska produkcyjnego + +* **Przetwarzanie wsadowe** – iteruj listę plików HTML i wywołuj `html_to_pdf` dla każdego; ponownie użyj jednej instancji `PDFSaveOptions`, aby zmniejszyć narzut tworzenia obiektów. +* **Logowanie** – zintegrować moduł `logging` Pythona, aby rejestrować znaczniki czasu konwersji i wszelkie wyjątki. +* **Wydajność** – przy konwersji wielu plików rozważ równoległe uruchamianie konwersji przy użyciu `concurrent.futures.ThreadPoolExecutor`, ale pamiętaj, że SDK jest bezpieczne wątkowo tylko dla oddzielnych wywołań `Converter`. + +## Zakończenie + +Masz teraz kompletną, gotową do produkcji metodę **przekonwertowania lokalnego pliku HTML na PDF** przy użyciu Pythona. Rozwiązanie obejmuje kluczowe kroki — instalację Aspose.HTML, konfigurację opcji PDF, obsługę typowych przypadków brzegowych oraz weryfikację wyniku — a także demonstruje szerszy przepływ pracy **convert html to pdf python**. + +Od tego momentu możesz eksplorować zaawansowane funkcje, takie jak szyfrowanie PDF, niestandardowe rozmiary stron czy dodawanie znaków wodnych, które wszystkie są obsługiwane przez to samo SDK. Eksperymentuj z opcjami najlepiej pasującymi do Twojego projektu i będziesz w stanie niezawodnie automatyzować konwersję HTML‑do‑PDF w dowolnym środowisku Python. + +--- + +## Co warto nauczyć się dalej? + +Poniższe tutoriale obejmują ściśle powiązane tematy, które rozwijają techniki przedstawione w tym przewodniku. Każde źródło zawiera kompletne działające przykłady kodu z wyjaśnieniami krok po kroku, aby pomóc Ci opanować dodatkowe funkcje API i odkrywać alternatywne podejścia implementacyjne w własnych projektach. + +- [Konwertuj HTML na PDF przy użyciu Aspose.HTML – Pełny przewodnik krok po kroku](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Konwertuj HTML na PDF przy użyciu Aspose.HTML – Pełny przewodnik manipulacji](/html/english/) +- [Konwertuj HTML na PDF w .NET przy użyciu Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/polish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/polish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..18d7766d2e --- /dev/null +++ b/html/polish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,221 @@ +--- +category: general +date: 2026-09-19 +description: Naucz się konwertować HTML na Markdown w Pythonie. Ten tutorial pokazuje, + jak szybko zapisać HTML jako Markdown i wygenerować Markdown z HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: pl +lastmod: 2026-09-19 +og_description: Konwertuj HTML na Markdown przy użyciu Pythona. Skorzystaj z tego + przewodnika, aby zapisać HTML jako Markdown, wygenerować Markdown z HTML oraz utworzyć + plik HTML na Markdown. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Konwertuj HTML na Markdown w Pythonie – kompletny przewodnik programistyczny +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Jak przekonwertować HTML na Markdown przy użyciu Pythona – przewodnik krok + po kroku +url: /pl/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak konwertować HTML na Markdown w Pythonie – przewodnik krok po kroku + +Jeśli potrzebujesz **konwertować HTML na Markdown**, ten przewodnik przeprowadzi Cię przez cały proces. Zobaczysz, jak **zapisać HTML jako Markdown**, generować Markdown z HTML oraz utworzyć *html to markdown file*, który może być używany w generatorach statycznych stron, pipeline'ach dokumentacji lub w dowolnym przepływie pracy preferującym czysty tekstowy znacznik. + +Tutorial obejmuje wszystko, od instalacji wymaganego pakietu po obsługę przypadków brzegowych, takich jak osadzone obrazy i niestandardowe formatowanie. Po zakończeniu będziesz mieć gotowy do uruchomienia skrypt oraz jasne zrozumienie, dlaczego każdy krok ma znaczenie. + +## Prerequisites + +Zanim rozpoczniesz, upewnij się, że masz: + +- Python 3.8 lub nowszy zainstalowany na Twoim komputerze. +- Podstawową znajomość skryptów w Pythonie. +- Dostęp do terminala lub wiersza poleceń. +- Bibliotekę `aspose.html` (lub dowolny kompatybilny pakiet HTML‑to‑Markdown). Ten tutorial używa **Aspose.HTML for Python via .NET**, który udostępnia klasy `HTMLDocument`, `MarkdownSaveOptions` i `Converter` pokazane w przykładzie kodu. + +> **Pro tip:** Jeśli wolisz rozwiązanie czysto‑Pythonowe, możesz zamienić `aspose.html` na pakiet `html2text`. Ogólny przepływ pozostaje taki sam. + +## Step 1: Install the conversion library + +Najpierw zainstaluj bibliotekę, która dostarcza `HTMLDocument`, `MarkdownSaveOptions` i `Converter`. Uruchom następujące polecenie: + +```bash +pip install aspose-html +``` + +Pakiet zawiera natywny silnik potrzebny do **generowania markdown z html** szybko i z wysoką wiernością. Instalacja zazwyczaj kończy się w mniej niż minutę przy standardowym połączeniu szerokopasmowym. + +## Step 2: Load the source HTML document + +Załadowanie pliku HTML jest pierwszą konkretną akcją w pipeline konwersji. Klasa `HTMLDocument` parsuje plik i buduje w‑memory DOM, który konwerter później przetwarza na Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Dlaczego to ważne:** Tworząc obiekt `HTMLDocument`, zapewniasz, że złożone struktury — tabele, listy i style inline — są poprawnie interpretowane przed konwersją. Pominięcie tego kroku spowodowałoby, że konwerter czytałby surowy tekst, co prowadziłoby do utraty formatowania. + +## Step 3: Configure Markdown save options + +Obiekt `MarkdownSaveOptions` pozwala precyzyjnie dostroić format wyjściowy. Aby uzyskać **Git‑flavored Markdown**, ustaw właściwość `formatter` na `"GIT"`. Dzięki temu wynik będzie zgodny z składnią używaną na platformach takich jak GitHub, GitLab i Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Możesz także zmienić inne ustawienia, takie jak `preserve_links` czy `code_block_style`, w zależności od tego, jak planujesz **save html as markdown** w dalszych narzędziach. + +## Step 4: Convert the HTML to Markdown and save the result + +Mając dokument załadowany i opcje skonfigurowane, wywołaj statyczną metodę `convert_html`. Metoda odczytuje DOM, stosuje wybrany formatter i zapisuje plik wyjściowy. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Po uruchomieniu skryptu znajdziesz nowy plik o nazwie `output.md` w określonym katalogu. Otwierając go, zobaczysz czysty, kompatybilny z Git Markdown gotowy do kontroli wersji lub publikacji. + +## Step 5: Verify the generated markdown file + +Krótka kontrola pozwala potwierdzić, że konwersja zakończyła się sukcesem i że **html to markdown file** zawiera oczekiwaną treść. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Typowy wynik dla prostej strony HTML wygląda tak: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Jeśli zauważysz brakujące nagłówki lub nieprawidłowe listy, wróć do **Step 3** i eksperymentuj z różnymi wartościami `formatter` (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Advanced: Handling images and relative paths + +Gdy źródłowy HTML zawiera obrazy, konwerter może je osadzić jako data URI lub zachować oryginalne atrybuty `src`. Aby proces **generate markdown from html** był lekki, możesz skopiować pliki obrazów do równoległego folderu i dostosować ścieżki. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Po konwersji Markdown będzie odwoływał się do obrazów w formie `![Alt text](images/picture.png)`. Takie podejście sprawdza się dobrze, gdy później **save html as markdown** w generatorze statycznych stron, który oczekuje zasobów w dedykowanym folderze. + +## Full script you can copy‑paste + +Poniżej znajduje się kompletny, gotowy do uruchomienia skrypt, który zawiera wszystkie omówione kroki. Zapisz go jako `convert_html_to_md.py` i uruchom poleceniem `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Expected output + +Uruchomienie skryptu wypisuje komunikat potwierdzający, a następnie pierwsze dziesięć linii pliku Markdown, jak pokazano wcześniej. Wygenerowany `output.md` można otworzyć w dowolnym edytorze tekstu, podglądnąć w VS Code lub zatwierdzić w repozytorium Git. + +## Common questions and edge‑case handling + +| Question | Answer | +|----------|--------| +| **Co zrobić, gdy plik HTML jest duży (> 10 MB)?** | Klasa `HTMLDocument` strumieniuje wejście, więc zużycie pamięci pozostaje umiarkowane. W razie wystąpienia `MemoryError` rozważ zwiększenie limitu pamięci procesu Pythona. | +| **Czy mogę konwertować ciąg HTML zamiast pliku?** | Tak. Użyj `HTMLDocument.from_string(html_string)` (lub równoważnego konstruktora) przed wywołaniem `Converter.convert_html`. | +| **Jak zachować oryginalne komentarze HTML?** | Ustaw `md_options.preserve_comments = True`. Komentarze pojawią się jako komentarze HTML (`<!-- … -->`) wewnątrz pliku Markdown. | +| **Czy można celować w inny dialekt Markdown?** | Zmień `md_options.formatter` na `"COMMONMARK"` lub `"MARKDOWN_EXTRA"` w zależności od docelowej platformy. | +| **Czy muszę instalować środowisko .NET osobno?** | Pakiet `aspose-html` zawiera wymagane środowisko dla większości platform. Na Linuxie upewnij się, że zainstalowano `libgdiplus` (`sudo apt-get install libgdiplus`). | + +## Conclusion + +Teraz wiesz, jak **convert HTML to Markdown** przy użyciu Pythona, jak **save html as markdown** oraz jak **generate markdown from html** z precyzyjną kontrolą nad formatowaniem i zasobami. Skrypt demonstruje pełny przepływ — od załadowania pliku źródłowego po wygenerowanie czystego *html to markdown file* gotowego do kontroli wersji lub publikacji. + +Następnie eksploruj tematy pokrewne, takie jak **batch converting multiple HTML files**, integracja kroku konwersji w pipeline CI/CD lub dostosowywanie wyjścia Markdown dla konkretnych generatorów statycznych stron, np. Hugo czy Jekyll. Eksperymentuj z różnymi ustawieniami `MarkdownSaveOptions`, aby dopasować rezultat do wytycznych stylu Twojego projektu. + +Happy converting! + +## What Should You Learn Next? + +Poniższe tutoriale obejmują tematy ściśle powiązane, które rozwijają techniki przedstawione w tym przewodniku. Każdy zasób zawiera kompletne, działające przykłady kodu oraz wyjaśnienia krok po kroku, aby pomóc Ci opanować dodatkowe funkcje API i odkrywać alternatywne podejścia w własnych projektach. + +- [Konwertuj HTML na Markdown w .NET z Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Konwertuj HTML na Markdown w Aspose.HTML dla Javy](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown do HTML w Javie – konwersja z 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/polish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/polish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..eb219c2dae --- /dev/null +++ b/html/polish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Jak włączyć funkcje podczas konwertowania HTML na Markdown przy użyciu + Pythona. Dowiedz się, jak konwertować dokument HTML i zapisać go jako Markdown z + precyzyjną kontrolą funkcji. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: pl +lastmod: 2026-09-19 +og_description: Jak włączyć funkcje podczas konwertowania HTML na Markdown. Ten przewodnik + pokazuje krok po kroku, jak przekonwertować dokument HTML i zapisać go jako Markdown + z precyzyjną kontrolą. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Jak włączyć funkcje podczas konwertowania HTML na Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Jak włączyć funkcje podczas konwertowania HTML na Markdown +url: /pl/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak włączyć funkcje podczas konwertowania HTML na Markdown + +Jeśli potrzebujesz **how to enable features** podczas konwersji, ten przewodnik zapewnia kompletną, gotową do uruchomienia rozwiązanie. Zobaczysz dokładnie, jak konwertować HTML na Markdown, kontrolować, które funkcje Markdown są generowane, oraz zapisać HTML jako Markdown w jednym przebiegu. + +Przykład używa popularnego **GroupDocs.Conversion** Python SDK, ale koncepcje mają zastosowanie do każdej biblioteki, która pozwala konfigurować zestawy funkcji. Po zakończeniu tego samouczka będziesz mógł konwertować dokument HTML, zachować tylko linki i akapity oraz uniknąć niechcianych tabel, obrazów lub bloków kodu. + +## Co osiągniesz + +* **how to enable features** w opcjach zapisu Markdown +* jasny przepływ pracy **convert html to markdown** +* możliwość **how to convert html** z selektywnym wyjściem +* gotowy do uruchomienia skrypt, który **convert html document** i **save html as markdown** + +### Wymagania wstępne + +* Python 3.8+ zainstalowany +* pakiet `groupdocs-conversion` (zainstaluj za pomocą `pip install groupdocs-conversion`) +* Przykładowy plik HTML (`sample.html`) w znanym katalogu + +--- + +## Jak włączyć funkcje w konwersji do Markdown + +Pierwszym krokiem jest utworzenie obiektu `MarkdownSaveOptions` i poinformowanie konwertera, które elementy chcesz zachować. W tym samouczku włączamy tylko **links** i **paragraphs**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Dlaczego to działa:** +* `HTMLDocument` otacza plik źródłowy, aby konwerter mógł go odczytać. +* `MarkdownSaveOptions` przechowuje wszystkie ustawienia konwersji; lista `features` jest kluczową właściwością, która **how to enable features**. +* Przypisując `["Link", "Paragraph"]` informujesz silnik, aby generował tylko linki Markdown (`[text](url)`) i zwykłe akapity, pomijając obrazy, tabele i inne znaczniki. +* `Converter.convert_html` wykonuje rzeczywistą operację **convert html to markdown** i zapisuje wynik do `sample.md`. + +--- + +## Jak konwertować dokument HTML z własnymi opcjami + +Jeśli później będziesz potrzebował dodać więcej flag funkcji — takich jak `"Header"` lub `"Bold"` — po prostu rozszerz listę: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +To samo wywołanie `Converter.convert_html` teraz uwzględni te dodatkowe elementy. Ten wzorzec pozwala ci **how to convert html** w wysoce konfigurowalny sposób bez pisania własnych parserów. + +--- + +## Jak zapisać HTML jako Markdown w określonym folderze + +Metoda `convert_html` przyjmuje bezwzględną lub względną ścieżkę wyjściową. Aby **save html as markdown** w podfolderze o nazwie `output`, dostosuj trzeci argument: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Uruchomienie skryptu tworzy katalog `output` (jeśli nie istnieje) i zapisuje tam plik Markdown. Takie podejście utrzymuje Twój źródłowy HTML i wygenerowany Markdown w porządku. + +--- + +## Pełny skrypt, który możesz skopiować i wkleić + +Poniżej znajduje się cały program, gotowy do uruchomienia. Zastąp `YOUR_DIRECTORY` ścieżką, w której znajduje się `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Oczekiwany wynik** (wydrukowany w konsoli): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Otwórz `sample.md` i zobaczysz tylko linki Markdown oraz zwykłe akapity, na przykład: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Wszystkie inne elementy HTML zostały pominięte, ponieważ **how to enable features** ograniczyło wyjście do dwóch wybranych typów. + +--- + +## Częste pytania i przypadki brzegowe + +| Pytanie | Odpowiedź | +|----------|--------| +| *Co jeśli plik HTML nie zawiera linków?* | Konwerter nadal zapisuje akapity; wyjście będzie zawierało zwykły tekst bez składni linków. | +| *Czy mogę wyłączyć wszystkie funkcje?* | Ustawienie `markdown_options.features = []` skutkuje pustym plikiem Markdown. Używaj tego tylko do testów. | +| *Jak SDK radzi sobie z nieprawidłowym HTML?* | Parser próbuje oczyścić niepoprawny znacznik przed zastosowaniem filtru funkcji. Błędy są logowane, ale nie przerywają konwersji. | +| *Czy można zachować obrazy, jednocześnie pomijając tabele?* | Tak. Ustaw `markdown_options.features = ["Link", "Paragraph", "Image"]`. Lista funkcji jest dodatnia, a nie wykluczająca. | +| *Co jeśli muszę konwertować wiele plików w folderze?* | Umieść logikę konwersji w pętli, która iteruje po `Path.glob("*.html")`. Ta sama konfiguracja **how to enable features** może być ponownie użyta dla każdego pliku. | + +**Wskazówka:** Podczas przetwarzania dużych partii, utwórz `MarkdownSaveOptions` raz i używaj go ponownie. Redukuje to narzut tworzenia obiektów i utrzymuje szybki pipeline **convert html to markdown**. + +--- + +## Podsumowanie + +Teraz wiesz **how to enable features** podczas **convert html to markdown**, jak **how to convert html** z selektywnym wyjściem oraz jak **convert html document** i **save html as markdown** przy użyciu zwięzłego skryptu Python. Konfigurując `MarkdownSaveOptions.features`, uzyskujesz pełną kontrolę nad elementami Markdown, które pojawiają się w końcowym pliku. + +### Kolejne kroki + +* Zbadaj dodatkowe flagi funkcji, takie jak `"Header"`, `"Bold"` i `"Italic"`, aby wzbogacić wyjście Markdown. +* Połącz ten skrypt z obserwatorem plików (np. `watchdog`), aby automatycznie konwertować nowe pliki HTML w miarę ich pojawiania się. +* Przejrzyj [GroupDocs.Conversion Python SDK documentation](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) w celu uzyskania zaawansowanych scenariuszy, takich jak konwersje PDF‑to‑Markdown lub DOCX‑to‑HTML. + +Śmiało eksperymentuj z różnymi zestawami funkcji i podziel się swoimi odkryciami ze społecznością. Szczęśliwej konwersji! + +## Co powinieneś nauczyć się dalej? + +Poniższe samouczki obejmują ściśle powiązane tematy, które rozwijają techniki przedstawione w tym przewodniku. Każde źródło zawiera kompletne działające przykłady kodu z wyjaśnieniami krok po kroku, aby pomóc Ci opanować dodatkowe funkcje API i odkrywać alternatywne podejścia implementacyjne w własnych projektach. + +- [Konwertuj HTML na Markdown w Aspose.HTML dla Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown do HTML Java – konwertuj przy użyciu Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [Jak włączyć JavaScript w Aspose HTML – załaduj HTML i pobierz tekst](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/polish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/polish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..88ff0a6239 --- /dev/null +++ b/html/polish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,246 @@ +--- +category: general +date: 2026-09-19 +description: Dowiedz się, jak ograniczyć zagnieżdżone zasoby w Aspose.HTML dla Pythona + przy użyciu ResourceHandlingOptions. Kontroluj maksymalną głębokość obsługi i unikaj + nieskończonych pętli. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: pl +lastmod: 2026-09-19 +og_description: Ogranicz zagnieżdżone zasoby w Aspose.HTML dla Pythona przy użyciu + ResourceHandlingOptions. Ustaw maksymalną głębokość obsługi, aby zapobiec głębokiej + rekurencji i poprawić wydajność. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Jak ograniczyć zagnieżdżone zasoby w Aspose.HTML dla Pythona – przewodnik + krok po kroku +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Jak ograniczyć zagnieżdżone zasoby podczas przetwarzania HTML przy użyciu Aspose.HTML + dla Pythona +url: /pl/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak ograniczyć zagnieżdżone zasoby podczas przetwarzania HTML przy użyciu Aspose.HTML dla Pythona + +Jeśli potrzebujesz **ograniczyć zagnieżdżone zasoby** podczas renderowania lub konwertowania HTML, ten przewodnik pokaże Ci dokładne kroki konfiguracyjne Aspose.HTML dla Pythona. Kontrolowanie głębokości obsługi zasobów zapobiega niekontrolowanej rekurencji, gdy strona zawiera wiele warstw odwołań do CSS, JavaScript lub obrazów. + +Ograniczanie zagnieżdżonych zasobów jest szczególnie ważne dla dużych crawlerów, potoków renderowania e‑maili lub dowolnych zautomatyzowanych przepływów pracy, które muszą mieścić się w określonych limitach pamięci i czasu. W kolejnych sekcjach dowiesz się, dlaczego warto ustawić limit głębokości, jak używać klasy `ResourceHandlingOptions` oraz jak zweryfikować, że limit działa zgodnie z oczekiwaniami. + +## Dlaczego warto ograniczyć zagnieżdżone zasoby + +Dokumenty HTML często odwołują się do innych zasobów — arkuszy stylów, skryptów, obrazów, czcionek czy nawet innych plików HTML. Każdy z tych zasobów może z kolei odwoływać się do kolejnych plików, tworząc drzewo zależności. Bez zabezpieczenia drzewo może stać się dowolnie głębokie: + +* Strona ładuje plik CSS, który importuje kolejny plik CSS, który znowu importuje kolejny i tak dalej. +* JavaScript może dynamicznie ładować dodatkowe skrypty. +* Szablon e‑maila może osadzać obrazy, które odwołują się do zewnętrznych URL‑ów przekierowujących do kolejnych zasobów. + +Gdy głębokość rekurencji rośnie niekontrolowanie, ryzykujesz: + +* **Nadmierne zużycie pamięci** – każdy pobrany zasób zajmuje bufor. +* **Dłuższy czas przetwarzania** – opóźnienia sieciowe mnożą się z każdym poziomem. +* **Potencjalne pętle nieskończone** – odwołania cykliczne mogą spowodować, że silnik nigdy nie zakończy działania. + +Ustawienie **maksymalnej głębokości obsługi** mówi Aspose.HTML, aby przestał podążać za linkami zasobów po określonej liczbie poziomów, zapewniając przewidywalną wydajność. + +## Jak ograniczyć zagnieżdżone zasoby w Aspose.HTML dla Pythona + +Aspose.HTML udostępnia klasę `ResourceHandlingOptions`, która zawiera właściwość `max_handling_depth`. Przypisując jej wartość liczbową (np. `3`), instruujesz silnik, aby zatrzymał się po trzech poziomach zagnieżdżenia. + +Poniżej znajduje się kompletny, gotowy do uruchomienia przykład, który demonstruje cały przepływ pracy: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Wyjaśnienie poszczególnych kroków + +1. **Instalacja pakietu** – Koło `aspose-html` jest wymagane. Komenda `pip install` jest podana jako komentarz dla pełności. +2. **Import klas** – `HtmlDocument` ładuje stronę, `ResourceHandlingOptions` przechowuje limit, a `HtmlLoadOptions` łączy je ze sobą. +3. **Utworzenie obiektu opcji** – Instancja `ResourceHandlingOptions` daje Ci mutowalny kontener. +4. **Ustawienie `max_handling_depth`** – Przypisz `3` (lub dowolną liczbę całkowitą), aby ograniczyć silnik do trzech poziomów zagnieżdżonych zasobów. To jest sedno **ograniczania zagnieżdżonych zasobów**. +5. **Dołączenie opcji do konfiguracji ładowania** – `HtmlLoadOptions` pozwala przekazać `resource_options` do loadera. +6. **Załadowanie HTML** – Konstruktor `HtmlDocument` przyjmuje URL lub ścieżkę do pliku wraz z `load_options`. Silnik teraz respektuje limit głębokości. +7. **Weryfikacja** – Iterując po `document.resources`, możesz zobaczyć, ile zasobów faktycznie pobrano oraz jak głęboki poziom został osiągnięty. Jeśli najgłębszy poziom wynosi `3` lub mniej, limit się powiódł. +8. **Zapis** – Zapisz przetworzony dokument. Zapisany plik zawiera jedynie zasoby do dozwolonej głębokości. + +#### Oczekiwany wynik + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +Liczby będą się różnić w zależności od źródłowej strony, ale najgłębszy poziom nigdy nie powinien przekroczyć `3`, ponieważ ustawiliśmy `max_handling_depth = 3`. + +## Typowe wariacje i przypadki brzegowe + +### Zmiana limitu głębokości + +Możesz potrzebować głębszego lub płytszego limitu w zależności od środowiska: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Wyłączenie limitu całkowicie + +Ustawienie właściwości na `0` mówi Aspose.HTML, aby **usunął wszelkie ograniczenia głębokości**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Rób to tylko wtedy, gdy masz pewność, że źródłowy HTML jest dobrze zachowującym się. + +### Obsługa odwołań cyklicznych + +Nawet przy limicie głębokości odwołania cykliczne mogą pojawić się na tym samym poziomie. Aspose.HTML wykrywa cykle i przestaje ładować zasób, który już został przetworzony, niezależnie od ustawienia głębokości. Jednak ustawienie niższego `max_handling_depth` zmniejsza szansę na napotkanie cyklu w pierwszej kolejności. + +### Użycie limitu z plikami lokalnymi + +To samo podejście działa dla lokalnych plików HTML: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +Silnik traktuje względne atrybuty `href` lub `src` tak samo jak zdalne URL‑e, stosując limit głębokości również do zasobów systemu plików. + +### Integracja z innymi funkcjami Aspose.HTML + +Jeśli potrzebujesz także kontrolować **czas oczekiwania na pobranie zasobu**, możesz połączyć `ResourceHandlingOptions` z `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Obie opcje są niezależne, więc możesz jednocześnie precyzyjnie dostroić wydajność i bezpieczeństwo. + +## Profesjonalne wskazówki dla środowisk produkcyjnych + +* **Loguj drzewo zasobów** – Podczas debugowania iteruj po `document.resources` i loguj URL oraz poziom każdego zasobu. To pomaga zrozumieć, dlaczego dana strona przekracza Twoje oczekiwania. +* **Cache’uj pobrane zasoby** – Jeśli przetwarzasz te same zewnętrzne zasoby wielokrotnie, włącz cache, aby uniknąć zbędnych wywołań sieciowych. +* **Połącz z białą listą** – Jeśli zaufane są tylko określone domeny, przefiltruj `document.resources` po załadowaniu i odrzuć te, które nie znajdują się na białej liście. +* **Testuj na stronach brzegowych** – Stwórz syntetyczny plik HTML, który importuje łańcuch 10 plików CSS. Zweryfikuj, że Twój limit przycina łańcuch zgodnie z zamierzeniami. + +## Podsumowanie + +Wiesz już, jak **ograniczyć zagnieżdżone zasoby** w Aspose.HTML dla Pythona, konfigurując `ResourceHandlingOptions.max_handling_depth`. Ustawienie limitu głębokości chroni Twoją aplikację przed nadmiernym zużyciem pamięci, długim czasem przetwarzania i potencjalnymi pętlami nieskończonymi wywołanymi przez głęboko zagnieżdżone lub cykliczne odwołania zasobów. + +Od tego momentu możesz: + +* Dostosować głębokość do swojego budżetu wydajności (`resource_handling_options.max_handling_depth`). +* Połączyć limit z timeoutami sieciowymi, cache’owaniem lub białymi listami domen, aby uzyskać solidne potoki. +* Zgłębiać pokrewne tematy, takie jak **resource handling options**, **max handling depth** i **nested resource handling**, aby jeszcze lepiej kontrolować przetwarzanie HTML. + +Eksperymentuj z różnymi wartościami głębokości i obserwuj, jak zmienia się liczba załadowanych zasobów. Gdy będziesz gotowy, włącz ten wzorzec do większej usługi konwersji lub renderowania HTML, aby zapewnić przewidywalne, bezpieczne i wydajne działanie. + +## Co powinieneś nauczyć się dalej? + +Poniższe samouczki obejmują ściśle powiązane tematy, które rozwijają techniki przedstawione w tym przewodniku. Każdy zasób zawiera kompletne, działające przykłady kodu oraz szczegółowe wyjaśnienia krok po kroku, aby pomóc Ci opanować dodatkowe funkcje API i odkrywać alternatywne podejścia implementacyjne w własnych projektach. + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/polish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/polish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..9e4d05277f --- /dev/null +++ b/html/polish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-09-19 +description: Poznaj samouczek html do pdf w Pythonie, który pokazuje, jak szybko generować + pdf z html przy użyciu Aspose.HTML. Skorzystaj z przewodnika krok po kroku już teraz. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: pl +lastmod: 2026-09-19 +og_description: 'samouczek html do pdf: Konwertuj dowolną stronę HTML na plik PDF + przy użyciu Pythona i Aspose.HTML. Ten przewodnik pokazuje, jak w kilka minut wygenerować + PDF z HTML.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Poradnik HTML do PDF w Pythonie – kompletny przewodnik krok po kroku +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Jak wykonać samouczek konwersji HTML do PDF przy użyciu Pythona +url: /pl/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Jak wykonać **html to pdf tutorial** przy użyciu Pythona + +Jeśli potrzebujesz **html to pdf tutorial**, ten przewodnik pokaże Ci dokładnie, jak wygenerować PDF z HTML przy użyciu kilku linijek kodu w Pythonie. Niezależnie od tego, czy automatyzujesz tworzenie raportów, czy eksportujesz treść internetową do czytania offline, biblioteka Aspose.HTML sprawia, że konwersja jest bezproblemowa. + +W tym samouczku dowiesz się, jak skonfigurować środowisko, napisać skrypt konwertujący oraz obsłużyć typowe przypadki brzegowe, takie jak brakujące pliki czy niestandardowe ustawienia strony. Po zakończeniu będziesz wiedział, **jak generować pdf** z dowolnego źródła HTML, nie opuszczając ekosystemu Pythona. + +## Co będzie potrzebne + +Zanim rozpoczniesz, upewnij się, że masz: + +* Python 3.8 lub nowszy zainstalowany +* Aktywną licencję Aspose.HTML for Python (bezpłatna wersja próbna wystarczy do oceny) +* Dostęp do `pip`, aby zainstalować pakiet `aspose-html` +* Prosty plik HTML, który chcesz przekonwertować (np. `input.html`) + +> **Pro tip:** Trzymaj swój HTML i zasoby (obrazy, CSS) w tym samym katalogu, aby uniknąć problemów z rozwiązywaniem ścieżek podczas konwersji. + +## Krok 1: Zainstaluj pakiet Aspose.HTML + +Otwórz terminal i uruchom następujące polecenie: + +```bash +pip install aspose-html +``` + +Pakiet `aspose-html` zawiera wszystkie natywne biblioteki potrzebne do renderowania wysokiej jakości, więc nie są wymagane dodatkowe zależności systemowe. + +## Krok 2: Utwórz minimalny skrypt Pythona + +Utwórz nowy plik o nazwie `convert_html_to_pdf.py` i wklej poniższy kod. Skrypt ten realizuje **html to pdf tutorial** w trzech krokach: import, określenie ścieżek i wywołanie konwersji. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Dlaczego to działa + +* **Importowanie `Converter`** daje dostęp do wysokopoziomowego API, które ukrywa szczegóły silnika renderującego. +* **Określanie ścieżek bezwzględnych** zapobiega błędom związanym ze ścieżkami względnymi, gdy skrypt jest uruchamiany z innego katalogu roboczego. +* **`Converter.convert_html`** wykonuje cały proces renderowania — parsowanie HTML, układ CSS i serializację do PDF — w jednym wywołaniu, co jest zalecaną metodą **jak generować pdf** szybko. + +## Krok 3: Uruchom skrypt i zweryfikuj wynik + +Uruchom skrypt w terminalu: + +```bash +python convert_html_to_pdf.py +``` + +Jeśli wszystko jest poprawnie skonfigurowane, zobaczysz: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Otwórz `output.pdf` w dowolnym przeglądarce PDF. Dokument powinien wyglądać identycznie jak oryginalna strona HTML, łącznie z czcionkami, obrazami i podstawowym formatowaniem CSS. + +![Podgląd wygenerowanego PDF](https://example.com/images/pdf-preview.png "Zrzut ekranu wygenerowanego PDF z HTML przy użyciu Pythona"){: .center-image alt="Zrzut ekranu PDF wygenerowanego z pliku HTML przy użyciu Pythona"} + +## Krok 4: Dostosowywanie konwersji (opcjonalnie) + +Podstawowy **html to pdf tutorial** obejmuje konwersję jeden‑do‑jeden, ale w rzeczywistych scenariuszach często potrzebne są dodatkowe modyfikacje: + +| Wymaganie | Jak to osiągnąć przy użyciu Aspose.HTML | +|-------------|------------------------------------| +| Ustaw rozmiar strony (A4, Letter) | Przekaż obiekt `PdfSaveOptions` do `convert_html` | +| Dodaj marginesy lub nagłówki/stopki | Użyj `PdfPageSettings` w opcjach | +| Osadź własne czcionki | Upewnij się, że pliki czcionek są dostępne i ustaw `FontSettings` | + +Poniżej przykład ustawiający rozmiar strony na A4 i dodający margines 1 cala: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Uwaga:** Korzystanie z własnych opcji jest preferowaną techniką **generowania pdf z html**, gdy potrzebna jest precyzyjna kontrola nad układem. + +## Krok 5: Obsługa wielu plików HTML (konwersja wsadowa) + +Jeśli masz folder pełen raportów HTML, możesz przejść po nich w pętli: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Ten fragment kodu demonstruje skalowalny **python convert html pdf** workflow, który pasuje do potoków CI lub zaplanowanych zadań. + +## Typowe pułapki i jak ich unikać + +| Problem | Przyczyna | Rozwiązanie | +|-------|-------|-----| +| Brak obrazów w PDF | Ścieżki względne do obrazów, które przestają działać po uruchomieniu skryptu z innego folderu | Użyj ścieżek bezwzględnych lub ustaw `base_uri` w opcjach `Converter` | +| CSS nie jest stosowany | Zewnętrzny arkusz stylów odwołuje się do URL, który wymaga dostępu do internetu | Pobierz arkusz stylów lokalnie i odwołuj się do niego ścieżką względną | +| Zastąpienie czcionki | Czcionka nie jest zainstalowana na maszynie hosta | Dołącz plik czcionki do projektu i skonfiguruj `FontSettings` | + +Rozwiązanie tych przypadków brzegowych zapewnia, że Twój proces **export html as pdf** będzie solidny w różnych środowiskach. + +## Pełny, gotowy do uruchomienia przykład + +Poniżej znajduje się kompletny skrypt, który zawiera opcjonalne ustawienia, obsługę błędów oraz logikę przetwarzania wsadowego. Skopiuj go do `full_html_to_pdf.py` i uruchom jak opisano wcześniej. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Uruchomienie tego skryptu wygeneruje PDF dla każdego pliku HTML w docelowym katalogu, stosując spójne ustawienia strony — kompletną **python convert html pdf** rozwiązanie gotowe do produkcji. + +## Zakończenie + +Masz teraz praktyczny **html to pdf tutorial**, który pokazuje, jak generować pliki PDF z HTML przy użyciu Pythona i Aspose.HTML. Poradnik obejmował konfigurację środowiska, minimalny skrypt konwertujący, opcjonalne dostosowania, przetwarzanie wsadowe oraz wskazówki diagnostyczne. + +Od tego momentu możesz zgłębiać tematy pokrewne, takie jak **jak generować pdf** z znakami wodnymi, łączenie wielu PDF‑ów czy konwersja HTML do innych formatów, np. DOCX. Eksperymentuj z API `PdfSaveOptions`, aby dopracować wyjście, i integruj skrypt z usługami webowymi lub zautomatyzowanymi pipeline’ami raportowania. + +Miłego kodowania i przyjemności z zamieniania treści HTML w eleganckie PDF‑y! + + +## Co powinieneś nauczyć się dalej? + + +Poniższe samouczki obejmują tematy ściśle powiązane, które rozwijają techniki przedstawione w tym przewodniku. Każdy zasób zawiera kompletne, działające przykłady kodu oraz wyjaśnienia krok po kroku, aby pomóc Ci opanować dodatkowe funkcje API i odkrywać alternatywne podejścia w własnych projektach. + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [How to Convert HTML to PDF Java – Using Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/portuguese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/portuguese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..c7bb2b891e --- /dev/null +++ b/html/portuguese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,260 @@ +--- +category: general +date: 2026-09-19 +description: Aprenda como mudar o título em um arquivo HTML com Python. Este guia + aborda a leitura de HTML, a atualização da tag de título e a gravação do HTML modificado. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: pt +lastmod: 2026-09-19 +og_description: Como alterar o título em um arquivo HTML com Python. Siga este exemplo + completo para ler o HTML, atualizar a tag de título e salvar o documento modificado. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Como alterar o título em um arquivo HTML usando Python – guia passo a passo +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Como alterar o título em um arquivo HTML usando Python +url: /pt/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Como alterar o título em um arquivo HTML usando Python + +Se você precisa **how to change title** em um documento HTML programaticamente, o Python torna a tarefa simples. Neste tutorial você lerá um arquivo HTML, atualizará o elemento `<title>` e salvará o HTML modificado de volta ao disco — tudo com código claro e executável. + +Alterar o título da página é uma etapa comum ao gerar sites estáticos, personalizar páginas raspadas ou automatizar atualizações de SEO. Ao final deste guia você saberá como **update html title**, como **read html with python**, e como **save modified html** com segurança. + +## Pré-requisitos + +- Python 3.8 ou mais recente instalado +- O pacote `beautifulsoup4` (`pip install beautifulsoup4`) +- Um arquivo HTML que você deseja editar (o exemplo usa `index.html` em uma pasta de sua escolha) + +Nenhum serviço externo é necessário; tudo roda localmente. + +## Etapa 1: Carregar o arquivo HTML com Python + +A primeira tarefa é **load html file python**‑style. Usar `BeautifulSoup` fornece um parser tolerante que funciona com marcação imperfeita. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Por que esta etapa importa:* +`BeautifulSoup` constrói uma representação em árvore, permitindo que você consulte e modifique elementos sem manipulação manual de strings. O `html.parser` embutido é rápido e não requer binários extras. + +## Etapa 2: Localizar o elemento `<title>` + +Documentos HTML geralmente contêm uma única tag `<title>` dentro de `<head>`. Recuperamos a primeira ocorrência, o que satisfaz o requisito de **update html title**. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Por que verificamos `None`*: +Alguns fragmentos HTML omitem o título. Adicioná‑lo automaticamente evita erros posteriores e mantém o script robusto. + +## Etapa 3: Alterar o texto do título + +Agora nós **update html title** atribuindo um novo texto à string da tag. Este é o núcleo da operação **how to change title**. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +O atributo `string` representa o nó de texto dentro de `<title>`. Sobrescrevê‑lo atualiza o DOM na memória. + +## Etapa 4: Salvar o HTML modificado + +Finalmente, escreva o documento alterado em um novo arquivo. Isso cumpre a etapa **save modified html** e deixa o original intacto. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` formata a saída com indentação, facilitando a leitura do arquivo após a alteração. + +### Saída esperada + +Executando o script em um `index.html` de exemplo que originalmente contém: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +produz uma saída no console semelhante a: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +O `index_modified.html` salvo agora começará com: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Script completo para copiar‑e‑colar rápido + +Abaixo está o programa completo, pronto‑para‑executar, que combina todas as quatro etapas. Salve‑o como `change_title.py` e ajuste `YOUR_DIRECTORY` conforme necessário. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Execute o script: + +```bash +python change_title.py +``` + +Você verá as mensagens no console e um novo arquivo `index_modified.html` com o título atualizado. + +## Dicas adicionais e casos limites + +| Situação | O que fazer | +|-----------|------------| +| **Múltiplas tags `<title>`** | `soup.find_all("title")` retorna uma lista; atualize o primeiro elemento ou itere se precisar alterar todos. | +| **Problemas de codificação** | Abra arquivos com `encoding="utf-8-sig"` se houver um BOM, ou detecte a codificação com `chardet`. | +| **Arquivos HTML grandes** | Use o parser `lxml` (`BeautifulSoup(html_content, "lxml")`) para melhor desempenho. | +| **Preservar a formatação original** | Se precisar manter o espaçamento exato, escreva `str(soup)` em vez de `prettify()`. | +| **Automatizar em vários arquivos** | Envolva a lógica em uma função e itere sobre `Path.rglob("*.html")`. | + +Essas variações mantêm a lógica central **how to change title** intacta enquanto se adaptam a projetos do mundo real. + +## Conclusão + +Agora você sabe como **how to change title** em qualquer documento HTML usando Python. O tutorial abordou a leitura de HTML, a localização da tag `<title>`, a atualização de seu texto e **saving modified html** com segurança. Com o script completo você pode integrar esse padrão em geradores de sites estáticos, pipelines de SEO ou qualquer automação que exija alterações dinâmicas de título. + +Em seguida, explore tópicos relacionados como **read html with python** para extrair meta tags, ou técnicas de **load html file python** para lidar com marcação malformada. Experimente o processamento em lote para atualizar títulos em todo um site — sua nova habilidade é a base para muitas tarefas de automação web. Feliz codificação! + +## O que você deve aprender a seguir? + +Os tutoriais a seguir abordam tópicos estreitamente relacionados que se baseiam nas técnicas demonstradas neste guia. Cada recurso inclui exemplos de código completos e funcionais com explicações passo a passo para ajudá‑lo a dominar recursos adicionais da API e explorar abordagens de implementação alternativas em seus próprios projetos. + +- [Como salvar HTML com Aspose.Html – Guia completo em C#](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [Como salvar HTML em C# – Guia completo usando um manipulador de recursos personalizado](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [Como renderizar HTML para PNG – Guia completo passo a passo](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/portuguese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/portuguese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..e4ff9106fe --- /dev/null +++ b/html/portuguese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,205 @@ +--- +category: general +date: 2026-09-19 +description: Converter arquivo HTML local para PDF usando Python e Aspose.HTML – um + guia completo passo a passo que também aborda opções de conversão de HTML para PDF + em Python. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: pt +lastmod: 2026-09-19 +og_description: Converta um arquivo HTML local para PDF usando Python. Aprenda a melhor + forma de converter HTML para PDF com Python usando Aspose.HTML, incluindo incorporação + de fontes e tratamento de erros. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Converter um arquivo HTML local para PDF com Python – guia completo +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Como converter um arquivo HTML local em PDF com Python +url: /pt/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Como converter um arquivo HTML local para PDF com Python + +Se você precisa **converter arquivo HTML local para PDF** em um projeto Python, este tutorial mostra uma solução pronta‑para‑usar. Você verá como configurar a biblioteca Aspose.HTML, definir as opções de PDF e executar a conversão em apenas algumas linhas de código. O guia também explica as melhores práticas de **convert html to pdf python**, para que você possa adaptar o código ao seu próprio fluxo de trabalho. + +Os passos abaixo cobrem tudo o que você precisa saber: instalar o SDK, preparar as opções de salvamento, lidar com armadilhas comuns e verificar a saída. Ao final do artigo, você terá uma função reutilizável que pode ser inserida em qualquer aplicação Python. + +## Pré-requisitos + +Antes de começar, certifique‑se de que você tem: + +* Python 3.8 ou mais recente instalado na sua máquina. +* Uma licença ativa do Aspose.HTML for Python (a avaliação gratuita funciona para testes). +* Um arquivo HTML local que você deseja transformar em PDF (por exemplo, `page.html`). + +Você não precisa de dependências adicionais ao nível do sistema; o SDK inclui tudo o que é necessário para a geração de PDF. + +## Instalar o pacote Aspose.HTML + +O SDK Aspose.HTML é distribuído via PyPI. Instale‑o com `pip` no seu ambiente virtual: + +```bash +pip install aspose-html +``` + +Executar o comando exibe a versão instalada, confirmando que o pacote está disponível para importação. + +## Etapa 1: Importar as classes necessárias + +O fluxo de conversão depende de duas classes principais: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` fornece o método estático `convert_html` que realiza a transformação real. +* `PDFSaveOptions` permite ajustar finamente a saída PDF, como incorporar fontes padrão. + +## Etapa 2: Criar opções de salvamento PDF e habilitar a incorporação de fontes padrão + +Incorporar fontes garante que o PDF gerado tenha a mesma aparência em qualquer dispositivo, mesmo que o visualizador não tenha as fontes instaladas localmente. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Definir `embed_standard_fonts` como `True` é recomendado para a maioria dos cenários de produção, pois elimina avisos de substituição de fontes em leitores de PDF. + +## Etapa 3: Converter o arquivo HTML para PDF usando as opções configuradas + +Agora chame `Converter.convert_html`, passando o caminho do HTML de origem, o caminho do PDF de destino e o objeto de opções que você preparou: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Se a conversão for bem‑sucedida, o método retorna `None` e o arquivo PDF aparece no local especificado. + +## Exemplo completo em uma função reutilizável + +Encapsular a lógica em uma função facilita a reutilização em vários projetos: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Por que a função ajuda + +* **Validação de entrada** – O `FileNotFoundError` facilita a depuração quando o caminho do HTML está errado. +* **Criação automática de diretórios** – `os.makedirs(..., exist_ok=True)` impede erros de “diretório não existe”. +* **Incorporação de fontes configurável** – Você pode desativar a incorporação de fontes para arquivos menores se souber que o ambiente de destino já possui as fontes necessárias. + +## Casos de borda comuns e como tratá‑los + +| Situação | Tratamento recomendado | +|-----------|----------------------| +| **HTML contém CSS ou imagens externas** | Use URLs absolutas ou copie os recursos ao lado do arquivo HTML; Aspose.HTML segue as mesmas regras de um navegador. | +| **Arquivos HTML grandes (>10 MB)** | Aumente o limite de memória padrão definindo `pdf_options.memory_limit` se encontrar `OutOfMemoryException`. | +| **Você precisa de PDFs protegidos por senha** | Defina `pdf_options.encryption_details` com uma senha de usuário antes de chamar `convert_html`. | +| **Executando em um servidor sem interface gráfica** | Nenhuma configuração adicional é necessária; o SDK não depende de uma interface gráfica. | + +Abordar esses cenários antecipadamente evita erros inesperados em tempo de execução. + +## Verificando o resultado da conversão + +Depois que o script terminar, abra o PDF gerado com qualquer visualizador (Adobe Reader, Chrome, etc.). O layout visual deve corresponder ao HTML original, e todas as fontes devem aparecer corretamente porque foram incorporadas. + +Você também pode confirmar programaticamente que o arquivo existe e tem tamanho diferente de zero: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Dicas avançadas para uso em produção + +* **Processamento em lote** – Percorra uma lista de arquivos HTML e chame `html_to_pdf` para cada um; reutilize uma única instância de `PDFSaveOptions` para reduzir a sobrecarga de criação de objetos. +* **Logging** – Integre o módulo `logging` do Python para capturar timestamps de conversão e quaisquer exceções. +* **Desempenho** – Ao converter muitos arquivos, considere executar conversões em paralelo usando `concurrent.futures.ThreadPoolExecutor`, mas lembre‑se de que o SDK é thread‑safe apenas para chamadas separadas de `Converter`. + +## Conclusão + +Agora você tem um método completo e pronto para produção para **converter arquivo HTML local para PDF** usando Python. A solução cobre as etapas essenciais — instalar o Aspose.HTML, configurar as opções de PDF, lidar com casos de borda comuns e verificar a saída — além de demonstrar o fluxo de trabalho mais amplo de **convert html to pdf python**. + +A partir daqui, você pode explorar recursos avançados como criptografia de PDF, tamanhos de página personalizados ou adição de marcas d'água, todos suportados pelo mesmo SDK. Experimente as opções que melhor se adequam ao seu projeto e você poderá automatizar a conversão de HTML para PDF de forma confiável em qualquer ambiente Python. + +--- + + +## O que você deve aprender a seguir? + +Os tutoriais a seguir abordam tópicos estreitamente relacionados que se baseiam nas técnicas demonstradas neste guia. Cada recurso inclui exemplos de código completos e funcionais com explicações passo a passo para ajudá‑lo a dominar recursos adicionais da API e explorar abordagens de implementação alternativas em seus próprios projetos. + +- [Converter HTML para PDF com Aspose.HTML – Guia Completo Passo a Passo](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Converter HTML para PDF com Aspose.HTML – Guia Completo de Manipulação](/html/english/) +- [Converter HTML para PDF em .NET com Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/portuguese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/portuguese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..6d86ce0477 --- /dev/null +++ b/html/portuguese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Aprenda a converter HTML para Markdown em Python. Este tutorial mostra + como salvar HTML como Markdown e gerar Markdown a partir de HTML rapidamente. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: pt +lastmod: 2026-09-19 +og_description: Converta HTML para Markdown com Python. Siga este guia para salvar + HTML como Markdown, gerar Markdown a partir de HTML e criar um arquivo de HTML para + Markdown. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Converter HTML para Markdown em Python – guia completo de programação +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Como converter HTML para Markdown com Python – guia passo a passo +url: /pt/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Como converter HTML para Markdown com Python – guia passo a passo + +Se você precisa **converter HTML para Markdown**, este guia mostra todo o processo. Você verá como **salvar HTML como Markdown**, gerar Markdown a partir de HTML e produzir um *arquivo html para markdown* que pode ser usado em geradores de sites estáticos, pipelines de documentação ou qualquer fluxo de trabalho que prefira marcação em texto puro. + +O tutorial cobre tudo, desde a instalação da biblioteca necessária até o tratamento de casos especiais, como imagens incorporadas e formatação personalizada. Ao final, você terá um script pronto‑para‑executar e uma compreensão clara do porquê de cada etapa. + +## Pré‑requisitos + +Antes de começar, certifique‑se de que você tem: + +- Python 3.8 ou mais recente instalado na sua máquina. +- Familiaridade básica com scripts em Python. +- Acesso a um terminal ou prompt de comando. +- A biblioteca `aspose.html` (ou qualquer pacote compatível de HTML‑para‑Markdown). Este tutorial usa **Aspose.HTML for Python via .NET**, que fornece as classes `HTMLDocument`, `MarkdownSaveOptions` e `Converter` mostradas no exemplo de código. + +> **Dica profissional:** Se preferir uma solução puramente em Python, você pode substituir `aspose.html` pelo pacote `html2text`. O fluxo geral permanece o mesmo. + +## Etapa 1: Instalar a biblioteca de conversão + +Primeiro, instale a biblioteca que fornece `HTMLDocument`, `MarkdownSaveOptions` e `Converter`. Execute o comando a seguir: + +```bash +pip install aspose-html +``` + +O pacote inclui o motor nativo necessário para **gerar markdown a partir de html** de forma rápida e com alta fidelidade. A instalação normalmente termina em menos de um minuto em uma conexão de banda larga padrão. + +## Etapa 2: Carregar o documento HTML de origem + +Carregar o arquivo HTML é a primeira ação concreta no pipeline de conversão. A classe `HTMLDocument` analisa o arquivo e constrói um DOM em memória, que o conversor percorrerá posteriormente para produzir o Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Por que isso importa:** Ao criar um objeto `HTMLDocument`, você garante que estruturas complexas—tabelas, listas e estilos inline—sejam interpretadas corretamente antes da conversão. Pular esta etapa faria o conversor ler texto bruto, resultando em perda de formatação. + +## Etapa 3: Configurar as opções de salvamento do Markdown + +O objeto `MarkdownSaveOptions` permite ajustar finamente o formato de saída. Para produzir **Git‑flavored Markdown**, defina a propriedade `formatter` como `"GIT"`. Isso corresponde à sintaxe usada por plataformas como GitHub, GitLab e Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Você também pode ajustar outras configurações, como `preserve_links` ou `code_block_style`, dependendo de como pretende **salvar html como markdown** em ferramentas posteriores. + +## Etapa 4: Converter o HTML para Markdown e salvar o resultado + +Com o documento carregado e as opções configuradas, invoque o método estático `convert_html`. Esse método lê o DOM, aplica o formatador escolhido e grava o arquivo de saída. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Após executar o script, você encontrará um novo arquivo chamado `output.md` no diretório especificado. Abrindo‑o, verá um Markdown limpo e compatível com Git, pronto para controle de versão ou publicação. + +## Etapa 5: Verificar o arquivo Markdown gerado + +Uma verificação rápida ajuda a confirmar que a conversão foi bem‑sucedida e que o **arquivo html para markdown** contém o conteúdo esperado. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +A saída típica para uma página HTML simples é: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Se notar cabeçalhos ausentes ou listas malformadas, retorne à **Etapa 3** e experimente valores diferentes para `formatter` (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Avançado: Tratamento de imagens e caminhos relativos + +Quando o HTML de origem contém imagens, o conversor pode incorporá‑las como URIs de dados ou preservar os atributos `src` originais. Para manter o processo de **gerar markdown a partir de html** leve, talvez você queira copiar os arquivos de imagem para uma pasta paralela e ajustar os caminhos. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Após a conversão, o Markdown referenciará imagens como `![Alt text](images/picture.png)`. Essa abordagem funciona bem quando você posteriormente **salva html como markdown** em um gerador de sites estáticos que espera ativos em uma pasta dedicada. + +## Script completo que você pode copiar‑colar + +Abaixo está o script completo e executável que incorpora todas as etapas discutidas. Salve‑o como `convert_html_to_md.py` e execute com `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Saída esperada + +Executar o script imprime uma mensagem de confirmação seguida pelas primeiras dez linhas do arquivo Markdown, como mostrado anteriormente. O `output.md` gerado pode ser aberto em qualquer editor de texto, visualizado no VS Code ou enviado para um repositório Git. + +## Perguntas comuns e tratamento de casos‑especiais + +| Pergunta | Resposta | +|----------|----------| +| **E se o arquivo HTML for grande (> 10 MB)?** | A classe `HTMLDocument` faz streaming da entrada, de modo que o uso de memória permanece moderado. Contudo, considere aumentar o limite de memória do processo Python se encontrar `MemoryError`. | +| **Posso converter uma string HTML em vez de um arquivo?** | Sim. Use `HTMLDocument.from_string(html_string)` (ou o construtor equivalente) antes de chamar `Converter.convert_html`. | +| **Como manter os comentários HTML originais?** | Defina `md_options.preserve_comments = True`. Os comentários aparecerão como comentários HTML (`<!-- … -->`) dentro do arquivo Markdown. | +| **É possível direcionar para um dialeto Markdown diferente?** | Altere `md_options.formatter` para `"COMMONMARK"` ou `"MARKDOWN_EXTRA"` conforme a plataforma alvo. | +| **Preciso instalar o runtime .NET separadamente?** | O pacote `aspose-html` inclui o runtime necessário para a maioria das plataformas. No Linux, assegure‑se de que `libgdiplus` esteja instalado (`sudo apt-get install libgdiplus`). | + +## Conclusão + +Agora você sabe como **converter HTML para Markdown** usando Python, como **salvar html como markdown** e como **gerar markdown a partir de html** com controle detalhado sobre formatação e ativos. O script demonstra o fluxo completo—from carregar o arquivo de origem até produzir um *arquivo html para markdown* limpo, pronto para controle de versão ou publicação. + +Em seguida, explore tópicos relacionados, como **converter em lote vários arquivos HTML**, integrar a etapa de conversão em um pipeline CI/CD ou personalizar a saída Markdown para geradores de sites estáticos específicos como Hugo ou Jekyll. Experimente as diversas configurações de `MarkdownSaveOptions` para adequar o resultado ao guia de estilo do seu projeto. + +Boa conversão! + +## O que você deve aprender a seguir? + +Os tutoriais a seguir abordam assuntos intimamente relacionados que ampliam as técnicas demonstradas neste guia. Cada recurso inclui exemplos de código completos e explicações passo a passo para ajudá‑lo a dominar recursos adicionais da API e explorar abordagens alternativas em seus próprios projetos. + +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/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/portuguese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/portuguese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..3f715d7800 --- /dev/null +++ b/html/portuguese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Como habilitar recursos ao converter HTML para Markdown usando Python. + Aprenda a converter documentos HTML e salvar HTML como Markdown com controle preciso + de recursos. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: pt +lastmod: 2026-09-19 +og_description: Como habilitar recursos ao converter HTML para Markdown. Este guia + mostra passo a passo como converter um documento HTML e salvar HTML como Markdown + com controle detalhado. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Como habilitar recursos ao converter HTML para Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Como habilitar recursos ao converter HTML para Markdown +url: /pt/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Como habilitar recursos ao converter HTML para Markdown + +Se você precisa **how to enable features** durante uma conversão, este guia fornece uma solução completa e executável. Você verá exatamente como converter HTML para Markdown, controlar quais recursos do Markdown são emitidos e salvar HTML como Markdown em uma única passagem. + +O exemplo usa o popular **GroupDocs.Conversion** Python SDK, mas os conceitos se aplicam a qualquer biblioteca que permita configurar conjuntos de recursos. Ao final deste tutorial você poderá converter um documento HTML, manter apenas links e parágrafos e evitar tabelas, imagens ou blocos de código indesejados. + +## O que você alcançará + +* **how to enable features** nas opções de salvamento do Markdown +* um fluxo de trabalho claro **convert html to markdown** +* a capacidade de **how to convert html** com saída seletiva +* um script pronto‑para‑executar que **convert html document** e **save html as markdown** + +### Pré-requisitos + +* Python 3.8+ instalado +* pacote `groupdocs-conversion` (instale com `pip install groupdocs-conversion`) +* Um arquivo HTML de exemplo (`sample.html`) em um diretório conhecido + +--- + +## Como habilitar recursos na conversão para Markdown + +O primeiro passo é criar um objeto `MarkdownSaveOptions` e informar ao conversor quais elementos você deseja manter. Neste tutorial habilitamos apenas **links** e **paragraphs**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Por que isso funciona:** +* `HTMLDocument` encapsula o arquivo de origem para que o conversor possa lê-lo. +* `MarkdownSaveOptions` contém todas as configurações de conversão; a lista `features` é a propriedade chave que **how to enable features**. +* Ao atribuir `["Link", "Paragraph"]` você indica ao motor que emita apenas links Markdown (`[text](url)`) e parágrafos simples, descartando imagens, tabelas e outras marcações. +* `Converter.convert_html` executa a operação real de **convert html to markdown** e grava o resultado em `sample.md`. + +--- + +## Como converter documento HTML com opções personalizadas + +Se mais tarde você precisar adicionar mais sinalizadores de recurso—como `"Header"` ou `"Bold"`—basta estender a lista: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +A mesma chamada para `Converter.convert_html` agora incluirá esses elementos adicionais. Esse padrão permite que você **how to convert html** de forma altamente configurável sem escrever analisadores personalizados. + +--- + +## Como salvar HTML como Markdown em uma pasta específica + +O método `convert_html` aceita um caminho de saída absoluto ou relativo. Para **save html as markdown** em uma subpasta chamada `output`, ajuste o terceiro argumento: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Executar o script cria o diretório `output` (se ele não existir) e grava o arquivo Markdown lá. Essa abordagem mantém seu HTML de origem e o Markdown gerado organizados de forma limpa. + +--- + +## Script completo que você pode copiar‑colar + +Abaixo está o programa completo, pronto para ser executado. Substitua `YOUR_DIRECTORY` pelo caminho que contém `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Saída esperada** (impressa no console): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Abra `sample.md` e você verá apenas links Markdown e parágrafos simples, por exemplo: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Todos os outros elementos HTML foram omitidos porque **how to enable features** limitou a saída aos dois tipos selecionados. + +--- + +## Perguntas comuns e casos extremos + +| Pergunta | Resposta | +|----------|--------| +| *E se o arquivo HTML não contiver links?* | O conversor ainda grava os parágrafos; a saída conterá texto simples sem sintaxe de link. | +| *Posso desativar todos os recursos?* | Definir `markdown_options.features = []` resulta em um arquivo Markdown vazio. Use isso apenas para testes. | +| *Como o SDK lida com HTML inválido?* | O analisador tenta limpar marcações malformadas antes de aplicar o filtro de recursos. Erros são registrados, mas não interrompem a conversão. | +| *É possível manter imagens e remover tabelas?* | Sim. Defina `markdown_options.features = ["Link", "Paragraph", "Image"]`. A lista de recursos é aditiva, não exclusiva. | +| *E se eu precisar converter muitos arquivos em uma pasta?* | Envolva a lógica de conversão em um loop que itere sobre `Path.glob("*.html")`. A mesma configuração **how to enable features** pode ser reutilizada para cada arquivo. | + +**Dica profissional:** Ao processar grandes lotes, instancie `MarkdownSaveOptions` uma única vez e reutilize‑a. Isso reduz a sobrecarga de criação de objetos e mantém o pipeline **convert html to markdown** rápido. + +--- + +## Conclusão + +Agora você sabe **how to enable features** ao **convert html to markdown**, como **how to convert html** com saída seletiva e como **convert html document** e **save html as markdown** usando um script Python conciso. Ao configurar `MarkdownSaveOptions.features`, você obtém controle total sobre os elementos Markdown que aparecem no arquivo final. + +### Próximos passos + +* Explore sinalizadores de recurso adicionais como `"Header"`, `"Bold"` e `"Italic"` para enriquecer sua saída Markdown. +* Combine este script com um observador de arquivos (por exemplo, `watchdog`) para converter automaticamente novos arquivos HTML à medida que chegam. +* Revise a [documentação do GroupDocs.Conversion Python SDK](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) para cenários avançados como conversões de PDF‑para‑Markdown ou DOCX‑para‑HTML. + +Sinta-se à vontade para experimentar diferentes conjuntos de recursos e compartilhar suas descobertas com a comunidade. Boa conversão! + +## O que você deve aprender a seguir? + +Os tutoriais a seguir abordam tópicos intimamente relacionados que se baseiam nas técnicas demonstradas neste guia. Cada recurso inclui exemplos de código completos e funcionais com explicações passo a passo para ajudá-lo a dominar recursos adicionais da API e explorar abordagens de implementação alternativas em seus próprios projetos. + +- [Converter HTML para Markdown no Aspose.HTML para Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown para HTML Java - Converter com Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [Como habilitar JavaScript no Aspose HTML – Carregar HTML e obter texto](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/portuguese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/portuguese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..0632401b05 --- /dev/null +++ b/html/portuguese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,245 @@ +--- +category: general +date: 2026-09-19 +description: Aprenda como limitar recursos aninhados no Aspose.HTML para Python usando + ResourceHandlingOptions. Controle a profundidade máxima de manipulação e evite loops + infinitos. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: pt +lastmod: 2026-09-19 +og_description: Limite recursos aninhados no Aspose.HTML para Python usando ResourceHandlingOptions. + Defina a profundidade máxima de manipulação para evitar recursão profunda e melhorar + o desempenho. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Como limitar recursos aninhados no Aspose.HTML para Python – guia passo + a passo +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Como limitar recursos aninhados ao processar HTML com Aspose.HTML para Python +url: /pt/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Como limitar recursos aninhados ao processar HTML com Aspose.HTML para Python + +Se você precisar **limitar recursos aninhados** ao renderizar ou converter HTML, este guia mostra os passos exatos para configurar o Aspose.HTML para Python. Controlar a profundidade do tratamento de recursos evita recursões descontroladas quando uma página inclui muitas camadas de referências a CSS, JavaScript ou imagens. + +Limitar recursos aninhados é especialmente importante para rastreadores em grande escala, pipelines de renderização de e‑mail ou qualquer fluxo de trabalho automatizado que precise permanecer dentro dos limites de memória e tempo. Nas seções a seguir, você aprenderá por que deve definir um limite de profundidade, como usar a classe `ResourceHandlingOptions` e como verificar se o limite funciona como esperado. + +## Por que você deve limitar recursos aninhados + +Documentos HTML costumam referenciar outros recursos — folhas de estilo, scripts, imagens, fontes ou até outros arquivos HTML. Cada um desses recursos pode, por sua vez, referenciar arquivos adicionais, formando uma árvore de dependências. Sem uma proteção, a árvore pode se tornar arbitrariamente profunda: + +* Uma página carrega um arquivo CSS que importa outro CSS, que importa outro, e assim por diante. +* JavaScript pode carregar dinamicamente scripts adicionais. +* Um modelo de e‑mail pode incorporar imagens que referenciam URLs externas que redirecionam para mais ativos. + +Quando a profundidade da recursão cresce sem controle, você corre o risco de: + +* **Consumo excessivo de memória** – cada recurso buscado ocupa buffers. +* **Tempos de processamento mais longos** – a latência de rede se multiplica a cada nível. +* **Possíveis loops infinitos** – referências circulares podem fazer o motor nunca retornar. + +Definir uma **profundidade máxima de tratamento** indica ao Aspose.HTML que pare de seguir links de recursos após um determinado número de níveis, garantindo desempenho previsível. + +## Como limitar recursos aninhados no Aspose.HTML para Python + +O Aspose.HTML fornece a classe `ResourceHandlingOptions`, que contém a propriedade `max_handling_depth`. Ao atribuir um valor numérico (por exemplo, `3`), você instrui o motor a parar após três níveis aninhados. + +Abaixo está um exemplo completo e executável que demonstra todo o fluxo de trabalho: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Explicação de cada passo + +1. **Instalar o pacote** – O wheel `aspose-html` é necessário. O comando `pip install` é mostrado como comentário para completude. +2. **Importar classes** – `HtmlDocument` carrega a página, `ResourceHandlingOptions` contém o limite e `HtmlLoadOptions` une os dois. +3. **Criar o objeto de opções** – Instanciar `ResourceHandlingOptions` fornece um contêiner mutável. +4. **Definir `max_handling_depth`** – Atribua `3` (ou qualquer inteiro) para restringir o motor a três níveis de recursos aninhados. Este é o núcleo da **limitação de recursos aninhados**. +5. **Anexar opções à configuração de carregamento** – `HtmlLoadOptions` permite passar `resource_options` para o carregador. +6. **Carregar o HTML** – O construtor de `HtmlDocument` aceita uma URL ou um caminho de arquivo junto com `load_options`. O motor agora respeita o limite de profundidade. +7. **Verificar** – Ao iterar sobre `document.resources`, você pode ver quantos recursos foram realmente buscados e o nível mais profundo encontrado. Se o nível mais profundo for `3` ou menor, o limite funcionou. +8. **Salvar** – Persista o documento processado. O arquivo salvo contém apenas os recursos até a profundidade permitida. + +#### Saída esperada + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +Os números variarão conforme a página de origem, mas o nível mais profundo nunca deverá exceder `3` porque definimos `max_handling_depth = 3`. + +## Variações comuns e casos de borda + +### Alterando o limite de profundidade + +Você pode precisar de um limite mais profundo ou mais raso dependendo do seu ambiente: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Desativando o limite completamente + +Definir a propriedade como `0` indica ao Aspose.HTML para **remover qualquer restrição de profundidade**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Faça isso somente quando tiver certeza de que o HTML de origem se comporta corretamente. + +### Lidando com referências circulares + +Mesmo com um limite de profundidade, referências circulares ainda podem aparecer no mesmo nível. O Aspose.HTML detecta ciclos e interrompe o carregamento de um recurso que já foi processado, independentemente da configuração de profundidade. Contudo, definir um `max_handling_depth` menor reduz a chance de encontrar um ciclo inicialmente. + +### Usando o limite com arquivos locais + +A mesma abordagem funciona para arquivos HTML locais: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +O motor trata atributos `href` ou `src` relativos da mesma forma que URLs remotas, aplicando o limite de profundidade também aos recursos do sistema de arquivos. + +### Integrando com outros recursos do Aspose.HTML + +Se você também precisar controlar **o tempo limite de download de recursos**, pode combinar `ResourceHandlingOptions` com `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Ambas as opções são independentes, permitindo afinar desempenho e segurança simultaneamente. + +## Dicas avançadas para uso em produção + +* **Registre a árvore de recursos** – Ao depurar, itere sobre `document.resources` e registre a URL e a profundidade de cada recurso. Isso ajuda a entender por que uma página específica excede suas expectativas. +* **Cache de recursos buscados** – Se você processar os mesmos ativos externos repetidamente, habilite cache para evitar chamadas de rede redundantes. +* **Combine com uma lista de permissões** – Se apenas certos domínios forem confiáveis, filtre `document.resources` após o carregamento e descarte os que estiverem fora da whitelist. +* **Teste com páginas de caso extremo** – Crie um HTML sintético que importe uma cadeia de 10 arquivos CSS. Verifique se o seu limite trunca a cadeia conforme o esperado. + +## Conclusão + +Agora você sabe como **limitar recursos aninhados** no Aspose.HTML para Python configurando `ResourceHandlingOptions.max_handling_depth`. Definir um limite de profundidade protege sua aplicação contra uso excessivo de memória, tempos de processamento longos e possíveis loops infinitos causados por referências de recursos profundamente aninhadas ou circulares. + +A partir de agora você pode: + +* Ajustar a profundidade para atender ao seu orçamento de desempenho (`resource_handling_options.max_handling_depth`). +* Combinar o limite com tempos limite de rede, cache ou listas de permissões de domínio para pipelines robustos. +* Explorar tópicos relacionados, como **resource handling options**, **max handling depth** e **nested resource handling**, para controlar ainda mais o processamento de HTML. + +Experimente diferentes valores de profundidade e observe como a contagem de recursos carregados muda. Quando estiver pronto, integre esse padrão ao seu serviço maior de conversão ou renderização de HTML para garantir execução previsível, segura e eficiente. + +## O que você deve aprender a seguir? + +Os tutoriais a seguir abordam tópicos intimamente relacionados que ampliam as técnicas demonstradas neste guia. Cada recurso inclui exemplos de código completos e funcionais com explicações passo a passo para ajudá‑lo a dominar recursos adicionais da API e explorar abordagens alternativas de implementação em seus próprios projetos. + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/portuguese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/portuguese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..f64e4738f8 --- /dev/null +++ b/html/portuguese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,259 @@ +--- +category: general +date: 2026-09-19 +description: Aprenda um tutorial de HTML para PDF em Python que mostra como gerar + PDF a partir de HTML rapidamente com Aspose.HTML. Siga o guia passo a passo agora. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: pt +lastmod: 2026-09-19 +og_description: 'tutorial html para pdf: Converta qualquer página HTML em um arquivo + PDF usando Python e Aspose.HTML. Este guia mostra como gerar PDF a partir de HTML + em minutos.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Tutorial de HTML para PDF em Python – guia completo passo a passo +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Como fazer um tutorial de HTML para PDF usando Python +url: /pt/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Como realizar um tutorial de html para pdf usando Python + +Se você precisa de um **html to pdf tutorial**, este guia mostra exatamente como gerar um PDF a partir de HTML com apenas algumas linhas de código Python. Seja automatizando a criação de relatórios ou exportando conteúdo web para leitura offline, a biblioteca Aspose.HTML torna a conversão simples. + +Neste tutorial você aprenderá como configurar o ambiente, escrever o script de conversão e lidar com casos de borda comuns, como arquivos ausentes ou configurações de página personalizadas. Ao final, você poderá **how to generate pdf** arquivos a partir de qualquer fonte HTML sem sair do ecossistema Python. + +## O que você precisará + +* Python 3.8 ou mais recente instalado +* Uma licença ativa do Aspose.HTML for Python (uma avaliação gratuita funciona para avaliação) +* Acesso ao `pip` para instalar o pacote `aspose-html` +* Um arquivo HTML simples que você deseja converter (por exemplo, `input.html`) + +> **Dica profissional:** Mantenha seu HTML e recursos (imagens, CSS) no mesmo diretório para evitar problemas de resolução de caminhos durante a conversão. + +## Etapa 1: Instalar o pacote Aspose.HTML + +Abra um terminal e execute o seguinte comando: + +```bash +pip install aspose-html +``` + +O wheel `aspose-html` inclui as bibliotecas nativas necessárias para renderização de alta qualidade, portanto nenhuma dependência de sistema adicional é necessária. + +## Etapa 2: Criar um script Python mínimo + +Crie um novo arquivo chamado `convert_html_to_pdf.py` e cole o código abaixo. Este script segue o padrão do **html to pdf tutorial** de um processo de três etapas: importação, definição de caminhos e invocação da conversão. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Por que isso funciona + +* **Importar `Converter`** fornece acesso a uma API de alto nível que abstrai o motor de renderização. +* **Definir caminhos absolutos** evita bugs de caminhos relativos quando o script é executado a partir de um diretório de trabalho diferente. +* **`Converter.convert_html`** executa todo o pipeline de renderização — análise de HTML, layout CSS e serialização PDF — em uma única chamada, que é a forma recomendada de **how to generate pdf** rapidamente. + +## Etapa 3: Executar o script e verificar a saída + +Execute o script a partir do terminal: + +```bash +python convert_html_to_pdf.py +``` + +Se tudo estiver configurado corretamente, você verá: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Abra `output.pdf` com qualquer visualizador de PDF. O documento deve ficar idêntico à página HTML original, incluindo fontes, imagens e estilos CSS básicos. + +![Pré-visualização do PDF gerado](https://example.com/images/pdf-preview.png "Captura de tela do PDF gerado a partir de HTML usando Python"){: .center-image alt="Captura de tela de um PDF gerado a partir de um arquivo HTML usando Python"} + +## Etapa 4: Personalizando a conversão (opcional) + +O basic **html to pdf tutorial** cobre uma conversão um‑para‑um, mas cenários do mundo real frequentemente exigem ajustes: + +| Requisito | Como alcançar com Aspose.HTML | +|-----------|------------------------------| +| Definir tamanho da página (A4, Letter) | Passar um objeto `PdfSaveOptions` para `convert_html` | +| Adicionar margens ou cabeçalhos/rodapés | Usar `PdfPageSettings` dentro das opções | +| Incorporar fontes personalizadas | Garantir que os arquivos de fonte estejam acessíveis e definir `FontSettings` | + +Segue um exemplo que define o tamanho da página para A4 e adiciona uma margem de 1 polegada: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Nota:** Usar opções personalizadas é a técnica preferida de **generate pdf from html** quando você precisa de controle preciso sobre o layout. + +## Etapa 5: Manipulando múltiplos arquivos HTML (conversão em lote) + +Se você tem uma pasta cheia de relatórios HTML, pode percorrê-los em um loop: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Este trecho demonstra um fluxo de trabalho escalável de **python convert html pdf** que se encaixa em pipelines de CI ou tarefas agendadas. + +## Armadilhas comuns e como evitá‑las + +| Problema | Causa | Correção | +|----------|-------|----------| +| Imagens ausentes no PDF | Caminhos de imagem relativos que quebram quando o script é executado a partir de outra pasta | Use caminhos absolutos ou defina `base_uri` nas opções do `Converter` | +| CSS não aplicado | Folha de estilo externa referenciada por URL que requer acesso à internet | Baixe a folha de estilo localmente e referencie-a com um caminho relativo | +| Substituição de fonte | Fonte não instalada na máquina host | Inclua o arquivo de fonte no projeto e configure `FontSettings` | + +Tratar esses casos de borda garante que seu processo de **export html as pdf** seja robusto em diferentes ambientes. + +## Exemplo completo e executável + +Abaixo está o script completo que inclui configurações opcionais, tratamento de erros e lógica de processamento em lote. Copie‑o para `full_html_to_pdf.py` e execute‑o como mostrado anteriormente. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Executar este script gera um PDF para cada arquivo HTML no diretório de destino, aplicando configurações de página consistentes — uma solução completa de **python convert html pdf** pronta para produção. + +## Conclusão + +Agora você tem um **html to pdf tutorial** prático que mostra como gerar arquivos PDF a partir de HTML usando Python e Aspose.HTML. O guia abordou a configuração do ambiente, um script de conversão mínimo, personalização opcional, processamento em lote e dicas de solução de problemas. + +A partir daqui, você pode explorar tópicos relacionados, como **how to generate pdf** com marcas d'água, mesclar múltiplos PDFs ou converter HTML para outros formatos como DOCX. Experimente a API `PdfSaveOptions` para ajustar a saída e integre o script em serviços web ou pipelines de relatórios automatizados. + +Feliz codificação e aproveite transformar seu conteúdo HTML em PDFs refinados! + +## O que você deve aprender a seguir? + +Os tutoriais a seguir cobrem tópicos intimamente relacionados que se baseiam nas técnicas demonstradas neste guia. Cada recurso inclui exemplos de código completos e funcionais com explicações passo a passo para ajudá‑lo a dominar recursos adicionais da API e explorar abordagens de implementação alternativas em seus próprios projetos. + +- [Converter HTML para PDF com Aspose.HTML – Guia completo passo a passo](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Converter HTML para PDF com Aspose.HTML – Guia completo de manipulação](/html/english/) +- [Como converter HTML para PDF Java – Usando Aspose.HTML para Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/russian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/russian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..dc3960016d --- /dev/null +++ b/html/russian/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-09-19 +description: Узнайте, как изменить заголовок в HTML‑файле с помощью Python. Это руководство + охватывает чтение HTML, обновление тега <title> и сохранение изменённого HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: ru +lastmod: 2026-09-19 +og_description: Как изменить заголовок в HTML‑файле с помощью Python. Следуйте этому + полному примеру, чтобы прочитать HTML, обновить тег <title> и сохранить изменённый + документ. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Как изменить заголовок в HTML‑файле с помощью Python – пошаговое руководство +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Как изменить заголовок в HTML‑файле с помощью Python +url: /ru/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Как изменить заголовок в HTML‑файле с помощью Python + +Если вам нужно **как изменить заголовок** в HTML‑документе программно, Python делает эту задачу простой. В этом руководстве вы прочитаете HTML‑файл, обновите элемент `<title>` и сохраните изменённый HTML обратно на диск — все это с понятным, готовым к запуску кодом. + +Изменение заголовка страницы — обычный шаг при генерации статических сайтов, кастомизации собранных страниц или автоматизации SEO‑обновлений. К концу этого руководства вы будете знать, как **update html title**, как **read html with python**, и как **save modified html** безопасно. + +## Предварительные требования + +Прежде чем начать, убедитесь, что у вас есть: + +- Python 3.8 или новее +- Пакет `beautifulsoup4` (`pip install beautifulsoup4`) +- HTML‑файл, который нужно отредактировать (в примере используется `index.html` в выбранной вами папке) + +Никакие внешние сервисы не требуются; всё работает локально. + +## Шаг 1: Загрузить HTML‑файл с помощью Python + +Первая задача — **load html file python**‑style. Использование `BeautifulSoup` даёт гибкий парсер, который работает с некорректной разметкой. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Почему этот шаг важен:* +`BeautifulSoup` строит дерево, позволяя выполнять запросы и модификацию элементов без ручной работы со строками. Встроенный `html.parser` быстрый и не требует дополнительных бинарных файлов. + +## Шаг 2: Найти элемент `<title>` + +HTML‑документы обычно содержат один тег `<title>` внутри `<head>`. Мы получаем первое вхождение, что удовлетворяет требованию **update html title**. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Почему проверяем `None`:* +Некоторые фрагменты HTML могут не содержать заголовка. Автоматическое добавление предотвращает ошибки позже и делает скрипт надёжным. + +## Шаг 3: Изменить текст заголовка + +Теперь мы **update html title**, присваивая новое значение строке тега. Это ядро операции **how to change title**. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +Атрибут `string` представляет текстовый узел внутри `<title>`. Перезапись обновляет DOM в памяти. + +## Шаг 4: Сохранить изменённый HTML + +Наконец, записываем изменённый документ в новый файл. Это реализует шаг **save modified html** и оставляет оригинал нетронутым. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` форматирует вывод с отступами, делая файл удобочитаемым после изменения. + +### Ожидаемый вывод + +Запуск скрипта на примере `index.html`, который изначально содержит: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +даёт вывод в консоль, похожий на: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +Сохранённый `index_modified.html` теперь начинается с: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Полный скрипт для быстрого копирования‑вставки + +Ниже полностью готовая к запуску программа, объединяющая все четыре шага. Сохраните её как `change_title.py` и при необходимости измените `YOUR_DIRECTORY`. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Запустите скрипт: + +```bash +python change_title.py +``` + +Вы увидите сообщения в консоли и новый файл `index_modified.html` с обновлённым заголовком. + +## Дополнительные советы и особые случаи + +| Ситуация | Что делать | +|-----------|------------| +| **Несколько тегов `<title>`** | `soup.find_all("title")` возвращает список; обновите первый элемент или пройдитесь по всем, если нужно изменить каждый. | +| **Проблемы с кодировкой** | Открывайте файлы с `encoding="utf-8-sig"`, если присутствует BOM, или определяйте кодировку с помощью `chardet`. | +| **Большие HTML‑файлы** | Используйте парсер `lxml` (`BeautifulSoup(html_content, "lxml")`) для лучшей производительности. | +| **Сохранение оригинального форматирования** | Если необходимо сохранить точные пробелы, пишите `str(soup)` вместо `prettify()`. | +| **Автоматизация для множества файлов** | Оберните логику в функцию и пройдитесь по `Path.rglob("*.html")`. | + +Эти варианты сохраняют основную логику **how to change title**, адаптируя её к реальным проектам. + +## Заключение + +Теперь вы знаете, как **how to change title** в любом HTML‑документе с помощью Python. Руководство охватило чтение HTML, поиск тега `<title>`, обновление его текста и **saving modified html** безопасно. С полным скриптом вы можете внедрить этот шаблон в генераторы статических сайтов, SEO‑конвейеры или любую автоматизацию, требующую динамического изменения заголовков. + +Далее изучайте связанные темы, такие как **read html with python** для извлечения метатегов, или техники **load html file python** для работы с некорректной разметкой. Поэкспериментируйте с пакетной обработкой, чтобы менять заголовки на всём сайте — ваше новое умение станет фундаментом для множества веб‑автоматизаций. Приятного кодинга! + +## Что изучать дальше? + +Следующие руководства охватывают тесно связанные темы, расширяющие техники, продемонстрированные в этом пособии. Каждый ресурс содержит полностью рабочие примеры кода с пошаговыми объяснениями, чтобы помочь вам освоить дополнительные возможности API и исследовать альтернативные подходы в собственных проектах. + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/russian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/russian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..91aad9a4f6 --- /dev/null +++ b/html/russian/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,206 @@ +--- +category: general +date: 2026-09-19 +description: Преобразование локального HTML‑файла в PDF с помощью Python и Aspose.HTML + — полное пошаговое руководство, которое также охватывает варианты конвертации HTML + в PDF на Python. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: ru +lastmod: 2026-09-19 +og_description: Конвертировать локальный HTML‑файл в PDF с помощью Python. Узнайте + лучший способ преобразования HTML в PDF на Python с Aspose.HTML, включая встраивание + шрифтов и обработку ошибок. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Конвертировать локальный HTML‑файл в PDF с помощью Python — полное руководство +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Как конвертировать локальный HTML‑файл в PDF с помощью Python +url: /ru/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Как конвертировать локальный HTML‑файл в PDF с помощью Python + +Если вам нужно **конвертировать локальный HTML‑файл в PDF** в проекте на Python, этот учебник покажет готовое решение. Вы узнаете, как настроить библиотеку Aspose.HTML, сконфигурировать параметры PDF и выполнить конвертацию всего в несколько строк кода. Руководство также объясняет лучшие практики **convert html to pdf python**, чтобы вы могли адаптировать код под свои рабочие процессы. + +Ниже перечислены все шаги: установка SDK, подготовка параметров сохранения, обработка типичных подводных камней и проверка результата. К концу статьи у вас будет переиспользуемая функция, которую можно добавить в любое Python‑приложение. + +## Требования + +Прежде чем начать, убедитесь, что у вас есть: + +* Python 3.8 или новее, установленный на вашем компьютере. +* Действующая лицензия Aspose.HTML for Python (бесплатная пробная версия подходит для оценки). +* Локальный HTML‑файл, который вы хотите превратить в PDF (например, `page.html`). + +Дополнительные системные зависимости не требуются; SDK уже содержит всё необходимое для генерации PDF. + +## Установка пакета Aspose.HTML + +Aspose.HTML SDK распространяется через PyPI. Установите его с помощью `pip` в вашем виртуальном окружении: + +```bash +pip install aspose-html +``` + +Выполнение команды выводит установленную версию, подтверждая, что пакет готов к импорту. + +## Шаг 1: Импорт необходимых классов + +Рабочий процесс конвертации опирается на два основных класса: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` предоставляет статический метод `convert_html`, который выполняет реальное преобразование. +* `PDFSaveOptions` позволяет тонко настроить вывод PDF, например, включить встраивание стандартных шрифтов. + +## Шаг 2: Создание параметров сохранения PDF и включение встраивания стандартных шрифтов + +Встраивание шрифтов гарантирует, что сгенерированный PDF будет выглядеть одинаково на любом устройстве, даже если у просмотрщика шрифты не установлены локально. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Установка `embed_standard_fonts` в `True` рекомендуется для большинства производственных сценариев, поскольку устраняет предупреждения о замене шрифтов в PDF‑читалках. + +## Шаг 3: Конвертация HTML‑файла в PDF с использованием настроенных параметров + +Теперь вызовите `Converter.convert_html`, передав путь к исходному HTML, путь к целевому PDF и подготовленный объект параметров: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Если конвертация прошла успешно, метод возвращает `None`, а файл PDF появляется в указанном месте. + +## Полный пример в переиспользуемой функции + +Оборачивание логики в функцию упрощает её повторное использование в разных проектах: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Почему функция полезна + +* **Проверка входных данных** – `FileNotFoundError` упрощает отладку, когда путь к HTML указан неверно. +* **Автоматическое создание каталогов** – `os.makedirs(..., exist_ok=True)` предотвращает ошибки «каталог не существует». +* **Настраиваемое встраивание шрифтов** – Вы можете отключить встраивание шрифтов для уменьшения размера файлов, если знаете, что целевая среда уже содержит необходимые шрифты. + +## Типичные граничные случаи и способы их обработки + +| Ситуация | Рекомендованное решение | +|-----------|----------------------| +| **HTML содержит внешние CSS или изображения** | Используйте абсолютные URL‑адреса или скопируйте ресурсы рядом с HTML‑файлом; Aspose.HTML следует тем же правилам, что и браузер. | +| **Большие HTML‑файлы (>10 МБ)** | Увеличьте стандартный лимит памяти, задав `pdf_options.memory_limit`, если столкнётесь с `OutOfMemoryException`. | +| **Необходимы PDF с паролем** | Установите `pdf_options.encryption_details` с пользовательским паролем перед вызовом `convert_html`. | +| **Запуск на безголовом сервере** | Дополнительная конфигурация не требуется; SDK не зависит от GUI. | + +Учёт этих сценариев заранее избавит вас от неожиданных ошибок во время выполнения. + +## Проверка результата конвертации + +После завершения скрипта откройте сгенерированный PDF в любом просмотрщике (Adobe Reader, Chrome и т.д.). Визуальное оформление должно соответствовать оригинальному HTML, а все шрифты должны отображаться корректно, поскольку они были встроены. + +Вы также можете программно убедиться, что файл существует и имеет ненулевой размер: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Советы для продакшн‑использования + +* **Пакетная обработка** – Пройдитесь по списку HTML‑файлов и вызывайте `html_to_pdf` для каждого; переиспользуйте один экземпляр `PDFSaveOptions`, чтобы снизить накладные расходы на создание объектов. +* **Логирование** – Интегрируйте модуль `logging` из Python для записи времени конвертации и любых исключений. +* **Производительность** – При конвертации большого количества файлов рассмотрите параллельный запуск с помощью `concurrent.futures.ThreadPoolExecutor`, но помните, что SDK потокобезопасен только для отдельных вызовов `Converter`. + +## Заключение + +Теперь у вас есть полноценный, готовый к продакшн‑использованию метод **конвертации локального HTML‑файла в PDF** с помощью Python. Решение охватывает ключевые шаги — установку Aspose.HTML, настройку параметров PDF, обработку типичных граничных случаев и проверку результата, а также демонстрирует общий рабочий процесс **convert html to pdf python**. + +Далее вы можете изучать продвинутые возможности, такие как шифрование PDF, пользовательские размеры страниц или добавление водяных знаков — всё это поддерживается тем же SDK. Экспериментируйте с опциями, которые лучше всего подходят вашему проекту, и вы сможете надёжно автоматизировать конвертацию HTML‑в‑PDF в любой среде Python. + +--- + + +## Что изучать дальше? + + +Следующие учебники охватывают тесно связанные темы, расширяющие техники, продемонстрированные в этом руководстве. Каждый ресурс содержит полностью работающие примеры кода с пошаговыми объяснениями, помогающими освоить дополнительные возможности API и исследовать альтернативные подходы в ваших проектах. + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [Convert HTML to PDF in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/russian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/russian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..bb3ab85732 --- /dev/null +++ b/html/russian/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,218 @@ +--- +category: general +date: 2026-09-19 +description: Научитесь конвертировать HTML в Markdown на Python. Этот учебник показывает, + как быстро сохранять HTML в виде Markdown и генерировать Markdown из HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: ru +lastmod: 2026-09-19 +og_description: Преобразуйте HTML в Markdown с помощью Python. Следуйте этому руководству, + чтобы сохранить HTML как Markdown, генерировать Markdown из HTML и создавать файл + HTML в Markdown. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Преобразование HTML в Markdown на Python — полный программный гид +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Как преобразовать HTML в Markdown с помощью Python – пошаговое руководство +url: /ru/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Как конвертировать HTML в Markdown с помощью Python – пошаговое руководство + +Если вам нужно **конвертировать HTML в Markdown**, это руководство проведёт вас через весь процесс. Вы увидите, как **сохранить HTML как Markdown**, генерировать Markdown из HTML и создать *html to markdown file*, который можно использовать в генераторах статических сайтов, конвейерах документации или любом рабочем процессе, предпочитающем разметку в виде обычного текста. + +В руководстве рассматривается всё: от установки необходимой библиотеки до обработки особых случаев, таких как встроенные изображения и пользовательское форматирование. К концу вы получите готовый к запуску скрипт и чёткое понимание, почему каждый шаг важен. + +## Требования + +- Python 3.8 или новее, установленный на вашем компьютере. +- Базовое знакомство с написанием скриптов на Python. +- Доступ к терминалу или командной строке. +- Библиотека `aspose.html` (или любой совместимый пакет HTML‑to‑Markdown). В этом руководстве используется **Aspose.HTML for Python via .NET**, который предоставляет классы `HTMLDocument`, `MarkdownSaveOptions` и `Converter`, показанные в примере кода. + +> **Совет:** Если вы предпочитаете решение полностью на Python, можете заменить `aspose.html` пакетом `html2text`. Общий процесс останется тем же. + +## Шаг 1: Установите библиотеку конвертации + +Сначала установите библиотеку, которая предоставляет `HTMLDocument`, `MarkdownSaveOptions` и `Converter`. Выполните следующую команду: + +```bash +pip install aspose-html +``` + +Пакет включает нативный движок, необходимый для **генерации markdown из html** быстро и с высокой точностью. Установка обычно завершается менее чем за минуту при стандартном широкополосном соединении. + +## Шаг 2: Загрузите исходный HTML‑документ + +Загрузка HTML‑файла — первое конкретное действие в конвейере конвертации. Класс `HTMLDocument` парсит файл и создаёт DOM в памяти, который затем использует конвертер для создания Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Почему это важно:** Создавая объект `HTMLDocument`, вы гарантируете, что сложные структуры — таблицы, списки и встроенные стили — правильно интерпретируются перед конвертацией. Пропуск этого шага заставит конвертер читать необработанный текст, что приведёт к потере форматирования. + +## Шаг 3: Настройте параметры сохранения Markdown + +Объект `MarkdownSaveOptions` позволяет точно настроить формат вывода. Чтобы получить **Markdown в стиле Git**, установите свойство `formatter` в значение `"GIT"`. Это соответствует синтаксису, используемому на платформах GitHub, GitLab и Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Вы также можете изменить другие параметры, такие как `preserve_links` или `code_block_style`, в зависимости от того, как вы планируете **save html as markdown** в последующих инструментах. + +## Шаг 4: Конвертируйте HTML в Markdown и сохраните результат + +После загрузки документа и настройки параметров вызовите статический метод `convert_html`. Этот метод читает DOM, применяет выбранный форматтер и записывает файл вывода. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +После выполнения скрипта вы найдёте новый файл с именем `output.md` в указанном каталоге. При открытии он покажет чистый, совместимый с Git Markdown, готовый к системе контроля версий или публикации. + +## Шаг 5: Проверьте сгенерированный файл markdown + +Быстрая проверка помогает убедиться, что конвертация прошла успешно и что **html to markdown file** содержит ожидаемое содержимое. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Типичный вывод для простой HTML‑страницы выглядит так: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Если вы заметили отсутствующие заголовки или некорректные списки, вернитесь к **Шагу 3** и поэкспериментируйте с различными значениями `formatter` (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Продвинутое: Обработка изображений и относительных путей + +Когда исходный HTML содержит изображения, конвертер может либо внедрять их как data URI, либо сохранять оригинальные атрибуты `src`. Чтобы процесс **generate markdown from html** оставался лёгким, вы можете скопировать файлы изображений в параллельную папку и скорректировать пути. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +После конвертации Markdown будет ссылаться на изображения, например `![Alt text](images/picture.png)`. Такой подход хорошо работает, когда вы позже **save html as markdown** в генераторе статических сайтов, ожидающем ресурсы в отдельной папке. + +## Полный скрипт, который можно скопировать‑вставить + +Ниже приведён полный исполняемый скрипт, включающий все обсуждённые шаги. Сохраните его как `convert_html_to_md.py` и запустите командой `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Ожидаемый вывод + +Запуск скрипта выводит сообщение подтверждения, за которым следуют первые десять строк файла Markdown, как показано выше. Сгенерированный `output.md` можно открыть в любом текстовом редакторе, просмотреть в VS Code или закоммитить в репозиторий Git. + +## Часто задаваемые вопросы и обработка особых случаев + +| Вопрос | Ответ | +|----------|--------| +| **Что если HTML‑файл большой (> 10 MB)?** | `HTMLDocument` класс потоково читает ввод, поэтому использование памяти остаётся умеренным. Однако рассмотрите возможность увеличения лимита памяти процесса Python, если столкнётесь с `MemoryError`. | +| **Могу ли я конвертировать строку HTML вместо файла?** | Да. Используйте `HTMLDocument.from_string(html_string)` (или эквивалентный конструктор) перед вызовом `Converter.convert_html`. | +| **Как сохранить оригинальные комментарии HTML?** | Установите `md_options.preserve_comments = True`. Комментарии появятся как HTML‑комментарии (`<!-- … -->`) внутри файла Markdown. | +| **Можно ли использовать другой диалект Markdown?** | Измените `md_options.formatter` на `"COMMONMARK"` или `"MARKDOWN_EXTRA"` в зависимости от целевой платформы. | +| **Нужно ли устанавливать .NET runtime отдельно?** | `aspose-html` пакет включает необходимый runtime для большинства платформ. На Linux убедитесь, что установлен `libgdiplus` (`sudo apt-get install libgdiplus`). | + +## Заключение + +Теперь вы знаете, как **convert HTML to Markdown** с помощью Python, как **save html as markdown**, и как **generate markdown from html** с детальным контролем форматирования и ресурсов. Скрипт демонстрирует полный рабочий процесс — от загрузки исходного файла до создания чистого *html to markdown file*, готового к системе контроля версий или публикации. + +Далее изучайте связанные темы, такие как **batch converting multiple HTML files**, интеграция шага конвертации в CI/CD pipeline, или настройка вывода Markdown для конкретных генераторов статических сайтов, например Hugo или Jekyll. Экспериментируйте с различными настройками `MarkdownSaveOptions`, чтобы адаптировать результат к стилевому гиду вашего проекта. + +Удачной конвертации! + +## Что изучить дальше? + +Следующие руководства охватывают тесно связанные темы, опирающиеся на техники, продемонстрированные в этом руководстве. Каждый ресурс включает полностью работающие примеры кода с пошаговыми объяснениями, чтобы помочь вам освоить дополнительные возможности API и исследовать альтернативные подходы к реализации в ваших проектах. + +- [Конвертировать HTML в Markdown в .NET с Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Конвертировать HTML в Markdown в Aspose.HTML для Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown в HTML Java — конвертация с 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/russian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/russian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..512a60e2b4 --- /dev/null +++ b/html/russian/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Как включить функции при конвертации HTML в Markdown с помощью Python. + Узнайте, как преобразовать HTML‑документ и сохранить его как Markdown с точным управлением + функциями. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: ru +lastmod: 2026-09-19 +og_description: Как включать функции при преобразовании HTML в Markdown. Это руководство + пошагово покажет, как конвертировать HTML‑документ и сохранять его в формате Markdown + с детальным контролем. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Как включить функции при конвертации HTML в Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Как включить функции при конвертации HTML в Markdown +url: /ru/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Как включить функции при конвертации HTML в Markdown + +Если вам нужно **how to enable features** во время конвертации, это руководство предоставляет полное, готовое к запуску решение. Вы увидите, как точно конвертировать HTML в Markdown, управлять тем, какие функции Markdown генерируются, и сохранять HTML как Markdown за один проход. + +В примере используется популярный **GroupDocs.Conversion** Python SDK, но концепции применимы к любой библиотеке, позволяющей настраивать наборы функций. К концу этого руководства вы сможете конвертировать HTML‑документ, оставлять только ссылки и абзацы и избегать нежелательных таблиц, изображений или блоков кода. + +## Что вы достигнете + +* **how to enable features** в параметрах сохранения Markdown +* понятный рабочий процесс **convert html to markdown** +* возможность **how to convert html** с выборочным выводом +* готовый к запуску скрипт, который **convert html document** и **save html as markdown** + +### Предварительные требования + +* Установлен Python 3.8+ +* пакет `groupdocs-conversion` (установить с помощью `pip install groupdocs-conversion`) +* Пример HTML‑файла (`sample.html`) в известном каталоге + +--- + +## Как включить функции в конвертации Markdown + +Первый шаг — создать объект `MarkdownSaveOptions` и указать конвертеру, какие элементы следует сохранять. В этом руководстве мы включаем только **links** и **paragraphs**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Почему это работает:** +* `HTMLDocument` оборачивает исходный файл, чтобы конвертер мог его прочитать. +* `MarkdownSaveOptions` содержит все настройки конвертации; список `features` является ключевым свойством, которое **how to enable features**. +* Присвоив `["Link", "Paragraph"]`, вы указываете движку генерировать только Markdown‑ссылки (`[text](url)`) и обычные абзацы, отбрасывая изображения, таблицы и другую разметку. +* `Converter.convert_html` выполняет реальную операцию **convert html to markdown** и записывает результат в `sample.md`. + +--- + +## Как конвертировать HTML‑документ с пользовательскими параметрами + +Если позже понадобится добавить дополнительные флаги функций — например, `"Header"` или `"Bold"` — просто расширьте список: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +Тот же вызов `Converter.convert_html` теперь будет включать эти дополнительные элементы. Этот шаблон позволяет вам **how to convert html** очень настраиваемым способом без написания собственных парсеров. + +--- + +## Как сохранить HTML как Markdown в определённой папке + +Метод `convert_html` принимает абсолютный или относительный путь вывода. Чтобы **save html as markdown** в подпапку `output`, измените третий аргумент: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Запуск скрипта создаёт каталог `output` (если он не существует) и записывает туда файл Markdown. Такой подход поддерживает ваш исходный HTML и сгенерированный Markdown в аккуратном порядке. + +--- + +## Полный скрипт, который можно скопировать и вставить + +Ниже представлен весь код программы, готовый к запуску. Замените `YOUR_DIRECTORY` на путь, где находится `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Ожидаемый вывод** (печатается в консоль): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Откройте `sample.md`, и вы увидите только Markdown‑ссылки и обычные абзацы, например: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Все остальные HTML‑элементы были опущены, потому что **how to enable features** ограничил вывод двумя выбранными типами. + +--- + +## Часто задаваемые вопросы и особые случаи + +| Вопрос | Ответ | +|----------|--------| +| *Что если HTML‑файл не содержит ссылок?* | Конвертер всё равно записывает абзацы; вывод будет содержать обычный текст без синтаксиса ссылок. | +| *Можно ли отключить все функции?* | Установка `markdown_options.features = []` приводит к пустому файлу Markdown. Используйте это только для тестирования. | +| *Как SDK обрабатывает некорректный HTML?* | Парсер пытается очистить некорректную разметку перед применением фильтра функций. Ошибки регистрируются, но не останавливают конвертацию. | +| *Можно ли оставить изображения, удалив таблицы?* | Да. Установите `markdown_options.features = ["Link", "Paragraph", "Image"]`. Список функций добавочный, а не исключающий. | +| *Что если нужно конвертировать много файлов в папке?* | Обёрните логику конвертации в цикл, который проходит по `Path.glob("*.html")`. Та же конфигурация **how to enable features** может быть использована для каждого файла. | + +**Совет:** При обработке больших пакетов создавайте `MarkdownSaveOptions` один раз и переиспользуйте его. Это уменьшает накладные расходы на создание объектов и сохраняет быстрым конвейер **convert html to markdown**. + +--- + +## Заключение + +Теперь вы знаете **how to enable features** при **convert html to markdown**, как **how to convert html** с выборочным выводом, а также как **convert html document** и **save html as markdown** с помощью лаконичного скрипта на Python. Настраивая `MarkdownSaveOptions.features`, вы получаете полный контроль над элементами Markdown, которые появляются в итоговом файле. + +### Следующие шаги + +* Исследуйте дополнительные флаги функций, такие как `"Header"`, `"Bold"` и `"Italic"`, чтобы обогатить ваш вывод Markdown. +* Скомбинируйте этот скрипт с наблюдателем за файлами (например, `watchdog`), чтобы автоматически конвертировать новые HTML‑файлы по их появлению. +* Ознакомьтесь с [документацией GroupDocs.Conversion Python SDK](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) для продвинутых сценариев, таких как конвертация PDF‑в‑Markdown или DOCX‑в‑HTML. + +Не стесняйтесь экспериментировать с различными наборами функций и делиться своими находками с сообществом. Приятной конвертации! + +## Что вам следует изучить дальше? + +Следующие руководства охватывают тесно связанные темы, которые опираются на техники, продемонстрированные в этом руководстве. Каждый ресурс включает полные рабочие примеры кода с пошаговыми объяснениями, чтобы помочь вам освоить дополнительные возможности API и исследовать альтернативные подходы к реализации в ваших проектах. + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown to HTML Java — конвертация с Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [Как включить JavaScript в Aspose HTML – загрузка HTML и получение текста](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/russian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/russian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..8f56f381b2 --- /dev/null +++ b/html/russian/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,245 @@ +--- +category: general +date: 2026-09-19 +description: Узнайте, как ограничить вложенные ресурсы в Aspose.HTML для Python с + помощью ResourceHandlingOptions. Управляйте максимальной глубиной обработки и избегайте + бесконечных циклов. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: ru +lastmod: 2026-09-19 +og_description: Ограничьте вложенные ресурсы в Aspose.HTML для Python с помощью ResourceHandlingOptions. + Установите максимальную глубину обработки, чтобы предотвратить глубокую рекурсию + и улучшить производительность. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Как ограничить вложенные ресурсы в Aspose.HTML для Python – пошаговое руководство +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Как ограничить вложенные ресурсы при обработке HTML с помощью Aspose.HTML для + Python +url: /ru/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Как ограничить вложенные ресурсы при обработке HTML с помощью Aspose.HTML для Python + +Если вам необходимо **ограничить вложенные ресурсы** при рендеринге или конвертации HTML, это руководство покажет точные шаги по настройке Aspose.HTML для Python. Управление глубиной обработки ресурсов предотвращает неконтролируемую рекурсию, когда страница содержит множество уровней ссылок на CSS, JavaScript или изображения. + +Ограничение вложенных ресурсов особенно важно для крупномасштабных краулеров, конвейеров рендеринга электронных писем или любого автоматизированного рабочего процесса, который должен укладываться в ограничения памяти и времени. В последующих разделах вы узнаете, почему следует задавать ограничение глубины, как использовать класс `ResourceHandlingOptions` и как проверить, что ограничение работает как ожидается. + +## Почему следует ограничивать вложенные ресурсы + +HTML‑документы часто ссылаются на другие ресурсы — таблицы стилей, скрипты, изображения, шрифты или даже другие HTML‑файлы. Каждый из этих ресурсов, в свою очередь, может ссылаться на дополнительные файлы, образуя дерево зависимостей. Без ограничения дерево может стать произвольно глубоким: + +* Страница загружает CSS‑файл, который импортирует другой CSS‑файл, который импортирует ещё один, и так далее. +* JavaScript может динамически загружать дополнительные скрипты. +* Шаблон письма может встраивать изображения, которые ссылаются на внешние URL, перенаправляющие к другим ресурсам. + +Когда глубина рекурсии растёт без контроля, вы рискуете: + +* **Избыточное потребление памяти** – каждый полученный ресурс занимает буферы. +* **Увеличение времени обработки** – сетевая задержка умножается с каждым уровнем. +* **Потенциальные бесконечные циклы** – кольцевые ссылки могут заставить движок работать бесконечно. + +Установка **max handling depth** сообщает Aspose.HTML прекращать следовать по ссылкам ресурсов после заданного количества уровней, обеспечивая предсказуемую производительность. + +## Как ограничить вложенные ресурсы в Aspose.HTML для Python + +Aspose.HTML предоставляет класс `ResourceHandlingOptions`, который содержит свойство `max_handling_depth`. Присвоив числовое значение (например, `3`), вы указываете движку остановиться после трёх вложенных уровней. + +Ниже приведён полный, исполняемый пример, демонстрирующий весь рабочий процесс: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Пояснение каждого шага + +1. **Установить пакет** – требуется wheel `aspose-html`. Команда `pip install` показана в виде комментария для полноты. +2. **Импортировать классы** – `HtmlDocument` загружает страницу, `ResourceHandlingOptions` хранит ограничение, а `HtmlLoadOptions` связывает их вместе. +3. **Создать объект опций** – создание экземпляра `ResourceHandlingOptions` предоставляет изменяемый контейнер. +4. **Установить `max_handling_depth`** – присвойте `3` (или любое целое число), чтобы ограничить движок тремя уровнями вложенных ресурсов. Это суть **ограничения вложенных ресурсов**. +5. **Привязать опции к конфигурации загрузки** – `HtmlLoadOptions` позволяет передать `resource_options` загрузчику. +6. **Загрузить HTML** – конструктор `HtmlDocument` принимает URL или путь к файлу вместе с `load_options`. Движок теперь учитывает ограничение глубины. +7. **Проверить** – перебирая `document.resources`, можно увидеть, сколько ресурсов действительно было получено и какую максимальную глубину достигли. Если максимальная глубина ≤ `3`, ограничение сработало. +8. **Сохранить** – Сохранить обработанный документ. Сохранённый файл содержит только ресурсы до разрешённой глубины. + +#### Ожидаемый вывод + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +Числа будут различаться в зависимости от исходной страницы, но максимальная глубина никогда не должна превышать `3`, поскольку мы установили `max_handling_depth = 3`. + +## Общие варианты и граничные случаи + +### Изменение ограничения глубины + +Возможно, вам понадобится более глубокое или более поверхностное ограничение в зависимости от вашей среды: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Полное отключение ограничения + +Установка свойства в `0` сообщает Aspose.HTML **снять любое ограничение глубины**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Делайте это только тогда, когда вы уверены, что исходный HTML корректен. + +### Обработка кольцевых ссылок + +Даже при ограничении глубины кольцевые ссылки могут появляться на том же уровне. Aspose.HTML обнаруживает циклы и прекращает загрузку ресурса, который уже был обработан, независимо от настройки глубины. Тем не менее, установка более низкого `max_handling_depth` уменьшает вероятность столкнуться с циклом. + +### Использование ограничения с локальными файлами + +Тот же подход работает с локальными HTML‑файлами: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +Движок обрабатывает относительные атрибуты `href` или `src` так же, как удалённые URL, применяя ограничение глубины и к ресурсам файловой системы. + +### Интеграция с другими возможностями Aspose.HTML + +Если вам также нужно контролировать **тайм‑аут загрузки ресурса**, вы можете комбинировать `ResourceHandlingOptions` с `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Обе опции независимы, поэтому вы можете одновременно точно настраивать производительность и безопасность. + +## Профессиональные советы для продакшн‑использования + +* **Логировать дерево ресурсов** – При отладке перебирайте `document.resources` и записывайте URL и глубину каждого ресурса. Это помогает понять, почему конкретная страница превышает ваши ожидания. +* **Кешировать полученные ресурсы** – Если вы многократно обрабатываете одни и те же внешние ресурсы, включите кэширование, чтобы избежать лишних сетевых запросов. +* **Комбинировать с белым списком** – Если доверяете только определённым доменам, отфильтруйте `document.resources` после загрузки и удалите те, что находятся вне белого списка. +* **Тестировать на граничных страницах** – Создайте синтетический HTML‑файл, который импортирует цепочку из 10 CSS‑файлов. Убедитесь, что ваше ограничение обрезает цепочку как задумано. + +## Заключение + +Теперь вы знаете, как **ограничить вложенные ресурсы** в Aspose.HTML для Python, настроив `ResourceHandlingOptions.max_handling_depth`. Установка ограничения глубины защищает ваше приложение от избыточного потребления памяти, длительного времени обработки и потенциальных бесконечных циклов, вызываемых глубоко вложенными или кольцевыми ссылками на ресурсы. + +С этого момента вы можете: + +* Настроить глубину в соответствии с вашим бюджетом производительности (`resource_handling_options.max_handling_depth`). +* Сочетать ограничение с тайм‑аутами сети, кэшированием или белыми списками доменов для надёжных конвейеров. +* Изучить связанные темы, такие как **resource handling options**, **max handling depth** и **nested resource handling**, чтобы ещё более точно контролировать обработку HTML. + +Экспериментируйте с различными значениями глубины и наблюдайте, как меняется количество загруженных ресурсов. Когда будете готовы, интегрируйте этот шаблон в ваш более крупный сервис конвертации или рендеринга HTML, чтобы обеспечить предсказуемое, безопасное и эффективное выполнение. + +## Что вам стоит изучить дальше? + +Следующие руководства охватывают тесно связанные темы, которые развивают техники, продемонстрированные в этом руководстве. Каждый ресурс включает полностью рабочие примеры кода с пошаговыми объяснениями, чтобы помочь вам освоить дополнительные возможности API и исследовать альтернативные подходы к реализации в ваших проектах. + +- [Обработка сообщений и сетевые операции в Aspose.HTML для Java](/html/english/java/message-handling-networking/) +- [Пользовательский фильтр схем и обработка сообщений в Aspose.HTML для Java](/html/english/java/custom-schema-message-handling/) +- [Обработка данных и управление потоками в Aspose.HTML для Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/russian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/russian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..9861be7e13 --- /dev/null +++ b/html/russian/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,260 @@ +--- +category: general +date: 2026-09-19 +description: Изучите учебник по преобразованию HTML в PDF на Python, который показывает, + как быстро генерировать PDF из HTML с помощью Aspose.HTML. Следуйте пошаговому руководству + прямо сейчас. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: ru +lastmod: 2026-09-19 +og_description: 'Учебник по преобразованию HTML в PDF: преобразуйте любую HTML‑страницу + в PDF‑файл с помощью Python и Aspose.HTML. Это руководство покажет, как за считанные + минуты создать PDF из HTML.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Учебник по преобразованию HTML в PDF на Python — полное пошаговое руководство +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Как выполнить руководство по преобразованию HTML в PDF с помощью Python +url: /ru/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Как выполнить руководство по преобразованию html в pdf с помощью Python + +Если вам нужен **html to pdf tutorial**, это руководство покажет, как точно генерировать PDF из HTML всего несколькими строками кода на Python. Независимо от того, автоматизируете ли вы создание отчетов или экспортируете веб‑контент для офлайн‑чтения, библиотека Aspose.HTML делает конвертацию безболезненной. + +В этом руководстве вы узнаете, как настроить окружение, написать скрипт конвертации и обработать распространённые крайние случаи, такие как отсутствие файлов или пользовательские настройки страниц. К концу вы сможете **how to generate pdf** файлы из любого источника HTML, не покидая экосистему Python. + +## Что вам понадобится + +* Python 3.8 или новее установленный +* Действующая лицензия Aspose.HTML for Python (бесплатная пробная версия подходит для оценки) +* Доступ к `pip` для установки пакета `aspose-html` +* Простой HTML‑файл, который вы хотите конвертировать (например, `input.html`) + +> **Pro tip:** Держите ваш HTML и ресурсы (изображения, CSS) в одном каталоге, чтобы избежать проблем с разрешением путей во время конвертации. + +## Шаг 1: Установите пакет Aspose.HTML + +Откройте терминал и выполните следующую команду: + +```bash +pip install aspose-html +``` + +`aspose-html` wheel включает нативные библиотеки, необходимые для высококачественного рендеринга, поэтому дополнительные системные зависимости не требуются. + +## Шаг 2: Создайте минимальный скрипт на Python + +Создайте новый файл с именем `convert_html_to_pdf.py` и вставьте код ниже. Этот скрипт следует шаблону **html to pdf tutorial** из трёх шагов: импорт, определение путей и вызов конвертации. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Почему это работает + +* **Importing `Converter`** предоставляет доступ к высокоуровневому API, который скрывает детали движка рендеринга. +* **Defining absolute paths** предотвращает ошибки относительных путей, когда скрипт запускается из другой рабочей директории. +* **`Converter.convert_html`** выполняет весь конвейер рендеринга — разбор HTML, построение CSS‑разметки и сериализацию в PDF — одним вызовом, что является рекомендуемым способом **how to generate pdf** быстро. + +## Шаг 3: Запустите скрипт и проверьте результат + +Выполните скрипт из терминала: + +```bash +python convert_html_to_pdf.py +``` + +Если всё настроено правильно, вы увидите: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Откройте `output.pdf` в любом PDF‑просмотрщике. Документ должен выглядеть идентично оригинальной HTML‑странице, включая шрифты, изображения и базовое оформление CSS. + +![Generated PDF preview](https://example.com/images/pdf-preview.png "Снимок экрана сгенерированного PDF из HTML с помощью Python"){: .center-image alt="Снимок экрана PDF, сгенерированного из HTML‑файла с помощью Python"} + +## Шаг 4: Настройка конвертации (необязательно) + +Базовый **html to pdf tutorial** охватывает конвертацию один‑к‑одному, но в реальных сценариях часто требуются доработки: + +| Требование | Как достичь с помощью Aspose.HTML | +|-------------|------------------------------------| +| Установить размер страницы (A4, Letter) | Передать объект `PdfSaveOptions` в `convert_html` | +| Добавить отступы или колонтитулы | Использовать `PdfPageSettings` внутри параметров | +| Встроить пользовательские шрифты | Убедиться, что файлы шрифтов доступны, и задать `FontSettings` | + +Ниже приведён пример, который устанавливает размер страницы A4 и добавляет отступ 1 дюйм: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Note:** Использование пользовательских параметров — предпочтительная техника **generate pdf from html**, когда требуется точный контроль над макетом. + +## Шаг 5: Обработка нескольких HTML‑файлов (пакетная конвертация) + +Если у вас есть папка, полная HTML‑отчетов, вы можете перебрать их в цикле: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Этот фрагмент демонстрирует масштабируемый рабочий процесс **python convert html pdf**, который подходит для CI‑конвейеров или запланированных задач. + +## Распространённые подводные камни и как их избежать + +| Проблема | Причина | Решение | +|-------|-------|-----| +| Отсутствуют изображения в PDF | Относительные пути к изображениям, которые ломаются, когда скрипт запускается из другой папки | Использовать абсолютные пути или задать `base_uri` в параметрах `Converter` | +| CSS не применяется | Внешняя таблица стилей указана по URL, требующему доступа к интернету | Скачайте таблицу стилей локально и укажите её относительным путём | +| Подмена шрифтов | Шрифт не установлен на хост‑машине | Включите файл шрифта в проект и настройте `FontSettings` | + +Устранение этих крайних случаев гарантирует, что ваш процесс **export html as pdf** будет надёжным в разных окружениях. + +## Полный, исполняемый пример + +Ниже представлен полный скрипт, включающий необязательные настройки, обработку ошибок и логику пакетной обработки. Скопируйте его в `full_html_to_pdf.py` и запустите, как показано выше. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Запуск этого скрипта создаёт PDF для каждого HTML‑файла в целевом каталоге, применяя единые настройки страниц — полное решение **python convert html pdf**, готовое к использованию в продакшене. + +## Заключение + +Теперь у вас есть практическое **html to pdf tutorial**, показывающее, как генерировать PDF‑файлы из HTML с помощью Python и Aspose.HTML. Руководство охватывало настройку окружения, минимальный скрипт конвертации, необязательную настройку, пакетную обработку и советы по устранению неполадок. + +Отсюда вы можете изучать связанные темы, такие как **how to generate pdf** с водяными знаками, объединение нескольких PDF или конвертация HTML в другие форматы, например DOCX. Экспериментируйте с API `PdfSaveOptions` для тонкой настройки вывода и интегрируйте скрипт в веб‑сервисы или автоматизированные конвейеры отчётности. + +Удачной разработки и приятного превращения вашего HTML‑контента в отшлифованные PDF! + +## Что следует изучить дальше? + +Следующие руководства охватывают тесно связанные темы, опирающиеся на техники, продемонстрированные в этом руководстве. Каждый ресурс включает полные работающие примеры кода с пошаговыми объяснениями, чтобы помочь вам освоить дополнительные возможности API и исследовать альтернативные подходы к реализации в ваших проектах. + +- [Преобразовать HTML в PDF с Aspose.HTML – Полное пошаговое руководство](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Преобразовать HTML в PDF с Aspose.HTML – Полное руководство по манипуляциям](/html/english/) +- [Как преобразовать HTML в PDF на Java – Используя Aspose.HTML для Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/spanish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/spanish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..ccd6aece29 --- /dev/null +++ b/html/spanish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,264 @@ +--- +category: general +date: 2026-09-19 +description: Aprende cómo cambiar el título en un archivo HTML con Python. Esta guía + cubre la lectura de HTML, la actualización de la etiqueta de título y el guardado + del HTML modificado. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: es +lastmod: 2026-09-19 +og_description: Cómo cambiar el título en un archivo HTML con Python. Sigue este ejemplo + completo para leer HTML, actualizar la etiqueta de título y guardar el documento + modificado. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Cómo cambiar el título en un archivo HTML usando Python – guía paso a paso +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Cómo cambiar el título en un archivo HTML usando Python +url: /es/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cómo cambiar el título en un archivo HTML usando Python + +Si necesitas **cómo cambiar el título** en un documento HTML de forma programática, Python hace el trabajo sencillo. En este tutorial leerás un archivo HTML, actualizarás el elemento `<title>` y guardarás el HTML modificado de nuevo en disco, todo con código claro y ejecutable. + +Cambiar el título de la página es un paso común cuando generas sitios estáticos, personalizas páginas raspadas o automatizas actualizaciones SEO. Al final de esta guía sabrás cómo **actualizar html title**, cómo **read html with python** y cómo **save modified html** de forma segura. + +## Prerequisites + +Antes de comenzar, asegúrate de tener: + +- Python 3.8 o superior instalado +- El paquete `beautifulsoup4` (`pip install beautifulsoup4`) +- Un archivo HTML que quieras editar (el ejemplo usa `index.html` en una carpeta que elijas) + +No se requieren servicios externos; todo se ejecuta localmente. + +## Step 1: Load the HTML file with Python + +La primera tarea es **load html file python**‑style. Usar `BeautifulSoup` te brinda un analizador indulgente que funciona con marcado imperfecto. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Por qué este paso es importante:* +`BeautifulSoup` construye una representación en árbol, permitiéndote consultar y modificar elementos sin manejar cadenas manualmente. El `html.parser` incorporado es rápido y no requiere binarios adicionales. + +## Step 2: Locate the `<title>` element + +Los documentos HTML normalmente contienen una única etiqueta `<title>` dentro de `<head>`. Recuperamos la primera aparición, lo que satisface el requisito de **update html title**. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Por qué verificamos `None`*: +Algunos fragmentos HTML omiten el título. Añadirlo automáticamente evita errores posteriores y mantiene el script robusto. + +## Step 3: Change the title text + +Ahora **update html title** asignando nuevo texto a la cadena de la etiqueta. Este es el núcleo de la operación **how to change title**. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +El atributo `string` representa el nodo de texto dentro de `<title>`. Sobrescribirlo actualiza el DOM en memoria. + +## Step 4: Save the modified HTML + +Finalmente, escribe el documento alterado en un nuevo archivo. Esto cumple con el paso **save modified html** y deja el original intacto. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` formatea la salida con sangrías, facilitando la lectura del archivo después del cambio. + +### Expected output + +Ejecutar el script con un `index.html` de ejemplo que originalmente contiene: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +produce una salida en consola similar a: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +El archivo guardado `index_modified.html` ahora comenzará con: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Full script for quick copy‑paste + +A continuación tienes el programa completo, listo para ejecutar, que combina los cuatro pasos. Guárdalo como `change_title.py` y ajusta `YOUR_DIRECTORY` según sea necesario. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Ejecuta el script: + +```bash +python change_title.py +``` + +Verás los mensajes en consola y un nuevo archivo `index_modified.html` con el título actualizado. + +## Additional tips and edge cases + +| Situation | What to do | +|-----------|------------| +| **Multiple `<title>` tags** | `soup.find_all("title")` devuelve una lista; actualiza el primer elemento o itera si necesitas cambiar todos. | +| **Encoding problems** | Abre los archivos con `encoding="utf-8-sig"` si hay un BOM presente, o detecta la codificación con `chardet`. | +| **Large HTML files** | Usa el parser `lxml` (`BeautifulSoup(html_content, "lxml")`) para mejor rendimiento. | +| **Preserving original formatting** | Si debes conservar el espaciado exacto, escribe `str(soup)` en lugar de `prettify()`. | +| **Automating across many files** | Encapsula la lógica en una función y recorre `Path.rglob("*.html")`. | + +Estas variaciones mantienen la lógica central de **how to change title** intacta mientras se adaptan a proyectos del mundo real. + +## Conclusion + +Ahora sabes cómo **how to change title** en cualquier documento HTML usando Python. El tutorial cubrió la lectura de HTML, la localización de la etiqueta `<title>`, la actualización de su texto y **saving modified html** de forma segura. Con el script completo puedes integrar este patrón en generadores de sitios estáticos, pipelines SEO o cualquier automatización que requiera cambios dinámicos de título. + +A continuación, explora temas relacionados como **read html with python** para extraer metaetiquetas, o técnicas de **load html file python** para manejar marcado malformado. Experimenta con procesamiento por lotes para actualizar títulos en todo un sitio web; tu nueva habilidad es la base para muchas tareas de automatización web. ¡Feliz codificación! + +## What Should You Learn Next? + +Los siguientes tutoriales cubren temas estrechamente relacionados que amplían las técnicas demostradas en esta guía. Cada recurso incluye ejemplos de código completos y explicaciones paso a paso para ayudarte a dominar funciones adicionales de la API y explorar enfoques de implementación alternativos en tus propios proyectos. + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/spanish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/spanish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..65da642942 --- /dev/null +++ b/html/spanish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,206 @@ +--- +category: general +date: 2026-09-19 +description: Convertir archivo HTML local a PDF usando Python y Aspose.HTML – una + guía completa paso a paso que también cubre opciones para convertir HTML a PDF con + Python. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: es +lastmod: 2026-09-19 +og_description: Convertir archivo HTML local a PDF usando Python. Aprende la mejor + forma de convertir HTML a PDF con Python y Aspose.HTML, incluyendo la incrustación + de fuentes y el manejo de errores. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Convertir un archivo HTML local a PDF con Python – guía completa +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Cómo convertir un archivo HTML local a PDF con Python +url: /es/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cómo convertir un archivo HTML local a PDF con Python + +Si necesitas **convertir un archivo HTML local a PDF** en un proyecto Python, este tutorial te muestra una solución lista‑para‑ejecutar. Verás cómo configurar la biblioteca Aspose.HTML, establecer las opciones de PDF y ejecutar la conversión en solo unas pocas líneas de código. La guía también explica las mejores prácticas para **convert html to pdf python**, de modo que puedas adaptar el código a tus propios flujos de trabajo. + +Los pasos a continuación cubren todo lo que necesitas saber: instalar el SDK, preparar las opciones de guardado, manejar problemas comunes y verificar la salida. Al final del artículo tendrás una función reutilizable que podrás incorporar en cualquier aplicación Python. + +## Requisitos previos + +Antes de comenzar, asegúrate de tener: + +* Python 3.8 o superior instalado en tu máquina. +* Una licencia activa de Aspose.HTML para Python (la prueba gratuita funciona para evaluación). +* Un archivo HTML local que quieras convertir a PDF (por ejemplo, `page.html`). + +No necesitas dependencias adicionales a nivel del sistema; el SDK incluye todo lo necesario para la generación de PDF. + +## Instalar el paquete Aspose.HTML + +El SDK de Aspose.HTML se distribuye a través de PyPI. Instálalo con `pip` en tu entorno virtual: + +```bash +pip install aspose-html +``` + +Ejecutar el comando muestra la versión instalada, confirmando que el paquete está disponible para importación. + +## Paso 1: Importar las clases requeridas + +El flujo de conversión depende de dos clases principales: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` proporciona el método estático `convert_html` que realiza la transformación real. +* `PDFSaveOptions` te permite afinar la salida PDF, como la incrustación de fuentes estándar. + +## Paso 2: Crear opciones de guardado PDF y habilitar la incrustación de fuentes estándar + +Incrustar fuentes garantiza que el PDF generado se vea igual en cualquier dispositivo, incluso si el visor no tiene las fuentes instaladas localmente. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Establecer `embed_standard_fonts` en `True` se recomienda para la mayoría de los escenarios de producción porque elimina las advertencias de sustitución de fuentes en los lectores de PDF. + +## Paso 3: Convertir el archivo HTML a PDF usando las opciones configuradas + +Ahora llama a `Converter.convert_html`, pasando la ruta del HTML de origen, la ruta del PDF de destino y el objeto de opciones que preparaste: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Si la conversión tiene éxito, el método devuelve `None` y el archivo PDF aparece en la ubicación que especificaste. + +## Ejemplo completo en una función reutilizable + +Encapsular la lógica en una función facilita su reutilización en múltiples proyectos: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Por qué la función ayuda + +* **Validación de entrada** – El `FileNotFoundError` facilita la depuración cuando la ruta del HTML es incorrecta. +* **Creación automática de directorios** – `os.makedirs(..., exist_ok=True)` evita errores de “el directorio no existe”. +* **Incrustación de fuentes configurable** – Puedes desactivar la incrustación de fuentes para archivos más pequeños si sabes que el entorno de destino ya posee las fuentes necesarias. + +## Casos límite comunes y cómo manejarlos + +| Situación | Manejo recomendado | +|-----------|--------------------| +| **HTML contiene CSS o imágenes externas** | Usa URLs absolutas o copia los recursos junto al archivo HTML; Aspose.HTML sigue las mismas reglas que un navegador. | +| **Archivos HTML grandes (>10 MB)** | Aumenta el límite de memoria predeterminado estableciendo `pdf_options.memory_limit` si encuentras `OutOfMemoryException`. | +| **Necesitas PDFs protegidos con contraseña** | Configura `pdf_options.encryption_details` con una contraseña de usuario antes de llamar a `convert_html`. | +| **Ejecución en un servidor sin interfaz gráfica** | No se requiere configuración adicional; el SDK no depende de una GUI. | + +Abordar estos escenarios de antemano te ahorra errores inesperados en tiempo de ejecución. + +## Verificando el resultado de la conversión + +Después de que el script finalice, abre el PDF generado con cualquier visor (Adobe Reader, Chrome, etc.). El diseño visual debe coincidir con el HTML original, y todas las fuentes deben aparecer correctamente porque fueron incrustadas. + +También puedes confirmar programáticamente que el archivo existe y tiene un tamaño distinto de cero: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Consejos profesionales para uso en producción + +* **Procesamiento por lotes** – Recorre una lista de archivos HTML y llama a `html_to_pdf` para cada uno; reutiliza una única instancia de `PDFSaveOptions` para reducir la sobrecarga de creación de objetos. +* **Registro (logging)** – Integra el módulo `logging` de Python para capturar marcas de tiempo de conversión y cualquier excepción. +* **Rendimiento** – Al convertir muchos archivos, considera ejecutar conversiones en paralelo usando `concurrent.futures.ThreadPoolExecutor`, pero ten en cuenta que el SDK es seguro para subprocesos solo en llamadas separadas a `Converter`. + +## Conclusión + +Ahora tienes un método completo y listo para producción para **convertir un archivo HTML local a PDF** usando Python. La solución cubre los pasos esenciales—instalar Aspose.HTML, configurar opciones de PDF, manejar casos límite comunes y verificar la salida—además de demostrar el flujo más amplio de **convert html to pdf python**. + +Desde aquí puedes explorar funciones avanzadas como encriptación de PDF, tamaños de página personalizados o agregar marcas de agua, todas soportadas por el mismo SDK. Experimenta con las opciones que mejor se adapten a tu proyecto y podrás automatizar la conversión de HTML a PDF de manera fiable en cualquier entorno Python. + +--- + + +## ¿Qué deberías aprender a continuación? + + +Los siguientes tutoriales cubren temas estrechamente relacionados que amplían las técnicas demostradas en esta guía. Cada recurso incluye ejemplos de código completos y funcionales con explicaciones paso a paso para ayudarte a dominar características adicionales de la API y explorar enfoques de implementación alternativos en tus propios proyectos. + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [Convert HTML to PDF in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/spanish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/spanish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..843dc22405 --- /dev/null +++ b/html/spanish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Aprende a convertir HTML a Markdown en Python. Este tutorial muestra + cómo guardar HTML como Markdown y generar Markdown a partir de HTML rápidamente. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: es +lastmod: 2026-09-19 +og_description: Convierte HTML a Markdown con Python. Sigue esta guía para guardar + HTML como Markdown, generar Markdown a partir de HTML y crear un archivo de HTML + a Markdown. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Convertir HTML a Markdown en Python – guía completa de programación +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Cómo convertir HTML a Markdown con Python – guía paso a paso +url: /es/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cómo convertir HTML a Markdown con Python – guía paso a paso + +Si necesitas **convertir HTML a Markdown**, esta guía te lleva a través de todo el proceso. Verás cómo **guardar HTML como Markdown**, generar Markdown a partir de HTML y producir un *archivo html a markdown* que puede usarse en generadores de sitios estáticos, pipelines de documentación o cualquier flujo de trabajo que prefiera marcado de texto plano. + +El tutorial cubre todo, desde la instalación de la biblioteca requerida hasta el manejo de casos límite como imágenes incrustadas y formato personalizado. Al final, tendrás un script listo para ejecutar y una comprensión clara de por qué cada paso es importante. + +## Requisitos previos + +Antes de comenzar, asegúrate de contar con: + +- Python 3.8 o superior instalado en tu máquina. +- Familiaridad básica con scripting en Python. +- Acceso a una terminal o símbolo del sistema. +- La biblioteca `aspose.html` (o cualquier paquete compatible de HTML‑a‑Markdown). Este tutorial usa **Aspose.HTML for Python via .NET**, que proporciona las clases `HTMLDocument`, `MarkdownSaveOptions` y `Converter` mostradas en el ejemplo de código. + +> **Consejo profesional:** Si prefieres una solución puramente en Python, puedes reemplazar `aspose.html` por el paquete `html2text`. El flujo general sigue siendo el mismo. + +## Paso 1: Instalar la biblioteca de conversión + +Primero, instala la biblioteca que suministra `HTMLDocument`, `MarkdownSaveOptions` y `Converter`. Ejecuta el siguiente comando: + +```bash +pip install aspose-html +``` + +El paquete incluye el motor nativo necesario para **generar markdown from html** de forma rápida y con alta fidelidad. La instalación suele completarse en menos de un minuto con una conexión de banda ancha estándar. + +## Paso 2: Cargar el documento HTML de origen + +Cargar el archivo HTML es la primera acción concreta en la canalización de conversión. La clase `HTMLDocument` analiza el archivo y construye un DOM en memoria, que el conversor recorrerá posteriormente para producir Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Por qué es importante:** Al crear un objeto `HTMLDocument`, garantizas que estructuras complejas —tablas, listas y estilos en línea— se interpreten correctamente antes de la conversión. Omitir este paso obligaría al conversor a leer texto sin procesar, lo que provocaría pérdida de formato. + +## Paso 3: Configurar las opciones de guardado de Markdown + +El objeto `MarkdownSaveOptions` te permite afinar el formato de salida. Para producir **Git‑flavored Markdown**, establece la propiedad `formatter` a `"GIT"`. Esto coincide con la sintaxis utilizada por plataformas como GitHub, GitLab y Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +También puedes ajustar otras configuraciones, como `preserve_links` o `code_block_style`, dependiendo de cómo planees **save html as markdown** en herramientas posteriores. + +## Paso 4: Convertir el HTML a Markdown y guardar el resultado + +Con el documento cargado y las opciones configuradas, invoca el método estático `convert_html`. Este método lee el DOM, aplica el formateador elegido y escribe el archivo de salida. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Después de ejecutar el script, encontrarás un nuevo archivo llamado `output.md` en el directorio especificado. Al abrirlo verás Markdown limpio y compatible con Git, listo para control de versiones o publicación. + +## Paso 5: Verificar el archivo Markdown generado + +Una rápida comprobación de sanidad te ayuda a confirmar que la conversión se realizó correctamente y que el **html to markdown file** contiene el contenido esperado. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Una salida típica para una página HTML sencilla se ve así: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Si notas encabezados ausentes o listas mal formadas, revisa el **Paso 3** y experimenta con diferentes valores de `formatter` (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Avanzado: Manejo de imágenes y rutas relativas + +Cuando el HTML de origen contiene imágenes, el conversor puede incrustarlas como URIs de datos o preservar los atributos `src` originales. Para mantener el proceso **generate markdown from html** liviano, quizá quieras copiar los archivos de imagen a una carpeta paralela y ajustar las rutas. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Después de la conversión, el Markdown hará referencia a imágenes como `![Alt text](images/picture.png)`. Este enfoque funciona bien cuando luego **save html as markdown** en un generador de sitios estáticos que espera los recursos en una carpeta dedicada. + +## Script completo que puedes copiar‑pegar + +A continuación tienes el script completo y ejecutable que incorpora todos los pasos discutidos. Guárdalo como `convert_html_to_md.py` y ejecútalo con `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Salida esperada + +Ejecutar el script muestra un mensaje de confirmación seguido de las primeras diez líneas del archivo Markdown, como se mostró antes. El `output.md` generado puede abrirse en cualquier editor de texto, previsualizarse en VS Code o comprometerse en un repositorio Git. + +## Preguntas frecuentes y manejo de casos límite + +| Pregunta | Respuesta | +|----------|-----------| +| **¿Qué pasa si el archivo HTML es grande (> 10 MB)?** | La clase `HTMLDocument` transmite la entrada, por lo que el uso de memoria se mantiene moderado. Sin embargo, considera aumentar el límite de memoria del proceso Python si encuentras `MemoryError`. | +| **¿Puedo convertir una cadena HTML en lugar de un archivo?** | Sí. Usa `HTMLDocument.from_string(html_string)` (o el constructor equivalente) antes de llamar a `Converter.convert_html`. | +| **¿Cómo mantengo los comentarios HTML originales?** | Establece `md_options.preserve_comments = True`. Los comentarios aparecerán como comentarios HTML (`<!-- … -->`) dentro del archivo Markdown. | +| **¿Es posible apuntar a un dialecto de Markdown diferente?** | Cambia `md_options.formatter` a `"COMMONMARK"` o `"MARKDOWN_EXTRA"` según la plataforma de destino. | +| **¿Necesito instalar el runtime .NET por separado?** | El paquete `aspose-html` incluye el runtime necesario para la mayoría de plataformas. En Linux, asegúrate de que `libgdiplus` esté instalado (`sudo apt-get install libgdiplus`). | + +## Conclusión + +Ahora sabes cómo **convertir HTML a Markdown** usando Python, cómo **save html as markdown** y cómo **generate markdown from html** con control granular sobre el formato y los recursos. El script demuestra el flujo completo, desde cargar el archivo de origen hasta producir un *html to markdown file* limpio listo para control de versiones o publicación. + +A continuación, explora temas relacionados como **convertir en lote múltiples archivos HTML**, integrar el paso de conversión en una canalización CI/CD, o personalizar la salida Markdown para generadores de sitios estáticos específicos como Hugo o Jekyll. Experimenta con las distintas configuraciones de `MarkdownSaveOptions` para adaptar el resultado a la guía de estilo de tu proyecto. + +¡Feliz conversión! + +## ¿Qué deberías aprender a continuación? + +Los siguientes tutoriales cubren temas estrechamente relacionados que amplían las técnicas demostradas en esta guía. Cada recurso incluye ejemplos de código completos y funcionales con explicaciones paso a paso para ayudarte a dominar características adicionales de la API y explorar enfoques de implementación alternativos en tus propios proyectos. + +- [Convertir HTML a Markdown en .NET con Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Convertir HTML a Markdown en Aspose.HTML para Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown a HTML Java - Convertir con 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/spanish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/spanish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..d9f1daeb3c --- /dev/null +++ b/html/spanish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,222 @@ +--- +category: general +date: 2026-09-19 +description: Cómo habilitar funciones al convertir HTML a Markdown usando Python. + Aprende a convertir documentos HTML y guardar HTML como Markdown con control preciso + de funciones. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: es +lastmod: 2026-09-19 +og_description: Cómo habilitar funciones al convertir HTML a Markdown. Esta guía le + muestra paso a paso cómo convertir un documento HTML y guardar HTML como Markdown + con control granular. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Cómo habilitar funciones al convertir HTML a Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Cómo habilitar funciones al convertir HTML a Markdown +url: /es/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cómo habilitar funciones al convertir HTML a Markdown + +Si necesitas **cómo habilitar funciones** durante una conversión, esta guía te ofrece una solución completa y ejecutable. Verás exactamente cómo convertir HTML a Markdown, controlar qué funciones de Markdown se generan y guardar HTML como Markdown en una sola pasada. + +El ejemplo utiliza el popular **GroupDocs.Conversion** Python SDK, pero los conceptos se aplican a cualquier biblioteca que permita configurar conjuntos de funciones. Al final de este tutorial podrás convertir un documento HTML, conservar solo enlaces y párrafos, y evitar tablas, imágenes o bloques de código no deseados. + +## Lo que lograrás + +* **cómo habilitar funciones** en las opciones de guardado de Markdown +* un flujo de trabajo claro para **convertir html a markdown** +* la capacidad de **cómo convertir html** con salida selectiva +* un script listo‑para‑ejecutar que **convierte documento html** y **guarda html como markdown** + +### Requisitos previos + +* Python 3.8+ instalado +* paquete `groupdocs-conversion` (instalar con `pip install groupdocs-conversion`) +* Un archivo HTML de ejemplo (`sample.html`) en un directorio conocido + +--- + +## Cómo habilitar funciones en la conversión a Markdown + +El primer paso es crear un objeto `MarkdownSaveOptions` y decirle al convertidor qué elementos deseas conservar. En este tutorial habilitamos solo **enlaces** y **párrafos**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Por qué funciona esto:** +* `HTMLDocument` envuelve el archivo fuente para que el convertidor pueda leerlo. +* `MarkdownSaveOptions` contiene todas las configuraciones de conversión; la lista `features` es la propiedad clave que **cómo habilitar funciones**. +* Al asignar `["Link", "Paragraph"]` le indicas al motor que genere solo enlaces Markdown (`[texto](url)`) y párrafos simples, descartando imágenes, tablas y demás marcado. +* `Converter.convert_html` realiza la operación real de **convertir html a markdown** y escribe el resultado en `sample.md`. + +--- + +## Cómo convertir documento HTML con opciones personalizadas + +Si más adelante necesitas añadir más banderas de función —como `"Header"` o `"Bold"`— simplemente amplía la lista: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +La misma llamada a `Converter.convert_html` ahora incluirá esos elementos adicionales. Este patrón te permite **cómo convertir html** de forma altamente configurable sin escribir analizadores personalizados. + +--- + +## Cómo guardar HTML como Markdown en una carpeta específica + +El método `convert_html` acepta una ruta de salida absoluta o relativa. Para **guardar html como markdown** en una sub‑carpeta llamada `output`, ajusta el tercer argumento: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Ejecutar el script crea el directorio `output` (si no existe) y escribe el archivo Markdown allí. Este enfoque mantiene tu HTML fuente y el Markdown generado organizados de manera ordenada. + +--- + +## Script completo que puedes copiar‑pegar + +A continuación tienes el programa completo, listo para ejecutar. Reemplaza `YOUR_DIRECTORY` con la ruta que contiene `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Salida esperada** (impresa en la consola): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Abre `sample.md` y verás solo enlaces Markdown y párrafos simples, por ejemplo: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Todos los demás elementos HTML se han omitido porque **cómo habilitar funciones** limitó la salida a los dos tipos seleccionados. + +--- + +## Preguntas frecuentes y casos límite + +| Pregunta | Respuesta | +|----------|-----------| +| *¿Qué pasa si el archivo HTML no contiene enlaces?* | El convertidor sigue escribiendo los párrafos; la salida contendrá texto plano sin sintaxis de enlace. | +| *¿Puedo desactivar todas las funciones?* | Configurar `markdown_options.features = []` produce un archivo Markdown vacío. Usa esto solo para pruebas. | +| *¿Cómo maneja el SDK HTML inválido?* | El analizador intenta limpiar el marcado mal formado antes de aplicar el filtro de funciones. Los errores se registran pero no detienen la conversión. | +| *¿Es posible conservar imágenes y eliminar tablas?* | Sí. Configura `markdown_options.features = ["Link", "Paragraph", "Image"]`. La lista de funciones es aditiva, no exclusiva. | +| *¿Qué pasa si necesito convertir muchos archivos en una carpeta?* | Envuelve la lógica de conversión en un bucle que itere sobre `Path.glob("*.html")`. La misma **cómo habilitar funciones** puede reutilizarse para cada archivo. | + +**Consejo profesional:** Cuando proceses lotes grandes, instancia `MarkdownSaveOptions` una sola vez y reutilízala. Esto reduce la sobrecarga de creación de objetos y mantiene la canalización **convertir html a markdown** rápida. + +--- + +## Conclusión + +Ahora sabes **cómo habilitar funciones** cuando **conviertes html a markdown**, cómo **cómo convertir html** con salida selectiva, y cómo **convertir documento html** y **guardar html como markdown** usando un script Python conciso. Al configurar `MarkdownSaveOptions.features`, obtienes control total sobre los elementos Markdown que aparecen en el archivo final. + +### Próximos pasos + +* Explora banderas de función adicionales como `"Header"`, `"Bold"` e `"Italic"` para enriquecer tu salida Markdown. +* Combina este script con un observador de archivos (por ejemplo, `watchdog`) para convertir automáticamente nuevos archivos HTML a medida que llegan. +* Revisa la [documentación del GroupDocs.Conversion Python SDK](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) para escenarios avanzados como conversiones de PDF‑a‑Markdown o DOCX‑a‑HTML. + +¡Siéntete libre de experimentar con diferentes conjuntos de funciones y compartir tus hallazgos con la comunidad! ¡Feliz conversión! + + +## ¿Qué deberías aprender a continuación? + + +Los siguientes tutoriales cubren temas estrechamente relacionados que amplían las técnicas demostradas en esta guía. Cada recurso incluye ejemplos de código completos y funcionales con explicaciones paso a paso para ayudarte a dominar funciones adicionales de la API y explorar enfoques de implementación alternativos en tus propios proyectos. + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/spanish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/spanish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..f246adc035 --- /dev/null +++ b/html/spanish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,245 @@ +--- +category: general +date: 2026-09-19 +description: Aprende a limitar los recursos anidados en Aspose.HTML para Python usando + ResourceHandlingOptions. Controla la profundidad máxima de manejo y evita bucles + infinitos. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: es +lastmod: 2026-09-19 +og_description: Limite los recursos anidados en Aspose.HTML para Python usando ResourceHandlingOptions. + Establezca la profundidad máxima de manejo para evitar recursión profunda y mejorar + el rendimiento. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: 'Cómo limitar recursos anidados en Aspose.HTML para Python: guía paso a + paso' +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Cómo limitar recursos anidados al procesar HTML con Aspose.HTML para Python +url: /es/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cómo limitar recursos anidados al procesar HTML con Aspose.HTML para Python + +Si necesita **limitar recursos anidados** al renderizar o convertir HTML, esta guía le muestra los pasos exactos para configurar Aspose.HTML para Python. Controlar la profundidad del manejo de recursos evita recursiones descontroladas cuando una página incluye muchas capas de referencias CSS, JavaScript o imágenes. + +Limitar recursos anidados es especialmente importante para rastreadores a gran escala, canalizaciones de renderizado de correos electrónicos o cualquier flujo de trabajo automatizado que deba mantenerse dentro de los presupuestos de memoria y tiempo. En las siguientes secciones aprenderá por qué debe establecer un límite de profundidad, cómo usar la clase `ResourceHandlingOptions` y cómo verificar que el límite funciona como se espera. + +## Por qué debe limitar los recursos anidados + +Los documentos HTML a menudo hacen referencia a otros recursos—hojas de estilo, scripts, imágenes, fuentes o incluso otros archivos HTML. Cada uno de esos recursos puede, a su vez, referenciar archivos adicionales, formando un árbol de dependencias. Sin una protección, el árbol puede volverse arbitrariamente profundo: + +* Una página carga un archivo CSS que importa otro archivo CSS, que a su vez importa otro, y así sucesivamente. +* JavaScript puede cargar dinámicamente scripts adicionales. +* Una plantilla de correo electrónico puede incrustar imágenes que hacen referencia a URLs externas que redirigen a más recursos. + +Cuando la profundidad de recursión crece sin control, corre el riesgo de: + +* **Consumo excesivo de memoria** – cada recurso obtenido ocupa buffers. +* **Tiempos de procesamiento más largos** – la latencia de red se multiplica en cada nivel. +* **Posibles bucles infinitos** – las referencias circulares pueden hacer que el motor nunca regrese. + +Establecer una **profundidad máxima de manejo** indica a Aspose.HTML que deje de seguir los enlaces de recursos después de un número determinado de niveles, garantizando un rendimiento predecible. + +## Cómo limitar recursos anidados en Aspose.HTML para Python + +Aspose.HTML proporciona la clase `ResourceHandlingOptions`, que contiene la propiedad `max_handling_depth`. Al asignar un valor numérico (p.ej., `3`), indica al motor que se detenga después de tres niveles anidados. + +A continuación se muestra un ejemplo completo y ejecutable que demuestra todo el flujo de trabajo: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Explicación de cada paso + +1. **Instalar el paquete** – Se requiere la rueda `aspose-html`. El comando `pip install` se muestra como comentario para mayor claridad. +2. **Importar clases** – `HtmlDocument` carga la página, `ResourceHandlingOptions` contiene el límite, y `HtmlLoadOptions` une ambos. +3. **Crear el objeto de opciones** – Instanciar `ResourceHandlingOptions` le brinda un contenedor mutable. +4. **Establecer `max_handling_depth`** – Asigne `3` (o cualquier entero) para restringir el motor a tres niveles de recursos anidados. Este es el núcleo de **limitar recursos anidados**. +5. **Adjuntar opciones a la configuración de carga** – `HtmlLoadOptions` le permite pasar `resource_options` al cargador. +6. **Cargar el HTML** – El constructor de `HtmlDocument` acepta una URL o una ruta de archivo junto con `load_options`. El motor ahora respeta el límite de profundidad. +7. **Verificar** – Al iterar sobre `document.resources`, puede ver cuántos recursos se obtuvieron realmente y el nivel más profundo encontrado. Si el nivel más profundo es `3` o menor, el límite se cumplió. +8. **Guardar** – Persista el documento procesado. El archivo guardado contiene solo los recursos hasta la profundidad permitida. + +#### Salida esperada + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +Los números variarán según la página de origen, pero el nivel más profundo nunca debe superar `3` porque establecimos `max_handling_depth = 3`. + +## Variaciones comunes y casos límite + +### Cambiar el límite de profundidad + +Es posible que necesite un límite más profundo o más superficial según su entorno: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Desactivar el límite por completo + +Establecer la propiedad a `0` indica a Aspose.HTML que **elimine cualquier restricción de profundidad**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Solo haga esto cuando esté seguro de que el HTML de origen se comporta correctamente. + +### Manejo de referencias circulares + +Incluso con un límite de profundidad, las referencias circulares pueden aparecer en el mismo nivel. Aspose.HTML detecta ciclos y deja de cargar un recurso que ya ha sido procesado, sin importar la configuración de profundidad. Sin embargo, establecer un `max_handling_depth` más bajo reduce la probabilidad de encontrar un ciclo desde el principio. + +### Usar el límite con archivos locales + +El mismo enfoque funciona para archivos HTML locales: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +El motor trata los atributos relativos `href` o `src` de la misma manera que las URLs remotas, aplicando el límite de profundidad también a los recursos del sistema de archivos. + +### Integración con otras características de Aspose.HTML + +Si también necesita controlar el **tiempo de espera de descarga de recursos**, puede combinar `ResourceHandlingOptions` con `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Ambas opciones son independientes, por lo que puede afinar el rendimiento y la seguridad simultáneamente. + +## Consejos profesionales para uso en producción + +* **Registrar el árbol de recursos** – Al depurar, itere sobre `document.resources` y registre la URL y la profundidad de cada recurso. Esto le ayuda a entender por qué una página en particular supera sus expectativas. +* **Cachear recursos obtenidos** – Si procesa los mismos activos externos repetidamente, habilite el caché para evitar llamadas de red redundantes. +* **Combinar con una lista blanca** – Si solo ciertos dominios son de confianza, filtre `document.resources` después de la carga y descarte los que estén fuera de la lista blanca. +* **Probar con páginas de casos límite** – Cree un archivo HTML sintético que importe una cadena de 10 archivos CSS. Verifique que su límite trunque la cadena según lo previsto. + +## Conclusión + +Ahora sabe cómo **limitar recursos anidados** en Aspose.HTML para Python configurando `ResourceHandlingOptions.max_handling_depth`. Establecer un límite de profundidad protege su aplicación del uso excesivo de memoria, tiempos de procesamiento prolongados y posibles bucles infinitos causados por referencias de recursos profundamente anidadas o circulares. + +Desde este punto puede: + +* Ajustar la profundidad para que coincida con su presupuesto de rendimiento (`resource_handling_options.max_handling_depth`). +* Combinar el límite con tiempos de espera de red, caché o listas blancas de dominios para canalizaciones robustas. +* Explorar temas relacionados como **opciones de manejo de recursos**, **profundidad máxima de manejo** y **manejo de recursos anidados** para afinar aún más el control sobre el procesamiento de HTML. + +Experimente con diferentes valores de profundidad y observe cómo cambia la cantidad de recursos cargados. Cuando esté listo, integre este patrón en su servicio de conversión o renderizado de HTML más amplio para garantizar una ejecución predecible, segura y eficiente. + +## ¿Qué debería aprender a continuación? + +Los siguientes tutoriales cubren temas estrechamente relacionados que se basan en las técnicas demostradas en esta guía. Cada recurso incluye ejemplos de código completos y funcionales con explicaciones paso a paso para ayudarle a dominar características adicionales de la API y explorar enfoques de implementación alternativos en sus propios proyectos. + +- [Manejo de Mensajes y Redes en Aspose.HTML para Java](/html/english/java/message-handling-networking/) +- [Filtro de Esquema Personalizado y Manejo de Mensajes en Aspose.HTML para Java](/html/english/java/custom-schema-message-handling/) +- [Manejo de Datos y Gestión de Flujos en Aspose.HTML para Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/spanish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/spanish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..437887345f --- /dev/null +++ b/html/spanish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,259 @@ +--- +category: general +date: 2026-09-19 +description: Aprende un tutorial de HTML a PDF en Python que muestra cómo generar + PDF a partir de HTML rápidamente con Aspose.HTML. Sigue la guía paso a paso ahora. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: es +lastmod: 2026-09-19 +og_description: 'tutorial de html a pdf: Convierte cualquier página HTML a un archivo + PDF usando Python y Aspose.HTML. Esta guía muestra cómo generar PDF a partir de + HTML en minutos.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: tutorial de html a pdf en Python – guía completa paso a paso +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Cómo realizar un tutorial de HTML a PDF usando Python +url: /es/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cómo realizar un tutorial de html a pdf usando Python + +Si necesitas un **tutorial de html a pdf**, esta guía te muestra exactamente cómo generar un PDF a partir de HTML con solo unas pocas líneas de código Python. Ya sea que estés automatizando la creación de informes o exportando contenido web para lectura sin conexión, la biblioteca Aspose.HTML hace que la conversión sea sencilla. + +En este tutorial aprenderás a configurar el entorno, escribir el script de conversión y manejar casos comunes como archivos faltantes o configuraciones de página personalizadas. Al final podrás **cómo generar pdf** archivos desde cualquier fuente HTML sin salir del ecosistema Python. + +## Lo que necesitarás + +* Python 3.8 o superior instalado +* Una licencia activa de Aspose.HTML para Python (una prueba gratuita sirve para evaluación) +* Acceso a `pip` para instalar el paquete `aspose-html` +* Un archivo HTML simple que quieras convertir (p. ej., `input.html`) + +> **Consejo profesional:** Mantén tu HTML y los recursos (imágenes, CSS) en el mismo directorio para evitar problemas de resolución de rutas durante la conversión. + +## Paso 1: Instalar el paquete Aspose.HTML + +Abre una terminal y ejecuta el siguiente comando: + +```bash +pip install aspose-html +``` + +El wheel `aspose-html` incluye las bibliotecas nativas necesarias para renderizado de alta calidad, por lo que no se requieren dependencias del sistema adicionales. + +## Paso 2: Crear un script Python mínimo + +Crea un nuevo archivo llamado `convert_html_to_pdf.py` y pega el código a continuación. Este script sigue el **tutorial de html a pdf** de un proceso de tres pasos: importación, definición de rutas y ejecución de la conversión. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Por qué funciona esto + +* **Importar `Converter`** te brinda acceso a una API de alto nivel que abstrae el motor de renderizado. +* **Definir rutas absolutas** evita errores de rutas relativas cuando el script se ejecuta desde un directorio de trabajo diferente. +* **`Converter.convert_html`** realiza todo el pipeline de renderizado — análisis de HTML, diseño CSS y serialización a PDF — en una sola llamada, lo que es la forma recomendada de **cómo generar pdf** rápidamente. + +## Paso 3: Ejecutar el script y verificar la salida + +Ejecuta el script desde la terminal: + +```bash +python convert_html_to_pdf.py +``` + +Si todo está configurado correctamente, verás: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Abre `output.pdf` con cualquier visor de PDF. El documento debería verse idéntico a la página HTML original, incluyendo fuentes, imágenes y estilos CSS básicos. + +![Vista previa del PDF generado](https://example.com/images/pdf-preview.png "Captura de pantalla del PDF generado a partir de HTML usando Python"){: .center-image alt="Captura de pantalla de un PDF generado a partir de un archivo HTML usando Python"} + +## Paso 4: Personalizar la conversión (opcional) + +El **tutorial de html a pdf** básico cubre una conversión uno‑a‑uno, pero los escenarios del mundo real a menudo requieren ajustes: + +| Requisito | Cómo lograrlo con Aspose.HTML | +|-----------|------------------------------| +| Establecer tamaño de página (A4, Letter) | Pasar un objeto `PdfSaveOptions` a `convert_html` | +| Añadir márgenes o encabezados/pies de página | Usar `PdfPageSettings` dentro de las opciones | +| Incrustar fuentes personalizadas | Asegurarse de que los archivos de fuentes sean accesibles y configurar `FontSettings` | + +A continuación se muestra un ejemplo que establece el tamaño de página a A4 y añade un margen de 1 pulgada: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Nota:** Usar opciones personalizadas es la técnica preferida para **generar pdf desde html** cuando necesitas un control preciso sobre el diseño. + +## Paso 5: Manejar múltiples archivos HTML (conversión por lotes) + +Si tienes una carpeta llena de informes HTML, puedes iterar sobre ellos: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Este fragmento demuestra un flujo de trabajo **python convertir html pdf** escalable que encaja en pipelines de CI o trabajos programados. + +## Errores comunes y cómo evitarlos + +| Problema | Causa | Solución | +|----------|-------|----------| +| Imágenes faltantes en el PDF | Rutas de imagen relativas que se rompen cuando el script se ejecuta desde una carpeta diferente | Usar rutas absolutas o establecer `base_uri` en las opciones de `Converter` | +| CSS no aplicado | Hoja de estilo externa referenciada con una URL que requiere acceso a internet | Descargar la hoja de estilo localmente y referenciarla con una ruta relativa | +| Sustitución de fuentes | Fuente no instalada en la máquina host | Incluir el archivo de fuente en el proyecto y configurar `FontSettings` | + +Abordar estos casos extremos garantiza que tu proceso de **exportar html como pdf** sea robusto en diferentes entornos. + +## Ejemplo completo y ejecutable + +A continuación se muestra el script completo que incluye configuraciones opcionales, manejo de errores y lógica de procesamiento por lotes. Cópialo en `full_html_to_pdf.py` y ejecútalo como se mostró antes. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Ejecutar este script produce un PDF para cada archivo HTML en el directorio objetivo, aplicando configuraciones de página consistentes — una solución completa **python convertir html pdf** lista para producción. + +## Conclusión + +Ahora tienes un práctico **tutorial de html a pdf** que muestra cómo generar archivos PDF a partir de HTML usando Python y Aspose.HTML. La guía cubrió la configuración del entorno, un script de conversión mínimo, personalización opcional, procesamiento por lotes y consejos de solución de problemas. + +A partir de aquí puedes explorar temas relacionados como **cómo generar pdf** con marcas de agua, combinar varios PDFs o convertir HTML a otros formatos como DOCX. Experimenta con la API `PdfSaveOptions` para afinar la salida e integra el script en servicios web o pipelines de informes automatizados. + +¡Feliz codificación y disfruta convirtiendo tu contenido HTML en PDFs pulidos! + +## ¿Qué deberías aprender a continuación? + +Los siguientes tutoriales cubren temas estrechamente relacionados que amplían las técnicas demostradas en esta guía. Cada recurso incluye ejemplos de código completos y explicaciones paso a paso para ayudarte a dominar funciones adicionales de la API y explorar enfoques de implementación alternativos en tus propios proyectos. + +- [Convertir HTML a PDF con Aspose.HTML – Guía completa paso a paso](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convertir HTML a PDF con Aspose.HTML – Guía completa de manipulación](/html/english/) +- [Cómo convertir HTML a PDF en Java – Usando Aspose.HTML para Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/swedish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/swedish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..f0753bfa93 --- /dev/null +++ b/html/swedish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,262 @@ +--- +category: general +date: 2026-09-19 +description: Lär dig hur du ändrar titeln i en HTML‑fil med Python. Denna guide täcker + att läsa HTML, uppdatera titeltaggen och spara den modifierade HTML‑filen. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: sv +lastmod: 2026-09-19 +og_description: Hur man ändrar titel i en HTML-fil med Python. Följ detta kompletta + exempel för att läsa HTML, uppdatera title‑taggen och spara det modifierade dokumentet. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Hur man ändrar titel i en HTML‑fil med Python – steg‑för‑steg‑guide +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Hur man ändrar titel i en HTML‑fil med Python +url: /sv/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hur man ändrar titel i en HTML-fil med Python + +Om du behöver **how to change title** i ett HTML‑dokument programatiskt, gör Python jobbet enkelt. I den här handledningen kommer du att läsa en HTML‑fil, uppdatera `<title>`‑elementet och spara den modifierade HTML‑filen tillbaka till disk – allt med tydlig, körbar kod. + +Att ändra sidtiteln är ett vanligt steg när du genererar statiska webbplatser, anpassar skrapade sidor eller automatiserar SEO‑uppdateringar. I slutet av den här guiden kommer du att veta hur man **update html title**, hur man **read html with python**, och hur man **save modified html** på ett säkert sätt. + +## Förutsättningar + +Innan du börjar, se till att du har: + +- Python 3.8 eller nyare installerat +- Paketet `beautifulsoup4` (`pip install beautifulsoup4`) +- En HTML‑fil du vill redigera (exemplet använder `index.html` i en mapp du väljer) + +Inga externa tjänster krävs; allt körs lokalt. + +## Steg 1: Läs in HTML-filen med Python + +Den första uppgiften är att **load html file python**‑stil. Att använda `BeautifulSoup` ger dig en förlåtande parser som fungerar med ofullständig markup. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Varför detta steg är viktigt:* +`BeautifulSoup` bygger en trädrepresentation, vilket låter dig fråga och modifiera element utan manuell stränghantering. Den inbyggda `html.parser` är snabb och kräver inga extra binärer. + +## Steg 2: Hitta `<title>`-elementet + +HTML-dokument innehåller vanligtvis ett enda `<title>`-tagg inom `<head>`. Vi hämtar den första förekomsten, vilket uppfyller kravet **update html title**. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Varför vi kontrollerar `None`*: +Vissa HTML-fragment saknar titel. Att automatiskt lägga till den förhindrar senare fel och håller skriptet robust. + +## Steg 3: Ändra titeltexten + +Nu **update html title** genom att tilldela ny text till taggens sträng. Detta är kärnan i **how to change title**-operationen. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +`string`‑attributet representerar textnoden inuti `<title>`. Att skriva över den uppdaterar DOM‑en i minnet. + +## Steg 4: Spara den modifierade HTML-filen + +Slutligen skriver du det förändrade dokumentet till en ny fil. Detta uppfyller steget **save modified html** och lämnar originalet orört. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` formaterar utskriften med indentering, vilket gör filen lätt att läsa efter ändringen. + +### Förväntad output + +Att köra skriptet på ett exempel `index.html` som ursprungligen innehåller: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +producerar konsolutdata liknande: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +Den sparade `index_modified.html` kommer nu att börja med: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Fullständigt skript för snabb kopiering‑och‑klistra + +Nedan är det kompletta, färdiga programmet som kombinerar alla fyra stegen. Spara det som `change_title.py` och justera `YOUR_DIRECTORY` efter behov. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Kör skriptet: + +```bash +python change_title.py +``` + +Du kommer att se konsolmeddelandena och en ny `index_modified.html`‑fil med den uppdaterade titeln. + +## Ytterligare tips och kantfall + +| Situation | Vad man ska göra | +|-----------|-------------------| +| **Flera `<title>`‑taggar** | `soup.find_all("title")` returnerar en lista; uppdatera det första elementet eller iterera om du behöver ändra alla. | +| **Kodningsproblem** | Öppna filer med `encoding="utf-8-sig"` om en BOM finns, eller upptäck kodning med `chardet`. | +| **Stora HTML-filer** | Använd `lxml`‑parsern (`BeautifulSoup(html_content, "lxml")`) för bättre prestanda. | +| **Bevara originalformatering** | Om du måste behålla exakt blanksteg, skriv `str(soup)` istället för `prettify()`. | +| **Automatisera över många filer** | Packa in logiken i en funktion och loopa över `Path.rglob("*.html")`. | + +Dessa variationer behåller den grundläggande **how to change title**‑logiken intakt samtidigt som de anpassas till verkliga projekt. + +## Slutsats + +Du vet nu hur man **how to change title** i vilket HTML-dokument som helst med Python. Handledningen täckte läsning av HTML, lokalisering av `<title>`-taggen, uppdatering av dess text och **saving modified html** på ett säkert sätt. Med det kompletta skriptet kan du integrera detta mönster i statiska webbplatsgeneratorer, SEO-pipelines eller någon automation som kräver dynamiska titeländringar. + +Nästa steg är att utforska relaterade ämnen som **read html with python** för att extrahera meta-taggar, eller **load html file python**‑tekniker för att hantera felaktig markup. Experimentera med batch-bearbetning för att uppdatera titlar över en hel webbplats – din nya färdighet är grunden för många webb-automationsuppgifter. Lycka till med kodningen! + +## Vad bör du lära dig härnäst? + +Följande handledningar täcker nära besläktade ämnen som bygger på teknikerna som demonstrerats i den här guiden. Varje resurs innehåller kompletta fungerande kodexempel med steg-för-steg-förklaringar för att hjälpa dig bemästra ytterligare API-funktioner och utforska alternativa implementationsmetoder i dina egna projekt. + +- [How to Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/swedish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/swedish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..1bb9a2ec13 --- /dev/null +++ b/html/swedish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,204 @@ +--- +category: general +date: 2026-09-19 +description: Konvertera lokal HTML‑fil till PDF med Python och Aspose.HTML – en komplett + steg‑för‑steg‑guide som även täcker alternativ för att konvertera HTML till PDF + i Python. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: sv +lastmod: 2026-09-19 +og_description: Konvertera lokal HTML-fil till PDF med Python. Lär dig det bästa sättet + att konvertera HTML till PDF med Python och Aspose.HTML, inklusive inbäddning av + teckensnitt och felhantering. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Konvertera en lokal HTML‑fil till PDF med Python – fullständig guide +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Hur man konverterar en lokal HTML‑fil till PDF med Python +url: /sv/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Så konverterar du en lokal HTML-fil till PDF med Python + +Om du behöver **convert local HTML file to PDF** i ett Python‑projekt, visar den här handledningen en färdig‑att‑köra lösning. Du får se hur du installerar Aspose.HTML‑biblioteket, konfigurerar PDF‑alternativ och utför konverteringen med bara några kodrader. Guiden förklarar också bästa praxis för **convert html to pdf python**, så att du kan anpassa koden till dina egna arbetsflöden. + +Stegen nedan täcker allt du behöver veta: installera SDK:n, förbereda sparalternativen, hantera vanliga fallgropar och verifiera resultatet. I slutet av artikeln har du en återanvändbar funktion som du kan lägga in i vilken Python‑applikation som helst. + +## Förutsättningar + +Innan du börjar, se till att du har: + +* Python 3.8 eller nyare installerat på din maskin. +* En aktiv Aspose.HTML för Python‑licens (gratis provversion fungerar för utvärdering). +* En lokal HTML‑fil som du vill omvandla till en PDF (t.ex. `page.html`). + +Du behöver inga ytterligare system‑nivåberoenden; SDK:n paketar allt som krävs för PDF‑generering. + +## Installera Aspose.HTML‑paketet + +Aspose.HTML‑SDK:n distribueras via PyPI. Installera den med `pip` i din virtuella miljö: + +```bash +pip install aspose-html +``` + +När kommandet körs skrivs den installerade versionen ut, vilket bekräftar att paketet är tillgängligt för import. + +## Steg 1: Importera de erforderliga klasserna + +Konverteringsflödet bygger på två huvudklasser: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` tillhandahåller den statiska `convert_html`‑metoden som utför den faktiska transformationen. +* `PDFSaveOptions` låter dig finjustera PDF‑utdata, t.ex. genom att bädda in standardtypsnitt. + +## Steg 2: Skapa PDF‑sparalternativ och aktivera inbäddning av standardtypsnitt + +Inbäddning av typsnitt garanterar att den genererade PDF‑filen ser likadan ut på alla enheter, även om läsaren inte har typsnitten installerade lokalt. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Att sätta `embed_standard_fonts` till `True` rekommenderas för de flesta produktionsscenario eftersom det eliminerar varningar om typsnittssubstitution i PDF‑läsare. + +## Steg 3: Konvertera HTML‑filen till PDF med de konfigurerade alternativen + +Anropa nu `Converter.convert_html` och skicka in käll‑HTML‑sökvägen, destinations‑PDF‑sökvägen och det alternativobjekt du förberedde: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Om konverteringen lyckas returnerar metoden `None` och PDF‑filen visas på den plats du angav. + +## Fullständigt exempel i en återanvändbar funktion + +Att kapsla in logiken i en funktion gör det enkelt att återanvända den i flera projekt: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Varför funktionen är hjälpsam + +* **Inmatningsvalidering** – `FileNotFoundError` gör felsökning enklare när HTML‑sökvägen är felaktig. +* **Automatisk katalogskapning** – `os.makedirs(..., exist_ok=True)` förhindrar felmeddelanden om att “katalogen finns inte”. +* **Konfigurerbar typsnitts‑inbäddning** – Du kan stänga av inbäddning av typsnitt för mindre filer om du vet att målmiljön redan har de nödvändiga typsnitten. + +## Vanliga kantfall och hur du hanterar dem + +| Situation | Rekommenderad hantering | +|-----------|--------------------------| +| **HTML innehåller extern CSS eller bilder** | Använd absoluta URL:er eller kopiera resurserna bredvid HTML‑filen; Aspose.HTML följer samma regler som en webbläsare. | +| **Stora HTML‑filer (>10 MB)** | Öka standardminnesgränsen genom att sätta `pdf_options.memory_limit` om du stöter på `OutOfMemoryException`. | +| **Du behöver lösenordsskyddade PDF‑filer** | Sätt `pdf_options.encryption_details` med ett användarlösenord innan du anropar `convert_html`. | +| **Kör på en huvudlös server** | Ingen ytterligare konfiguration krävs; SDK:n är inte beroende av ett GUI. | + +Att hantera dessa scenarier i förväg sparar dig från oväntade körfel. + +## Verifiera konverteringsresultatet + +När skriptet är klart, öppna den genererade PDF‑filen med någon läsare (Adobe Reader, Chrome osv.). Den visuella layouten bör matcha den ursprungliga HTML‑filen, och alla typsnitt ska visas korrekt eftersom de har bäddats in. + +Du kan också programatiskt bekräfta att filen finns och har en storlek som inte är noll: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Pro‑tips för produktionsanvändning + +* **Batch‑bearbetning** – Loopa över en lista med HTML‑filer och anropa `html_to_pdf` för varje; återanvänd en enda `PDFSaveOptions`‑instans för att minska overhead för objekt‑skapande. +* **Loggning** – Integrera Python‑modulen `logging` för att fånga konverteringstidstämplar och eventuella undantag. +* **Prestanda** – Vid konvertering av många filer, överväg att köra konverteringar parallellt med `concurrent.futures.ThreadPoolExecutor`, men kom ihåg att SDK:n är trådsäker endast för separata `Converter`‑anrop. + +## Slutsats + +Du har nu en komplett, produktionsklar metod för att **convert local HTML file to PDF** med Python. Lösningen täcker de väsentliga stegen — installera Aspose.HTML, konfigurera PDF‑alternativ, hantera vanliga kantfall och verifiera resultatet — samtidigt som den demonstrerar det bredare **convert html to pdf python**‑arbetsflödet. + +Härifrån kan du utforska avancerade funktioner som PDF‑kryptering, anpassade sidstorlekar eller att lägga till vattenstämplar, alla stöds av samma SDK. Experimentera med de alternativ som bäst passar ditt projekt, så kan du automatisera HTML‑till‑PDF‑konvertering på ett pålitligt sätt i vilken Python‑miljö som helst. + +--- + +## Vad bör du lära dig härnäst? + +Följande handledningar täcker närbesläktade ämnen som bygger på teknikerna som demonstreras i denna guide. Varje resurs innehåller kompletta fungerande kodexempel med steg‑för‑steg‑förklaringar för att hjälpa dig bemästra ytterligare API‑funktioner och utforska alternativa implementeringsmetoder i dina egna projekt. + +- [Konvertera HTML till PDF med Aspose.HTML – Fullständig steg‑för‑steg‑guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Konvertera HTML till PDF med Aspose.HTML – Fullständig manipuleringsguide](/html/english/) +- [Konvertera HTML till PDF i .NET med Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/swedish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/swedish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..b15f425aa6 --- /dev/null +++ b/html/swedish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,217 @@ +--- +category: general +date: 2026-09-19 +description: Lär dig att konvertera HTML till Markdown i Python. Denna handledning + visar hur du sparar HTML som Markdown och snabbt genererar Markdown från HTML. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: sv +lastmod: 2026-09-19 +og_description: Konvertera HTML till Markdown med Python. Följ den här guiden för + att spara HTML som Markdown, generera Markdown från HTML och skapa en HTML‑till‑Markdown‑fil. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Konvertera HTML till Markdown i Python – komplett programmeringsguide +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Hur man konverterar HTML till Markdown med Python – steg‑för‑steg‑guide +url: /sv/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hur man konverterar HTML till Markdown med Python – steg‑för‑steg‑guide + +Om du behöver **konvertera HTML till Markdown**, guidar den här handledningen dig genom hela processen. Du kommer att se hur du **sparar HTML som Markdown**, genererar Markdown från HTML, och skapar en *html to markdown file* som kan användas i statiska webbplatsgeneratorer, dokumentationspipelines eller vilket arbetsflöde som helst som föredrar ren‑text markup. + +Handledningen täcker allt från att installera det nödvändiga biblioteket till att hantera kantfall som inbäddade bilder och anpassad formatering. I slutet har du ett färdigt skript att köra och en klar förståelse för varför varje steg är viktigt. + +## Förutsättningar + +- Python 3.8 eller nyare installerat på din maskin. +- Grundläggande kunskap om Python‑skriptning. +- Tillgång till en terminal eller kommandoprompt. +- Biblioteket `aspose.html` (eller något kompatibelt HTML‑to‑Markdown‑paket). Denna handledning använder **Aspose.HTML for Python via .NET**, som tillhandahåller klasserna `HTMLDocument`, `MarkdownSaveOptions` och `Converter` som visas i kodexemplet. + +> **Pro tip:** Om du föredrar en ren‑Python‑lösning kan du ersätta `aspose.html` med paketet `html2text`. Den övergripande flödet förblir detsamma. + +## Steg 1: Installera konverteringsbiblioteket + +Först, installera biblioteket som tillhandahåller `HTMLDocument`, `MarkdownSaveOptions` och `Converter`. Kör följande kommando: + +```bash +pip install aspose-html +``` + +Paketet inkluderar den inbyggda motorn som behövs för att **generera markdown från html** snabbt och med hög noggrannhet. Installationen slutförs vanligtvis på under en minut på en standard bredbandsanslutning. + +## Steg 2: Läs in käll‑HTML‑dokumentet + +Att läsa in HTML‑filen är den första konkreta handlingen i konverteringspipen. Klassen `HTMLDocument` analyserar filen och bygger ett DOM‑träd i minnet, som konvertern senare traverserar för att producera Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Varför detta är viktigt:** Genom att skapa ett `HTMLDocument`‑objekt säkerställer du att komplexa strukturer—tabeller, listor och inline‑stilar—tolkas korrekt innan konvertering. Att hoppa över detta steg skulle tvinga konvertern att läsa rå text, vilket leder till förlorad formatering. + +## Steg 3: Konfigurera Markdown‑sparalternativ + +`MarkdownSaveOptions`‑objektet låter dig finjustera utdataformatet. För att producera **Git‑flavored Markdown**, sätt egenskapen `formatter` till `"GIT"`. Detta matchar syntaxen som används av plattformar som GitHub, GitLab och Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Du kan också justera andra inställningar, såsom `preserve_links` eller `code_block_style`, beroende på hur du planerar att **save html as markdown** i efterföljande verktyg. + +## Steg 4: Konvertera HTML till Markdown och spara resultatet + +När dokumentet är läst och alternativen konfigurerade, anropa den statiska metoden `convert_html`. Denna metod läser DOM‑trädet, tillämpar den valda formatteraren och skriver utdatafilen. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Efter att ha kört skriptet hittar du en ny fil med namnet `output.md` i den angivna katalogen. När du öppnar den visas ren, Git‑kompatibel Markdown redo för versionskontroll eller publicering. + +## Steg 5: Verifiera den genererade markdown‑filen + +En snabb kontroll hjälper dig bekräfta att konverteringen lyckades och att **html to markdown file** innehåller det förväntade innehållet. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Typisk utdata för en enkel HTML‑sida ser ut så här: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Om du märker saknade rubriker eller felaktiga listor, gå tillbaka till **Steg 3** och experimentera med olika `formatter`‑värden (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Avancerat: Hantera bilder och relativa sökvägar + +När käll‑HTML innehåller bilder kan konvertern antingen bädda in dem som data‑URI:er eller bevara de ursprungliga `src`‑attributen. För att hålla processen **generate markdown from html** lättviktig kan du vilja kopiera bildfiler till en parallell mapp och justera sökvägarna. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Efter konverteringen kommer Markdown att referera till bilder som `![Alt text](images/picture.png)`. Detta tillvägagångssätt fungerar bra när du senare **save html as markdown** i en statisk webbplatsgenerator som förväntar sig resurser i en dedikerad mapp. + +## Fullständigt skript du kan kopiera‑klistra in + +Nedan är det kompletta, körbara skriptet som inkluderar alla stegen som diskuterats. Spara det som `convert_html_to_md.py` och kör med `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Förväntad utdata + +När skriptet körs skrivs ett bekräftelsemeddelande ut följt av de första tio raderna i Markdown‑filen, som visat tidigare. Den genererade `output.md` kan öppnas i vilken textredigerare som helst, förhandsgranskas i VS Code eller commitas till ett Git‑arkiv. + +## Vanliga frågor och hantering av kantfall + +| Fråga | Svar | +|----------|--------| +| **Vad händer om HTML‑filen är stor (> 10 MB)?** | Klassen `HTMLDocument` strömmar indata, så minnesanvändningen förblir måttlig. Överväg dock att öka Python‑processens minnesgräns om du stöter på `MemoryError`. | +| **Kan jag konvertera en HTML‑sträng istället för en fil?** | Ja. Använd `HTMLDocument.from_string(html_string)` (eller motsvarande konstruktor) innan du anropar `Converter.convert_html`. | +| **Hur behåller jag ursprungliga HTML‑kommentarer?** | Sätt `md_options.preserve_comments = True`. Kommentarerna kommer att visas som HTML‑kommentarer (`<!-- … -->`) i Markdown‑filen. | +| **Är det möjligt att rikta in sig på en annan Markdown‑dialekt?** | Ändra `md_options.formatter` till `"COMMONMARK"` eller `"MARKDOWN_EXTRA"` beroende på målplattformen. | +| **Behöver jag installera .NET‑runtime separat?** | `aspose-html`‑paketet inkluderar den nödvändiga runtime‑miljön för de flesta plattformar. På Linux, se till att `libgdiplus` är installerat (`sudo apt-get install libgdiplus`). | + +## Slutsats + +Du vet nu hur du **convert HTML to Markdown** med Python, hur du **save html as markdown**, och hur du **generate markdown from html** med fin‑granulär kontroll över formatering och resurser. Skriptet demonstrerar hela arbetsflödet—från att läsa in källfilen till att producera en ren *html to markdown file* klar för versionskontroll eller publicering. + +Nästa steg är att utforska relaterade ämnen som **batch converting multiple HTML files**, integrera konverteringssteget i en CI/CD‑pipeline, eller anpassa Markdown‑utdata för specifika statiska webbplatsgeneratorer som Hugo eller Jekyll. Experimentera med de olika `MarkdownSaveOptions`‑inställningarna för att skräddarsy resultatet efter ditt projekts stilguide. + +Lycka till med konverteringen! + +## Vad bör du lära dig härnäst? + +Följande handledningar täcker närliggande ämnen som bygger på teknikerna som demonstrerats i denna guide. Varje resurs innehåller kompletta fungerande kodexempel med steg‑för‑steg‑förklaringar för att hjälpa dig bemästra ytterligare API‑funktioner och utforska alternativa implementationsmetoder i dina egna projekt. + +- [Konvertera HTML till Markdown i .NET med Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Konvertera HTML till Markdown i Aspose.HTML för Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown till HTML Java – Konvertera med 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/swedish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/swedish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..edc3aa8406 --- /dev/null +++ b/html/swedish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Hur man aktiverar funktioner när man konverterar HTML till Markdown med + Python. Lär dig att konvertera HTML-dokument och spara HTML som Markdown med exakt + funktionskontroll. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: sv +lastmod: 2026-09-19 +og_description: Hur du aktiverar funktioner när du konverterar HTML till Markdown. + Den här guiden visar dig steg för steg hur du konverterar ett HTML‑dokument och + sparar HTML som Markdown med fin‑granulär kontroll. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Hur man aktiverar funktioner när man konverterar HTML till Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Hur man aktiverar funktioner när man konverterar HTML till Markdown +url: /sv/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hur du aktiverar funktioner när du konverterar HTML till Markdown + +Om du behöver **how to enable features** under en konvertering, ger den här guiden dig en komplett, körbar lösning. Du kommer att se exakt hur du konverterar HTML till Markdown, styr vilka Markdown‑funktioner som genereras och sparar HTML som Markdown i ett enda steg. + +Exemplet använder det populära **GroupDocs.Conversion** Python SDK, men koncepten gäller för alla bibliotek som låter dig konfigurera funktionsuppsättningar. I slutet av den här handledningen kan du konvertera ett HTML‑dokument, behålla endast länkar och stycken, och undvika oönskade tabeller, bilder eller kodblock. + +## Vad du kommer att uppnå + +* **how to enable features** i Markdown‑spara‑alternativen +* ett tydligt **convert html to markdown** arbetsflöde +* möjligheten att **how to convert html** med selektiv output +* ett färdigt‑att‑köra‑skript som **convert html document** och **save html as markdown** + +### Förutsättningar + +* Python 3.8+ installerat +* `groupdocs-conversion` paket (installera med `pip install groupdocs-conversion`) +* En exempel‑HTML‑fil (`sample.html`) i en känd katalog + +--- + +## Hur du aktiverar funktioner i Markdown‑konvertering + +Det första steget är att skapa ett `MarkdownSaveOptions`‑objekt och tala om för konverteraren vilka element du vill behålla. I den här handledningen aktiverar vi endast **links** och **paragraphs**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Varför detta fungerar:** +* `HTMLDocument` omsluter källfilen så att konverteraren kan läsa den. +* `MarkdownSaveOptions` innehåller alla konverteringsinställningar; `features`‑listan är nyckelegenskapen som **how to enable features**. +* Genom att tilldela `["Link", "Paragraph"]` talar du om för motorn att bara generera Markdown‑länkar (`[text](url)`) och enkla stycken, och att utelämna bilder, tabeller och annan markup. +* `Converter.convert_html` utför den faktiska **convert html to markdown**‑operationen och skriver resultatet till `sample.md`. + +--- + +## Hur du konverterar HTML‑dokument med anpassade alternativ + +Om du senare behöver lägga till fler funktionsflaggor—såsom `"Header"` eller `"Bold"`—utöka bara listan: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +Samma anrop till `Converter.convert_html` kommer nu att inkludera dessa extra element. Detta mönster låter dig **how to convert html** på ett mycket konfigurerbart sätt utan att skriva egna parsers. + +--- + +## Hur du sparar HTML som Markdown i en specifik mapp + +`convert_html`‑metoden accepterar en absolut eller relativ utskrivningssökväg. För att **save html as markdown** i en undermapp som heter `output`, justera det tredje argumentet: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +När skriptet körs skapas katalogen `output` (om den inte redan finns) och Markdown‑filen skrivs dit. Detta tillvägagångssätt håller din käll‑HTML och genererade Markdown snyggt organiserade. + +--- + +## Fullt skript du kan kopiera‑och‑klistra + +Nedan är hela programmet, redo att köras. Ersätt `YOUR_DIRECTORY` med sökvägen som innehåller `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Förväntad output** (skrivet till konsolen): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Öppna `sample.md` så kommer du att se endast Markdown‑länkar och enkla stycken, till exempel: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Alla andra HTML‑element har utelämnats eftersom **how to enable features** begränsade output till de två valda typerna. + +--- + +## Vanliga frågor och specialfall + +| Fråga | Svar | +|----------|--------| +| *Vad händer om HTML‑filen inte innehåller några länkar?* | Konverteraren skriver fortfarande styckena; output kommer att innehålla ren text utan länk‑syntax. | +| *Kan jag inaktivera alla funktioner?* | Att sätta `markdown_options.features = []` resulterar i en tom Markdown‑fil. Använd detta endast för testning. | +| *Hur hanterar SDK:n ogiltig HTML?* | Parsern försöker rensa felaktig markup innan funktionsfiltret tillämpas. Fel loggas men stoppar inte konverteringen. | +| *Är det möjligt att behålla bilder samtidigt som tabeller tas bort?* | Ja. Sätt `markdown_options.features = ["Link", "Paragraph", "Image"]`. Funktionslistan är additiv, inte exklusiv. | +| *Vad händer om jag behöver konvertera många filer i en mapp?* | Omslut konverteringslogiken i en loop som itererar över `Path.glob("*.html")`. Samma **how to enable features**‑konfiguration kan återanvändas för varje fil. | + +**Pro tip:** När du bearbetar stora batcher, instansiera `MarkdownSaveOptions` en gång och återanvänd den. Detta minskar overhead för objekt‑skapande och håller **convert html to markdown**‑pipeline snabb. + +--- + +## Slutsats + +Du vet nu **how to enable features** när du **convert html to markdown**, hur du **how to convert html** med selektiv output, och hur du **convert html document** och **save html as markdown** med ett koncist Python‑skript. Genom att konfigurera `MarkdownSaveOptions.features` får du full kontroll över vilka Markdown‑element som visas i den slutliga filen. + +### Nästa steg + +* Utforska ytterligare funktionsflaggor såsom `"Header"`, `"Bold"` och `"Italic"` för att berika ditt Markdown‑output. +* Kombinera detta skript med en fil‑watcher (t.ex. `watchdog`) för att automatiskt konvertera nya HTML‑filer när de anländer. +* Granska [GroupDocs.Conversion Python SDK documentation](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) för avancerade scenarier som PDF‑till‑Markdown eller DOCX‑till‑HTML‑konverteringar. + +Känn dig fri att experimentera med olika funktionsuppsättningar och dela dina resultat med communityn. Lycka till med konverteringen! + +## Vad bör du lära dig härnäst? + +Följande handledningar täcker närbesläktade ämnen som bygger på teknikerna som demonstreras i den här guiden. Varje resurs innehåller kompletta fungerande kodexempel med steg‑för‑steg‑förklaringar för att hjälpa dig bemästra ytterligare API‑funktioner och utforska alternativa implementationsmetoder i dina egna projekt. + +- [Konvertera HTML till Markdown i Aspose.HTML för Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown till HTML Java – Konvertera med Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [Hur man aktiverar JavaScript i Aspose HTML – Ladda HTML & Hämta text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/swedish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/swedish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..6187b071fc --- /dev/null +++ b/html/swedish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,245 @@ +--- +category: general +date: 2026-09-19 +description: Lär dig hur du begränsar nästlade resurser i Aspose.HTML för Python med + ResourceHandlingOptions. Kontrollera maximalt hanteringsdjup och undvik oändliga + loopar. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: sv +lastmod: 2026-09-19 +og_description: Begränsa nästlade resurser i Aspose.HTML för Python med ResourceHandlingOptions. + Ställ in maximalt hanteringsdjup för att förhindra djup rekursion och förbättra + prestanda. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Hur man begränsar nästlade resurser i Aspose.HTML för Python – steg‑för‑steg‑guide +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Hur man begränsar nästlade resurser när man bearbetar HTML med Aspose.HTML + för Python +url: /sv/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hur man begränsar nästlade resurser när man bearbetar HTML med Aspose.HTML för Python + +Om du behöver **begränsa nästlade resurser** vid rendering eller konvertering av HTML, visar den här guiden de exakta stegen för att konfigurera Aspose.HTML för Python. Att kontrollera djupet för resurshantering förhindrar okontrollerad rekursion när en sida innehåller många lager av CSS, JavaScript eller bildreferenser. + +Att begränsa nästlade resurser är särskilt viktigt för storskaliga crawlers, e‑postrenderingspipelines eller någon automatiserad arbetsflöde som måste hålla sig inom minnes- och tidsbudgetar. I följande avsnitt kommer du att lära dig varför du bör sätta ett djupbegränsning, hur du använder klassen `ResourceHandlingOptions` och hur du verifierar att begränsningen fungerar som förväntat. + +## Varför du bör begränsa nästlade resurser + +HTML-dokument refererar ofta till andra resurser—stilmallar, skript, bilder, typsnitt eller till och med andra HTML-filer. Varje av dessa resurser kan i sin tur referera till ytterligare filer, vilket bildar ett beroendeträd. Utan en skyddsmekanism kan trädet bli godtyckligt djupt: + +* En sida laddar en CSS-fil som importerar en annan CSS-fil, som i sin tur importerar en annan, och så vidare. +* JavaScript kan dynamiskt ladda ytterligare skript. +* En e‑postmall kan bädda in bilder som refererar till externa URL:er som omdirigerar till fler tillgångar. + +När rekursionsdjupet växer utan kontroll riskerar du: + +* **Excessivt minnesbruk** – varje hämtad resurs upptar buffertar. +* **Längre bearbetningstider** – nätverkslatens multipliceras med varje nivå. +* **Potentiella oändliga loopar** – cirkulära referenser kan få motorn att aldrig återvända. + +Att sätta ett **max hanteringsdjup** instruerar Aspose.HTML att sluta följa resurslänkar efter ett givet antal nivåer, vilket säkerställer förutsägbar prestanda. + +## Hur du begränsar nästlade resurser i Aspose.HTML för Python + +Aspose.HTML tillhandahåller klassen `ResourceHandlingOptions`, som innehåller egenskapen `max_handling_depth`. Genom att tilldela ett numeriskt värde (t.ex. `3`) instruerar du motorn att sluta efter tre nästlade nivåer. + +Nedan är ett komplett, körbart exempel som demonstrerar hela arbetsflödet: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Förklaring av varje steg + +1. **Installera paketet** – Hjulet `aspose-html` krävs. `pip install`-kommandot visas som en kommentar för fullständighet. +2. **Importera klasser** – `HtmlDocument` laddar sidan, `ResourceHandlingOptions` håller begränsningen, och `HtmlLoadOptions` binder ihop dem. +3. **Skapa alternativobjektet** – Att instansiera `ResourceHandlingOptions` ger dig en muterbar behållare. +4. **Sätt `max_handling_depth`** – Tilldela `3` (eller vilket heltal som helst) för att begränsa motorn till tre nivåer av nästlade resurser. Detta är kärnan i **begränsa nästlade resurser**. +5. **Fäst alternativ på laddningskonfigurationen** – `HtmlLoadOptions` låter dig skicka `resource_options` till laddaren. +6. **Ladda HTML** – Konstruktorn för `HtmlDocument` accepterar en URL eller en filsökväg tillsammans med `load_options`. Motorn respekterar nu djupbegränsningen. +7. **Verifiera** – Genom att iterera över `document.resources` kan du se hur många resurser som faktiskt hämtades och det djupaste nivå som påträffades. Om den djupaste nivån är `3` eller lägre har begränsningen lyckats. +8. **Spara** – Spara det bearbetade dokumentet. Den sparade filen innehåller endast resurserna upp till det tillåtna djupet. + +#### Förväntad output + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +Numren kommer att variera beroende på källsidan, men den djupaste nivån bör aldrig överstiga `3` eftersom vi satte `max_handling_depth = 3`. + +## Vanliga variationer och kantfall + +### Ändra djupbegränsningen + +Du kan behöva en djupare eller grundare begränsning baserat på din miljö: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Inaktivera begränsningen helt + +Att sätta egenskapen till `0` instruerar Aspose.HTML att **ta bort alla djupbegränsningar**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Gör endast detta när du är säker på att käll-HTML är väl‑beteende. + +### Hantera cirkulära referenser + +Även med en djupbegränsning kan cirkulära referenser fortfarande dyka upp på samma nivå. Aspose.HTML upptäcker cykler och slutar ladda en resurs som redan har bearbetats, oavsett djupinställningen. Att sätta ett lägre `max_handling_depth` minskar dock risken att stöta på en cykel från början. + +### Använda begränsningen med lokala filer + +Samma tillvägagångssätt fungerar för lokala HTML-filer: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +Motorn behandlar relativa `href`- eller `src`-attribut på samma sätt som fjärr-URL:er och tillämpar djupbegränsningen även på filsystemresurser. + +### Integrera med andra Aspose.HTML-funktioner + +Om du också behöver kontrollera **resursnedladdningens timeout**, kan du kombinera `ResourceHandlingOptions` med `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Båda alternativen är oberoende, så du kan finjustera prestanda och säkerhet samtidigt. + +## Pro‑tips för produktionsanvändning + +* **Logga resurs‑trädet** – Vid felsökning, iterera över `document.resources` och logga varje resurs URL och djup. Detta hjälper dig att förstå varför en viss sida överstiger dina förväntningar. +* **Cacha hämtade resurser** – Om du bearbetar samma externa tillgångar upprepade gånger, aktivera caching för att undvika onödiga nätverksanrop. +* **Kombinera med en vitlista** – Om endast vissa domäner är betrodda, filtrera `document.resources` efter laddning och kassera de som ligger utanför vitlistan. +* **Testa med kantfalls‑sidor** – Skapa en syntetisk HTML-fil som importerar en kedja av 10 CSS-filer. Verifiera att din begränsning trunkerar kedjan som avsett. + +## Slutsats + +Du vet nu hur du **begränsar nästlade resurser** i Aspose.HTML för Python genom att konfigurera `ResourceHandlingOptions.max_handling_depth`. Att sätta en djupbegränsning skyddar din applikation från överdrivet minnesbruk, långa bearbetningstider och potentiella oändliga loopar orsakade av djupt nästlade eller cirkulära resursreferenser. + +Från denna punkt kan du: + +* Justera djupet för att matcha din prestandabudget (`resource_handling_options.max_handling_depth`). +* Kombinera begränsningen med nätverkstimeouts, caching eller domänsvitlistor för robusta pipelines. +* Utforska relaterade ämnen som **resource handling options**, **max handling depth** och **nested resource handling** för att ytterligare stärka kontrollen över HTML‑bearbetning. + +Experimentera med olika djupvärden och observera hur antalet laddade resurser förändras. När du är redo, integrera detta mönster i din större HTML‑konverterings‑ eller renderingtjänst för att säkerställa förutsägbar, säker och effektiv körning. + +## Vad bör du lära dig härnäst? + +Följande handledningar täcker närbesläktade ämnen som bygger på teknikerna som demonstrerats i den här guiden. Varje resurs innehåller kompletta fungerande kodexempel med steg‑för‑steg‑förklaringar för att hjälpa dig bemästra ytterligare API‑funktioner och utforska alternativa implementationsmetoder i dina egna projekt. + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/swedish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/swedish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..ca2c8d39be --- /dev/null +++ b/html/swedish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,259 @@ +--- +category: general +date: 2026-09-19 +description: Lär dig en HTML‑till‑PDF‑handledning i Python som visar hur du snabbt + kan generera PDF från HTML med Aspose.HTML. Följ steg‑för‑steg‑guiden nu. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: sv +lastmod: 2026-09-19 +og_description: 'html till pdf handledning: Konvertera vilken HTML-sida som helst + till en PDF-fil med Python och Aspose.HTML. Denna guide visar hur du genererar pdf + från html på några minuter.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: HTML till PDF‑handledning i Python – komplett steg‑för‑steg‑guide +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Hur man gör en HTML‑till‑PDF‑handledning med Python +url: /sv/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Hur man utför en html till pdf handledning med Python + +Om du behöver en **html to pdf tutorial**, visar den här guiden exakt hur du genererar en PDF från HTML med bara några rader Python‑kod. Oavsett om du automatiserar rapportgenerering eller exporterar webbinnehåll för offline‑läsning, gör Aspose.HTML‑biblioteket konverteringen smärtfri. + +I den här handledningen kommer du att lära dig hur du sätter upp miljön, skriver konverteringsskriptet och hanterar vanliga kantfall såsom saknade filer eller anpassade sidinställningar. I slutet kan du **how to generate pdf** filer från vilken HTML‑källa som helst utan att lämna Python‑ekosystemet. + +## Vad du behöver + +* Python 3.8 eller nyare installerat +* En aktiv Aspose.HTML för Python‑licens (en gratis provversion fungerar för utvärdering) +* `pip`‑åtkomst för att installera paketet `aspose-html` +* En enkel HTML‑fil du vill konvertera (t.ex. `input.html`) + +> **Pro tip:** Håll din HTML och tillhörande resurser (bilder, CSS) i samma katalog för att undvika problem med sökvägsupplösning under konverteringen. + +## Steg 1: Installera Aspose.HTML‑paketet + +Öppna en terminal och kör följande kommando: + +```bash +pip install aspose-html +``` + +`aspose-html`‑wheeln innehåller de inhemska biblioteken som behövs för rendering av hög kvalitet, så inga ytterligare systemberoenden krävs. + +## Steg 2: Skapa ett minimalt Python‑skript + +Skapa en ny fil med namnet `convert_html_to_pdf.py` och klistra in koden nedan. Detta skript följer **html to pdf tutorial**‑mönstret med en trestegsprocess: import, definiera sökvägar och anropa konverteringen. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Varför detta fungerar + +* **Import av `Converter`** ger dig tillgång till ett hög‑nivå‑API som abstraherar bort renderingsmotorn. +* **Definiera absoluta sökvägar** förhindrar buggar med relativa sökvägar när skriptet körs från en annan arbetskatalog. +* **`Converter.convert_html`** utför hela renderingspipeline‑processen — HTML‑parsing, CSS‑layout och PDF‑serialisering — i ett enda anrop, vilket är det rekommenderade sättet att **how to generate pdf** snabbt. + +## Steg 3: Kör skriptet och verifiera resultatet + +Kör skriptet från terminalen: + +```bash +python convert_html_to_pdf.py +``` + +Om allt är korrekt konfigurerat kommer du att se: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Öppna `output.pdf` med någon PDF‑visare. Dokumentet bör se identiskt ut med den ursprungliga HTML‑sidan, inklusive typsnitt, bilder och grundläggande CSS‑formatering. + +![Förhandsgranskning av genererad PDF](https://example.com/images/pdf-preview.png "Skärmbild av genererad PDF från HTML med Python"){: .center-image alt="Skärmbild av en PDF genererad från en HTML‑fil med Python"} + +## Steg 4: Anpassa konverteringen (valfritt) + +Den grundläggande **html to pdf tutorial** täcker en en‑till‑en‑konvertering, men verkliga scenarier kräver ofta justeringar: + +| Krav | Så uppnår du det med Aspose.HTML | +|------|-----------------------------------| +| Ställ in sidstorlek (A4, Letter) | Skicka ett `PdfSaveOptions`‑objekt till `convert_html` | +| Lägg till marginaler eller sidhuvuden/sidfötter | Använd `PdfPageSettings` i alternativet | +| Bädda in anpassade typsnitt | Se till att typsnittsfilerna är åtkomliga och ange `FontSettings` | + +Nedan är ett exempel som ställer in sidstorleken till A4 och lägger till en marginal på 1 tum: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Obs:** Att använda anpassade alternativ är den föredragna **generate pdf from html**‑tekniken när du behöver exakt kontroll över layouten. + +## Steg 5: Hantera flera HTML‑filer (batch‑konvertering) + +Om du har en mapp full av HTML‑rapporter kan du loopa igenom dem: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Detta kodsnutt demonstrerar ett skalbart **python convert html pdf**‑arbetsflöde som passar in i CI‑pipelines eller schemalagda jobb. + +## Vanliga fallgropar och hur du undviker dem + +| Problem | Orsak | Lösning | +|---------|-------|---------| +| Saknade bilder i PDF | Relativa bildvägar som bryts när skriptet körs från en annan mapp | Använd absoluta sökvägar eller ange `base_uri` i `Converter`‑alternativen | +| CSS tillämpas inte | Extern stilmall refererad med en URL som kräver internetåtkomst | Ladda ner stilmallen lokalt och referera den med en relativ sökväg | +| Typsnittssubstitution | Typsnittet är inte installerat på värddatorn | Inkludera typsnittsfilen i projektet och konfigurera `FontSettings` | + +Att hantera dessa kantfall säkerställer att din **export html as pdf**‑process är robust över olika miljöer. + +## Fullt, körbart exempel + +Nedan är det kompletta skriptet som inkluderar valfria inställningar, felhantering och batch‑bearbetningslogik. Kopiera det till `full_html_to_pdf.py` och kör det som visat tidigare. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Att köra detta skript producerar en PDF för varje HTML‑fil i mål‑katalogen, med konsekventa sidinställningar — en komplett **python convert html pdf**‑lösning redo för produktion. + +## Slutsats + +Du har nu en praktisk **html to pdf tutorial** som visar hur du genererar PDF‑filer från HTML med Python och Aspose.HTML. Guiden täckte miljöinställning, ett minimalt konverteringsskript, valfri anpassning, batch‑bearbetning och felsökningstips. + +Härifrån kan du utforska relaterade ämnen såsom **how to generate pdf** med vattenstämplar, sammanslagning av flera PDF‑filer, eller konvertering av HTML till andra format som DOCX. Experimentera med `PdfSaveOptions`‑API:n för att finjustera resultatet, och integrera skriptet i webbtjänster eller automatiserade rapporteringspipelines. + +Lycka till med kodandet, och njut av att förvandla ditt HTML‑innehåll till polerade PDF‑filer! + +## Vad bör du lära dig härnäst? + +Följande handledningar täcker närbesläktade ämnen som bygger på teknikerna som demonstrerats i den här guiden. Varje resurs innehåller kompletta fungerande kodexempel med steg‑för‑steg‑förklaringar för att hjälpa dig bemästra ytterligare API‑funktioner och utforska alternativa implementationsmetoder i dina egna projekt. + +- [Konvertera HTML till PDF med Aspose.HTML – Fullständig steg‑för‑steg‑guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Konvertera HTML till PDF med Aspose.HTML – Fullständig manipuleringsguide](/html/english/) +- [Hur man konverterar HTML till PDF i Java – Med Aspose.HTML för Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/thai/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/thai/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..bc02818b25 --- /dev/null +++ b/html/thai/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,260 @@ +--- +category: general +date: 2026-09-19 +description: เรียนรู้วิธีเปลี่ยนชื่อเรื่องในไฟล์ HTML ด้วย Python คู่มือนี้ครอบคลุมการอ่าน + HTML, การอัปเดตแท็ก title, และการบันทึก HTML ที่แก้ไขแล้ว. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: th +lastmod: 2026-09-19 +og_description: วิธีเปลี่ยนชื่อเรื่องในไฟล์ HTML ด้วย Python. ทำตามตัวอย่างเต็มนี้เพื่ออ่าน + HTML, ปรับปรุงแท็ก title, และบันทึกเอกสารที่แก้ไขแล้ว. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: วิธีเปลี่ยนชื่อเรื่องในไฟล์ HTML ด้วย Python – คู่มือขั้นตอนโดยละเอียด +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: วิธีเปลี่ยนหัวเรื่องในไฟล์ HTML ด้วย Python +url: /th/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# วิธีเปลี่ยน title ในไฟล์ HTML ด้วย Python + +หากคุณต้องการ **how to change title** ในเอกสาร HTML อย่างอัตโนมัติ Python ทำให้การทำงานนี้ง่ายดาย ในบทแนะนำนี้คุณจะอ่านไฟล์ HTML, ปรับปรุงองค์ประกอบ `<title>`, และบันทึก HTML ที่แก้ไขแล้วกลับไปยังดิสก์—ทั้งหมดด้วยโค้ดที่ชัดเจนและสามารถรันได้ + +การเปลี่ยน title ของหน้าเป็นขั้นตอนทั่วไปเมื่อคุณสร้างเว็บไซต์แบบสถิต, ปรับแต่งหน้าที่ดึงข้อมูล, หรือทำการอัปเดต SEO อัตโนมัติ เมื่อจบคู่มือนี้คุณจะรู้วิธี **update html title**, วิธี **read html with python**, และวิธี **save modified html** อย่างปลอดภัย + +## ข้อกำหนดเบื้องต้น + +- ติดตั้ง Python 3.8 หรือใหม่กว่า +- แพ็กเกจ `beautifulsoup4` (`pip install beautifulsoup4`) +- ไฟล์ HTML ที่คุณต้องการแก้ไข (ตัวอย่างใช้ `index.html` ในโฟลเดอร์ที่คุณเลือก) + +ไม่จำเป็นต้องใช้บริการภายนอก; ทุกอย่างทำงานในเครื่อง + +## ขั้นตอนที่ 1: โหลดไฟล์ HTML ด้วย Python + +งานแรกคือ **load html file python**‑style. การใช้ `BeautifulSoup` จะให้พาร์เซอร์ที่ยืดหยุ่นและทำงานกับมาร์กอัปที่ไม่สมบูรณ์ได้ + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*ทำไมขั้นตอนนี้สำคัญ:* +`BeautifulSoup` สร้างโครงสร้างต้นไม้ ทำให้คุณสามารถสอบถามและแก้ไของค์ประกอบโดยไม่ต้องจัดการสตริงด้วยตนเอง `html.parser` ที่มาพร้อมนั้นเร็วและไม่ต้องการไบนารีเพิ่มเติม + +## ขั้นตอนที่ 2: ค้นหาองค์ประกอบ `<title>` + +เอกสาร HTML มักมีแท็ก `<title>` เพียงหนึ่งตัวอยู่ใน `<head>` เราจะดึงการปรากฏครั้งแรก ซึ่งตอบสนองความต้องการ **update html title** + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*ทำไมเราตรวจสอบ `None`*: +บางส่วนของ HTML อาจไม่มี title การเพิ่มอัตโนมัติจะป้องกันข้อผิดพลาดในภายหลังและทำให้สคริปต์มั่นคง + +## ขั้นตอนที่ 3: เปลี่ยนข้อความ title + +ตอนนี้เราจะ **update html title** โดยกำหนดข้อความใหม่ให้กับ string ของแท็ก นี่คือหัวใจของการทำ **how to change title** + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +แอตทริบิวต์ `string` แทนโหนดข้อความภายใน `<title>` การเขียนทับจะอัปเดต DOM ในหน่วยความจำ + +## ขั้นตอนที่ 4: บันทึก HTML ที่แก้ไขแล้ว + +สุดท้ายให้เขียนเอกสารที่เปลี่ยนแปลงไปยังไฟล์ใหม่ ซึ่งทำให้ขั้นตอน **save modified html** เสร็จสมบูรณ์และไฟล์ต้นฉบับยังคงไม่ถูกแก้ไข + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` จัดรูปแบบผลลัพธ์ด้วยการเยื้อง ทำให้ไฟล์อ่านง่ายหลังการเปลี่ยนแปลง + +### ผลลัพธ์ที่คาดหวัง + +การรันสคริปต์บน `index.html` ตัวอย่างที่มีเนื้อหาเดิมคือ: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +จะสร้างผลลัพธ์ในคอนโซลคล้ายกับ: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +ไฟล์ `index_modified.html` ที่บันทึกแล้วจะเริ่มต้นด้วย: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## สคริปต์เต็มสำหรับคัดลอก‑วางเร็ว + +ด้านล่างเป็นโปรแกรมที่สมบูรณ์พร้อมรันที่รวมขั้นตอนสี่ขั้นตอนเข้าด้วยกัน บันทึกเป็น `change_title.py` และปรับ `YOUR_DIRECTORY` ตามต้องการ + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +รันสคริปต์: + +```bash +python change_title.py +``` + +คุณจะเห็นข้อความในคอนโซลและไฟล์ `index_modified.html` ใหม่ที่มี title ที่อัปเดต + +## เคล็ดลับเพิ่มเติมและกรณีขอบ + +| สถานการณ์ | วิธีทำ | +|-----------|------------| +| **Multiple `<title>` tags** | `soup.find_all("title")` คืนค่าเป็นรายการ; อัปเดตองค์ประกอบแรกหรือวนลูปหากต้องการเปลี่ยนทั้งหมด. | +| **Encoding problems** | เปิดไฟล์ด้วย `encoding="utf-8-sig"` หากมี BOM, หรือตรวจจับการเข้ารหัสด้วย `chardet`. | +| **Large HTML files** | ใช้พาร์เซอร์ `lxml` (`BeautifulSoup(html_content, "lxml")`) เพื่อประสิทธิภาพที่ดีกว่า. | +| **Preserving original formatting** | หากต้องการรักษาการเว้นวรรคเดิมอย่างแม่นยำ ให้เขียน `str(soup)` แทน `prettify()`. | +| **Automating across many files** | ห่อหุ้มตรรกะในฟังก์ชันและวนลูปผ่าน `Path.rglob("*.html")`. | + +การปรับเปลี่ยนเหล่านี้ทำให้ตรรกะหลักของ **how to change title** ยังคงอยู่ในขณะที่ปรับให้เข้ากับโครงการจริง + +## สรุป + +ตอนนี้คุณรู้วิธี **how to change title** ในเอกสาร HTML ใด ๆ ด้วย Python บทแนะนำได้ครอบคลุมการอ่าน HTML, การค้นหาแท็ก `<title>`, การอัปเดตข้อความของมัน, และการ **save modified html** อย่างปลอดภัย ด้วยสคริปต์เต็มคุณสามารถนำรูปแบบนี้ไปใช้ใน static‑site generators, pipeline SEO, หรือการอัตโนมัติใด ๆ ที่ต้องการการเปลี่ยน title แบบไดนามิก + +ต่อไปสำรวจหัวข้อที่เกี่ยวข้องเช่น **read html with python** เพื่อดึงข้อมูล meta tags, หรือเทคนิค **load html file python** สำหรับจัดการมาร์กอัปที่ผิดรูป ทดลองการประมวลผลเป็นชุดเพื่ออัปเดต title ทั่วทั้งเว็บไซต์—ทักษะใหม่ของคุณเป็นพื้นฐานสำหรับงานอัตโนมัติเว็บหลายอย่าง ขอให้สนุกกับการเขียนโค้ด! + +## คุณควรเรียนรู้อะไรต่อไป? + +บทแนะนำต่อไปนี้ครอบคลุมหัวข้อที่เกี่ยวข้องอย่างใกล้ชิดซึ่งต่อยอดจากเทคนิคที่แสดงในคู่มือนี้ แต่ละแหล่งข้อมูลมีตัวอย่างโค้ดทำงานเต็มรูปแบบพร้อมคำอธิบายทีละขั้นตอนเพื่อช่วยให้คุณเชี่ยวชาญฟีเจอร์ API เพิ่มเติมและสำรวจแนวทางการทำงานทางเลือกในโครงการของคุณ + +- [วิธีบันทึก HTML ด้วย Aspose.Html – คู่มือ C# ฉบับสมบูรณ์](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [วิธีบันทึก HTML ใน C# – คู่มือฉบับสมบูรณ์โดยใช้ Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [วิธีแปลง HTML เป็น PNG – คู่มือขั้นตอนเต็ม](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/thai/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/thai/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..f8dd189b31 --- /dev/null +++ b/html/thai/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,203 @@ +--- +category: general +date: 2026-09-19 +description: แปลงไฟล์ HTML ในเครื่องเป็น PDF ด้วย Python และ Aspose.HTML – คู่มือครบถ้วนแบบขั้นตอนต่อขั้นตอนที่ยังครอบคลุมตัวเลือกการแปลง + HTML เป็น PDF ด้วย Python +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: th +lastmod: 2026-09-19 +og_description: แปลงไฟล์ HTML ในเครื่องเป็น PDF ด้วย Python. เรียนรู้วิธีที่ดีที่สุดในการแปลง + HTML เป็น PDF ด้วย Python โดยใช้ Aspose.HTML รวมถึงการฝังฟอนต์และการจัดการข้อผิดพลาด. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: แปลงไฟล์ HTML ในเครื่องเป็น PDF ด้วย Python – คู่มือเต็ม +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: วิธีแปลงไฟล์ HTML ในเครื่องเป็น PDF ด้วย Python +url: /th/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# วิธีแปลงไฟล์ HTML ภายในเครื่องเป็น PDF ด้วย Python + +หากคุณต้องการ **แปลงไฟล์ HTML ภายในเครื่องเป็น PDF** ในโครงการ Python นี้ บทแนะนำจะแสดงวิธีแก้ที่พร้อมใช้งาน คุณจะได้เห็นวิธีตั้งค่าไลบรารี Aspose.HTML, กำหนดค่า PDF options, และดำเนินการแปลงด้วยเพียงไม่กี่บรรทัดของโค้ด คู่มือนี้ยังอธิบายแนวปฏิบัติที่ดีที่สุดของ **convert html to pdf python** เพื่อให้คุณปรับโค้ดให้เข้ากับกระบวนการทำงานของคุณ + +ขั้นตอนด้านล่างครอบคลุมทุกสิ่งที่คุณต้องรู้: การติดตั้ง SDK, การเตรียมตัวเลือกการบันทึก, การจัดการกับข้อผิดพลาดทั่วไป, และการตรวจสอบผลลัพธ์ เมื่ออ่านจบบทความคุณจะมีฟังก์ชันที่นำกลับมาใช้ใหม่ได้ซึ่งสามารถใส่ลงในแอปพลิเคชัน Python ใดก็ได้ + +## ข้อกำหนดเบื้องต้น + +ก่อนเริ่มทำงาน ให้ตรวจสอบว่าคุณมี: + +* Python 3.8 หรือใหม่กว่า ติดตั้งอยู่บนเครื่องของคุณ +* ใบอนุญาต Aspose.HTML for Python ที่ใช้งานได้ (รุ่นทดลองฟรีใช้สำหรับการประเมิน) +* ไฟล์ HTML ภายในเครื่องที่ต้องการแปลงเป็น PDF (เช่น `page.html`) + +คุณไม่จำเป็นต้องติดตั้ง dependency ระดับระบบเพิ่มเติม; SDK มีทุกอย่างที่จำเป็นสำหรับการสร้าง PDF มาให้แล้ว + +## ติดตั้งแพ็กเกจ Aspose.HTML + +Aspose.HTML SDK แจกจ่ายผ่าน PyPI ติดตั้งด้วย `pip` ในสภาพแวดล้อมเสมือนของคุณ: + +```bash +pip install aspose-html +``` + +การรันคำสั่งจะแสดงเวอร์ชันที่ติดตั้ง เพื่อยืนยันว่าแพ็กเกจพร้อมสำหรับการ import + +## ขั้นตอนที่ 1: นำเข้าคลาสที่จำเป็น + +กระบวนการแปลงอาศัยคลาสหลักสองคลาส: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` มีเมธอดสแตติก `convert_html` ที่ทำการแปลงจริง +* `PDFSaveOptions` ให้คุณปรับแต่งผลลัพธ์ PDF เช่น การฝังฟอนต์มาตรฐาน + +## ขั้นตอนที่ 2: สร้าง PDF save options และเปิดใช้งานการฝังฟอนต์มาตรฐาน + +การฝังฟอนต์รับประกันว่า PDF ที่สร้างจะมีลักษณะเดียวกันบนทุกอุปกรณ์ แม้ว่าผู้อ่าน PDF จะไม่มีฟอนต์นั้นติดตั้งอยู่ในเครื่อง + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +การตั้งค่า `embed_standard_fonts` เป็น `True` แนะนำสำหรับสถานการณ์การผลิตส่วนใหญ่ เพราะจะขจัดคำเตือนการแทนที่ฟอนต์ในโปรแกรมอ่าน PDF + +## ขั้นตอนที่ 3: แปลงไฟล์ HTML เป็น PDF ด้วยตัวเลือกที่กำหนดไว้ + +ตอนนี้เรียก `Converter.convert_html` โดยส่งพาธของไฟล์ HTML ต้นทาง, พาธของไฟล์ PDF ปลายทาง, และอ็อบเจกต์ options ที่คุณเตรียมไว้: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +หากการแปลงสำเร็จ เมธอดจะคืนค่า `None` และไฟล์ PDF จะปรากฏที่ตำแหน่งที่คุณระบุ + +## ตัวอย่างเต็มในฟังก์ชันที่นำกลับมาใช้ใหม่ได้ + +การห่อหุ้มโลจิกในฟังก์ชันทำให้สามารถนำไปใช้ซ้ำได้ง่ายในหลายโครงการ: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### ทำไมฟังก์ชันนี้จึงมีประโยชน์ + +* **การตรวจสอบอินพุต** – `FileNotFoundError` ทำให้การดีบักง่ายขึ้นเมื่อพาธ HTML ผิด +* **การสร้างไดเรกทอรีอัตโนมัติ** – `os.makedirs(..., exist_ok=True)` ป้องกันข้อผิดพลาด “directory does not exist” +* **การกำหนดการฝังฟอนต์** – คุณสามารถปิดการฝังฟอนต์เพื่อให้ไฟล์มีขนาดเล็กลง หากทราบว่าเป้าหมายมีฟอนต์ที่ต้องการอยู่แล้ว + +## กรณีขอบที่พบบ่อยและวิธีจัดการ + +| สถานการณ์ | วิธีจัดการที่แนะนำ | +|-----------|----------------------| +| **HTML มี CSS หรือรูปภาพภายนอก** | ใช้ URL แบบเต็มหรือคัดลอกทรัพยากรไว้ข้างไฟล์ HTML; Aspose.HTML ทำตามกฎเดียวกับเบราว์เซอร์ | +| **ไฟล์ HTML ขนาดใหญ่ (>10 MB)** | เพิ่มขีดจำกัดหน่วยความจำเริ่มต้นโดยตั้งค่า `pdf_options.memory_limit` หากเจอ `OutOfMemoryException` | +| **ต้องการ PDF ที่มีรหัสผ่าน** | ตั้งค่า `pdf_options.encryption_details` พร้อมรหัสผ่านผู้ใช้ก่อนเรียก `convert_html` | +| **รันบนเซิร์ฟเวอร์แบบ headless** | ไม่ต้องตั้งค่าเพิ่มเติม; SDK ไม่พึ่งพา GUI | + +การจัดการกับสถานการณ์เหล่านี้ล่วงหน้าจะช่วยให้คุณหลีกเลี่ยงข้อผิดพลาดรันไทม์ที่ไม่คาดคิด + +## ตรวจสอบผลลัพธ์การแปลง + +หลังจากสคริปต์ทำงานเสร็จ เปิด PDF ที่สร้างด้วยโปรแกรมอ่านใดก็ได้ (Adobe Reader, Chrome ฯลฯ) รูปแบบภาพควรตรงกับ HTML ดั้งเดิม และฟอนต์ทั้งหมดควรแสดงอย่างถูกต้องเนื่องจากได้ฝังไว้แล้ว + +คุณยังสามารถตรวจสอบโดยโปรแกรมได้ว่าไฟล์มีอยู่และมีขนาดไม่เป็นศูนย์: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## เคล็ดลับสำหรับการใช้งานในสภาพแวดล้อมการผลิต + +* **การประมวลผลเป็นชุด** – วนลูปผ่านรายการไฟล์ HTML และเรียก `html_to_pdf` สำหรับแต่ละไฟล์; ใช้ `PDFSaveOptions` ตัวเดียวเพื่อหลีกเลี่ยงการสร้างอ็อบเจกต์ซ้ำหลายครั้ง +* **การบันทึกล็อก** – ผสานโมดูล `logging` ของ Python เพื่อบันทึกเวลาการแปลงและข้อยกเว้นใด ๆ +* **ประสิทธิภาพ** – เมื่อแปลงหลายไฟล์ ให้พิจารณาเรียกแปลงแบบขนานด้วย `concurrent.futures.ThreadPoolExecutor` แต่ต้องจำไว้ว่า SDK มีความปลอดภัยต่อเธรดเฉพาะสำหรับการเรียก `Converter` แยกกันเท่านั้น + +## สรุป + +คุณมีวิธีที่ครบถ้วนและพร้อมใช้งานในสภาพแวดล้อมการผลิตเพื่อ **แปลงไฟล์ HTML ภายในเครื่องเป็น PDF** ด้วย Python วิธีนี้ครอบคลุมขั้นตอนสำคัญ—การติดตั้ง Aspose.HTML, การกำหนดค่า PDF options, การจัดการกรณีขอบที่พบบ่อย, และการตรวจสอบผลลัพธ์—พร้อมแสดงกระบวนการ **convert html to pdf python** อย่างเต็มรูปแบบ + +จากนี้คุณสามารถสำรวจฟีเจอร์ขั้นสูงเช่น การเข้ารหัส PDF, การกำหนดขนาดหน้ากระดาษแบบกำหนดเอง, หรือการเพิ่มลายน้ำ ซึ่งทั้งหมดนี้รองรับโดย SDK เดียวกัน ทดลองปรับตัวเลือกที่เหมาะกับโครงการของคุณ แล้วคุณจะสามารถทำการแปลง HTML‑to‑PDF อัตโนมัติได้อย่างเชื่อถือได้ในทุกสภาพแวดล้อม Python + +--- + + +## คุณควรเรียนรู้อะไรต่อไป? + +บทแนะนำต่อไปนี้ครอบคลุมหัวข้อที่เกี่ยวข้องอย่างใกล้ชิดและต่อยอดเทคนิคที่แสดงในคู่มือนี้ แต่ละแหล่งรวมโค้ดทำงานเต็มรูปแบบพร้อมคำอธิบายทีละขั้นตอน เพื่อช่วยให้คุณเชี่ยวชาญฟีเจอร์ API เพิ่มเติมและสำรวจวิธีการทำงานทางเลือกในโครงการของคุณ + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [Convert HTML to PDF in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/thai/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/thai/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..b70bcb8c63 --- /dev/null +++ b/html/thai/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,217 @@ +--- +category: general +date: 2026-09-19 +description: เรียนรู้การแปลง HTML เป็น Markdown ด้วย Python บทเรียนนี้แสดงวิธีบันทึก + HTML เป็น Markdown และสร้าง Markdown จาก HTML อย่างรวดเร็ว. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: th +lastmod: 2026-09-19 +og_description: แปลง HTML เป็น Markdown ด้วย Python. ทำตามคู่มือนี้เพื่อบันทึก HTML + เป็น Markdown, สร้าง Markdown จาก HTML, และสร้างไฟล์ HTML เป็น Markdown. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: แปลง HTML เป็น Markdown ใน Python – คู่มือการเขียนโปรแกรมแบบครบถ้วน +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: วิธีแปลง HTML เป็น Markdown ด้วย Python – คู่มือแบบขั้นตอนต่อขั้นตอน +url: /th/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# วิธีแปลง HTML เป็น Markdown ด้วย Python – คู่มือทีละขั้นตอน + +หากคุณต้องการ **convert HTML to Markdown** คู่มือนี้จะพาคุณผ่านกระบวนการทั้งหมด คุณจะได้เห็นวิธี **save HTML as Markdown**, สร้าง Markdown จาก HTML, และสร้าง *html to markdown file* ที่สามารถใช้ใน static‑site generators, pipelines ของเอกสาร, หรือเวิร์กโฟลว์ใด ๆ ที่ต้องการ markup แบบ plain‑text + +บทแนะนำนี้ครอบคลุมทุกอย่างตั้งแต่การติดตั้งไลบรารีที่จำเป็นจนถึงการจัดการกรณีขอบเช่นรูปภาพฝังและการจัดรูปแบบแบบกำหนดเอง เมื่อเสร็จสิ้นคุณจะมีสคริปต์พร้อมรันและเข้าใจอย่างชัดเจนว่าทำไมแต่ละขั้นตอนถึงสำคัญ + +## ข้อกำหนดเบื้องต้น + +- Python 3.8 หรือใหม่กว่า ติดตั้งบนเครื่องของคุณ +- ความคุ้นเคยพื้นฐานกับการเขียนสคริปต์ Python +- สามารถเข้าถึงเทอร์มินัลหรือ command prompt +- ไลบรารี `aspose.html` (หรือแพ็กเกจ HTML‑to‑Markdown ที่เข้ากันได้) บทแนะนำนี้ใช้ **Aspose.HTML for Python via .NET** ซึ่งให้คลาส `HTMLDocument`, `MarkdownSaveOptions`, และ `Converter` ตามที่แสดงในตัวอย่างโค้ด + +> **เคล็ดลับพิเศษ:** หากคุณต้องการโซลูชัน pure‑Python คุณสามารถแทนที่ `aspose.html` ด้วยแพ็กเกจ `html2text` ได้ กระบวนการโดยรวมจะยังคงเหมือนเดิม. + +## ขั้นตอนที่ 1: ติดตั้งไลบรารีการแปลง + +ขั้นแรก ให้ติดตั้งไลบรารีที่ให้ `HTMLDocument`, `MarkdownSaveOptions`, และ `Converter` รันคำสั่งต่อไปนี้: + +```bash +pip install aspose-html +``` + +แพ็กเกจนี้รวมเอาเอนจินเนทีฟที่จำเป็นสำหรับ **generate markdown from html** อย่างรวดเร็วและมีความแม่นยำสูง การติดตั้งมักเสร็จภายในน้อยกว่าสักนาทีบนการเชื่อมต่อบรอดแบนด์มาตรฐาน. + +## ขั้นตอนที่ 2: โหลดเอกสาร HTML ต้นฉบับ + +การโหลดไฟล์ HTML เป็นการกระทำที่เป็นรูปธรรมแรกใน pipeline การแปลง คลาส `HTMLDocument` จะทำการพาร์สไฟล์และสร้าง DOM ในหน่วยความจำ ซึ่งคอนเวอร์เตอร์จะเดินผ่านต่อไปเพื่อสร้าง Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **ทำไมจึงสำคัญ:** การสร้างอ็อบเจ็กต์ `HTMLDocument` จะทำให้คุณมั่นใจว่าโครงสร้างที่ซับซ้อน—เช่น ตาราง, รายการ, และสไตล์อินไลน์—จะถูกตีความอย่างถูกต้องก่อนการแปลง หากข้ามขั้นตอนนี้ คอนเวอร์เตอร์จะต้องอ่านข้อความดิบ ทำให้รูปแบบหายไป. + +## ขั้นตอนที่ 3: กำหนดค่า Markdown save options + +อ็อบเจ็กต์ `MarkdownSaveOptions` ให้คุณปรับแต่งรูปแบบผลลัพธ์อย่างละเอียด เพื่อสร้าง **Git‑flavored Markdown** ให้ตั้งค่า property `formatter` เป็น `"GIT"` ซึ่งสอดคล้องกับไวยากรณ์ที่ใช้ในแพลตฟอร์มเช่น GitHub, GitLab, และ Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +คุณยังสามารถปรับตั้งค่าอื่น ๆ เช่น `preserve_links` หรือ `code_block_style` ตามที่คุณวางแผนจะ **save html as markdown** ในเครื่องมือ downstream + +## ขั้นตอนที่ 4: แปลง HTML เป็น Markdown และบันทึกผลลัพธ์ + +เมื่อเอกสารถูกโหลดและตั้งค่าตัวเลือกแล้ว ให้เรียกเมธอดสแตติก `convert_html` เมธอดนี้จะอ่าน DOM, ใช้ formatter ที่เลือก, และเขียนไฟล์ผลลัพธ์. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +หลังจากรันสคริปต์ คุณจะพบไฟล์ใหม่ชื่อ `output.md` ในไดเรกทอรีที่ระบุ การเปิดไฟล์จะแสดง Markdown ที่สะอาดและเข้ากันได้กับ Git พร้อมสำหรับการควบคุมเวอร์ชันหรือการเผยแพร่. + +## ขั้นตอนที่ 5: ตรวจสอบไฟล์ markdown ที่สร้าง + +การตรวจสอบอย่างเร็วช่วยให้คุณยืนยันว่าการแปลงสำเร็จและว่า **html to markdown file** มีเนื้อหาตามที่คาดหวัง. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +ผลลัพธ์ทั่วไปสำหรับหน้า HTML ง่าย ๆ จะมีลักษณะดังนี้: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +หากคุณพบว่าหัวข้อหายหรือรายการผิดรูปแบบ ให้กลับไปที่ **Step 3** และทดลองค่าต่าง ๆ ของ `formatter` (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## ขั้นสูง: จัดการรูปภาพและเส้นทางสัมพันธ์ + +เมื่อ HTML ต้นฉบับมีรูปภาพ คอนเวอร์เตอร์สามารถฝังเป็น data URI หรือคงไว้ attribute `src` ดั้งเดิม เพื่อให้กระบวนการ **generate markdown from html** มีน้ำหนักเบา คุณอาจต้องคัดลอกไฟล์รูปภาพไปยังโฟลเดอร์ขนานและปรับเส้นทาง. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +หลังการแปลง Markdown จะอ้างอิงรูปภาพเช่น `![Alt text](images/picture.png)` วิธีนี้ทำงานได้ดีเมื่อคุณต่อมาจะ **save html as markdown** ใน static‑site generator ที่คาดหวัง assets อยู่ในโฟลเดอร์เฉพาะ. + +## สคริปต์เต็มที่คุณสามารถคัดลอก‑วาง + +ด้านล่างเป็นสคริปต์ที่สมบูรณ์และสามารถรันได้ ซึ่งรวมทุกขั้นตอนที่อธิบายไว้ บันทึกเป็น `convert_html_to_md.py` และเรียกใช้ด้วย `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### ผลลัพธ์ที่คาดหวัง + +การรันสคริปต์จะแสดงข้อความยืนยันตามด้วยบรรทัดแรกสิบบรรทัดของไฟล์ Markdown ตามที่แสดงก่อนหน้า `output.md` ที่สร้างขึ้นสามารถเปิดด้วยโปรแกรมแก้ไขข้อความใดก็ได้, ดูตัวอย่างใน VS Code, หรือคอมมิตไปยังรีโพซิทอรี Git. + +## คำถามทั่วไปและการจัดการกรณีขอบ + +| Question | Answer | +|----------|--------| +| **ถ้าไฟล์ HTML มีขนาดใหญ่ (> 10 MB) จะทำอย่างไร?** | `HTMLDocument` class จะสตรีมอินพุต ทำให้การใช้หน่วยความจำอยู่ในระดับปานกลาง อย่างไรก็ตาม ให้พิจารณาเพิ่มขีดจำกัดหน่วยความจำของกระบวนการ Python หากพบ `MemoryError`. | +| **ฉันสามารถแปลงสตริง HTML แทนไฟล์ได้หรือไม่?** | ได้ ใช้ `HTMLDocument.from_string(html_string)` (หรือคอนสตรัคเตอร์ที่เทียบเท่า) ก่อนเรียก `Converter.convert_html`. | +| **ฉันจะเก็บคอมเมนต์ HTML ดั้งเดิมได้อย่างไร?** | ตั้งค่า `md_options.preserve_comments = True` คอมเมนต์จะปรากฏเป็นคอมเมนต์ HTML (`<!-- … -->`) ภายในไฟล์ Markdown. | +| **สามารถกำหนดเป้าหมายเป็น dialect ของ Markdown อื่นได้หรือไม่?** | เปลี่ยน `md_options.formatter` เป็น `"COMMONMARK"` หรือ `"MARKDOWN_EXTRA"` ตามแพลตฟอร์มเป้าหมาย. | +| **ต้องติดตั้ง .NET runtime แยกต่างหากหรือไม่?** | `aspose-html` package จะบรรจุ runtime ที่จำเป็นสำหรับแพลตฟอร์มส่วนใหญ่ บน Linux ให้ตรวจสอบว่าได้ติดตั้ง `libgdiplus` (`sudo apt-get install libgdiplus`). | + +## สรุป + +ตอนนี้คุณรู้วิธี **convert HTML to Markdown** ด้วย Python, วิธี **save html as markdown**, และวิธี **generate markdown from html** พร้อมการควบคุมละเอียดของการจัดรูปแบบและ assets สคริปต์แสดง workflow ทั้งหมด—from การโหลดไฟล์ต้นฉบับจนถึงการสร้าง *html to markdown file* ที่สะอาดพร้อมสำหรับการควบคุมเวอร์ชันหรือการเผยแพร่. + +ต่อไป ให้สำรวจหัวข้อที่เกี่ยวข้องเช่น **batch converting multiple HTML files**, การรวมขั้นตอนการแปลงเข้าไปใน pipeline CI/CD, หรือการปรับแต่งผลลัพธ์ Markdown สำหรับ static‑site generator เฉพาะเช่น Hugo หรือ Jekyll ทดลองกับการตั้งค่า `MarkdownSaveOptions` ต่าง ๆ เพื่อให้ผลลัพธ์สอดคล้องกับ style guide ของโครงการของคุณ. + +ขอให้แปลงสำเร็จ! + +## สิ่งที่คุณควรเรียนต่อไป? + +บทแนะนำต่อไปนี้ครอบคลุมหัวข้อที่เกี่ยวข้องอย่างใกล้ชิดซึ่งต่อยอดจากเทคนิคที่แสดงในคู่มือนี้ แต่ละแหล่งรวมตัวอย่างโค้ดทำงานเต็มรูปแบบพร้อมคำอธิบายทีละขั้นตอนเพื่อช่วยให้คุณเชี่ยวชาญฟีเจอร์ API เพิ่มเติมและสำรวจแนวทางการทำงานแบบอื่นในโครงการของคุณ. + +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/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/thai/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/thai/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..8788d765a5 --- /dev/null +++ b/html/thai/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,218 @@ +--- +category: general +date: 2026-09-19 +description: วิธีเปิดใช้งานฟีเจอร์ขณะแปลง HTML เป็น Markdown ด้วย Python. เรียนรู้การแปลงเอกสาร + HTML และบันทึก HTML เป็น Markdown ด้วยการควบคุมฟีเจอร์อย่างแม่นยำ. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: th +lastmod: 2026-09-19 +og_description: วิธีเปิดใช้งานฟีเจอร์ต่าง ๆ ขณะแปลง HTML เป็น Markdown คู่มือนี้จะแสดงขั้นตอนอย่างละเอียดว่าจะแปลงเอกสาร + HTML และบันทึก HTML เป็น Markdown ด้วยการควบคุมที่ละเอียดอ่อนอย่างไร +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: วิธีเปิดใช้งานฟีเจอร์ขณะแปลง HTML เป็น Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: วิธีเปิดใช้งานฟีเจอร์ขณะแปลง HTML เป็น Markdown +url: /th/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# วิธีเปิดใช้งานฟีเจอร์ขณะแปลง HTML เป็น Markdown + +หากคุณต้องการ **how to enable features** ระหว่างการแปลง คู่มือนี้จะให้วิธีแก้ไขที่สมบูรณ์และสามารถรันได้ คุณจะได้เห็นวิธีแปลง HTML เป็น Markdown อย่างแม่นยำ การควบคุมว่าฟีเจอร์ของ Markdown ใดบ้างที่ถูกสร้างออกมา และการบันทึก HTML เป็น Markdown ในหนึ่งขั้นตอน + +ตัวอย่างนี้ใช้ **GroupDocs.Conversion** Python SDK ที่เป็นที่นิยม แต่แนวคิดสามารถใช้กับไลบรารีใดก็ได้ที่ให้คุณกำหนดชุดฟีเจอร์ได้ เมื่อจบบทเรียนนี้คุณจะสามารถแปลงเอกสาร HTML, เก็บเฉพาะลิงก์และย่อหน้า, และหลีกเลี่ยงตาราง, รูปภาพ หรือบล็อกโค้ดที่ไม่ต้องการ + +## สิ่งที่คุณจะได้ทำ + +* **how to enable features** ในตัวเลือกการบันทึก Markdown +* กระบวนการทำงาน **convert html to markdown** ที่ชัดเจน +* ความสามารถในการ **how to convert html** พร้อมผลลัพธ์ที่เลือกได้ +* สคริปต์พร้อมรันที่ **convert html document** และ **save html as markdown** + +### ข้อกำหนดเบื้องต้น + +* ติดตั้ง Python 3.8+ +* แพ็กเกจ `groupdocs-conversion` (ติดตั้งด้วย `pip install groupdocs-conversion`) +* ไฟล์ HTML ตัวอย่าง (`sample.html`) ในไดเรกทอรีที่ทราบ + +--- + +## วิธีเปิดใช้งานฟีเจอร์ในการแปลงเป็น Markdown + +ขั้นตอนแรกคือการสร้างอ็อบเจ็กต์ `MarkdownSaveOptions` และบอกตัวแปลงว่าต้องการเก็บองค์ประกอบใด ในบทเรียนนี้เราจะเปิดใช้งานเฉพาะ **links** และ **paragraphs** เท่านั้น + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**ทำไมวิธีนี้ถึงได้ผล:** +* `HTMLDocument` ห่อไฟล์ต้นฉบับเพื่อให้ตัวแปลงสามารถอ่านได้. +* `MarkdownSaveOptions` เก็บการตั้งค่าการแปลงทั้งหมด; รายการ `features` เป็นคุณสมบัติหลักที่ **how to enable features**. +* การกำหนดค่า `["Link", "Paragraph"]` จะบอกเอนจินให้สร้างเฉพาะลิงก์ Markdown (`[text](url)`) และย่อหน้าแบบธรรมดา, ลบรูปภาพ, ตาราง, และ markup อื่นออก +* `Converter.convert_html` ทำการแปลง **convert html to markdown** จริงและเขียนผลลัพธ์ไปยัง `sample.md`. + +--- + +## วิธีแปลงเอกสาร HTML ด้วยตัวเลือกที่กำหนดเอง + +หากในภายหลังคุณต้องการเพิ่มฟีเจอร์เพิ่มเติม—เช่น `"Header"` หรือ `"Bold"`—เพียงขยายรายการต่อไปนี้: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +การเรียก `Converter.convert_html` เดียวกันนี้จะรวมเอาองค์ประกอบเพิ่มเติมเหล่านั้นเข้าไป รูปแบบนี้ทำให้คุณ **how to convert html** อย่างยืดหยุ่นโดยไม่ต้องเขียนพาร์เซอร์เอง. + +--- + +## วิธีบันทึก HTML เป็น Markdown ในโฟลเดอร์ที่ระบุ + +เมธอด `convert_html` รับพาธเอาต์พุตแบบ absolute หรือ relative เพื่อ **save html as markdown** ในโฟลเดอร์ย่อยชื่อ `output` ให้ปรับอาร์กิวเมนต์ที่สามดังนี้: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +การรันสคริปต์จะสร้างไดเรกทอรี `output` (หากยังไม่มี) และเขียนไฟล์ Markdown ลงไป วิธีนี้ทำให้ไฟล์ HTML ต้นฉบับและ Markdown ที่สร้างขึ้นจัดระเบียบอย่างเป็นระบบ. + +--- + +## สคริปต์เต็มที่คุณสามารถคัดลอก‑วางได้ + +ด้านล่างเป็นโปรแกรมทั้งหมดพร้อมรัน แทนที่ `YOUR_DIRECTORY` ด้วยพาธที่เก็บ `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**ผลลัพธ์ที่คาดหวัง** (พิมพ์บนคอนโซล): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +เปิด `sample.md` แล้วคุณจะเห็นเฉพาะลิงก์ Markdown และย่อหน้าแบบธรรมดา ตัวอย่างเช่น: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +องค์ประกอบ HTML อื่นทั้งหมดถูกละเว้นเนื่องจาก **how to enable features** จำกัดผลลัพธ์ให้เหลือเพียงสองประเภทที่เลือก + +--- + +## คำถามทั่วไปและกรณีขอบ + +| Question | Answer | +|----------|--------| +| *ถ้าไฟล์ HTML ไม่มีลิงก์เลยล่ะ?* | ตัวแปลงยังคงเขียนย่อหน้า; ผลลัพธ์จะเป็นข้อความธรรมดาโดยไม่มีไวยากรณ์ลิงก์. | +| *ฉันสามารถปิดฟีเจอร์ทั้งหมดได้หรือไม่?* | การตั้งค่า `markdown_options.features = []` จะทำให้ไฟล์ Markdown ว่างเปล่า ใช้เฉพาะเพื่อการทดสอบเท่านั้น. | +| *SDK จัดการกับ HTML ที่ไม่ถูกต้องอย่างไร?* | พาร์เซอร์พยายามทำความสะอาด markup ที่ผิดรูปก่อนนำฟีเจอร์มาจัดกรอง ข้อผิดพลาดจะถูกบันทึกแต่ไม่ทำให้การแปลงหยุด. | +| *สามารถเก็บรูปภาพไว้ได้ขณะละทิ้งตารางหรือไม่?* | ได้. ตั้งค่า `markdown_options.features = ["Link", "Paragraph", "Image"]`. รายการฟีเจอร์เป็นการเพิ่ม ไม่ใช่การแทนที่. | +| *ถ้าฉันต้องการแปลงหลายไฟล์ในโฟลเดอร์ล่ะ?* | ใส่ตรรกะการแปลงในลูปที่วนผ่าน `Path.glob("*.html")`. การกำหนดค่า **how to enable features** เดียวกันสามารถใช้ซ้ำได้สำหรับแต่ละไฟล์. | + +**เคล็ดลับ:** เมื่อประมวลผลชุดใหญ่ ให้สร้างอ็อบเจ็กต์ `MarkdownSaveOptions` ครั้งเดียวและใช้ซ้ำ วิธีนี้ลดภาระการสร้างอ็อบเจ็กต์และทำให้ขั้นตอน **convert html to markdown** ทำงานเร็วขึ้น. + +--- + +## สรุป + +ตอนนี้คุณรู้แล้วว่า **how to enable features** เมื่อคุณ **convert html to markdown**, วิธี **how to convert html** ด้วยผลลัพธ์ที่เลือกได้, และวิธี **convert html document** และ **save html as markdown** ด้วยสคริปต์ Python ที่กระชับ การกำหนดค่า `MarkdownSaveOptions.features` ทำให้คุณควบคุมองค์ประกอบ Markdown ที่ปรากฏในไฟล์สุดท้ายได้อย่างเต็มที่. + +### ขั้นตอนต่อไป + +* สำรวจฟีเจอร์เพิ่มเติมเช่น `"Header"`, `"Bold"` และ `"Italic"` เพื่อเพิ่มความสมบูรณ์ให้กับผลลัพธ์ Markdown ของคุณ. +* ผสานสคริปต์นี้กับตัวตรวจจับไฟล์ (เช่น `watchdog`) เพื่อแปลงไฟล์ HTML ใหม่โดยอัตโนมัติเมื่อมีการเพิ่มเข้ามา. +* ตรวจสอบ [GroupDocs.Conversion Python SDK documentation](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) สำหรับสถานการณ์ขั้นสูง เช่น การแปลง PDF‑to‑Markdown หรือ DOCX‑to‑HTML + +อย่าลังเลที่จะทดลองใช้ชุดฟีเจอร์ต่าง ๆ และแบ่งปันผลการทดลองของคุณกับชุมชน ขอให้แปลงสำเร็จ! + +## สิ่งที่คุณควรเรียนต่อไป? + +บทแนะนำต่อไปนี้ครอบคลุมหัวข้อที่เกี่ยวข้องอย่างใกล้ชิดและต่อยอดจากเทคนิคที่แสดงในคู่มือนี้ แต่ละแหล่งข้อมูลมีตัวอย่างโค้ดทำงานครบถ้วนพร้อมคำอธิบายทีละขั้นตอน เพื่อช่วยคุณเชี่ยวชาญฟีเจอร์ API เพิ่มเติมและสำรวจวิธีการทำงานทางเลือกในโครงการของคุณ. + +- [แปลง HTML เป็น Markdown ใน Aspose.HTML สำหรับ Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown เป็น HTML Java - แปลงด้วย Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [วิธีเปิดใช้งาน JavaScript ใน Aspose HTML – โหลด HTML & ดึงข้อความ](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/thai/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/thai/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..f06a9b179e --- /dev/null +++ b/html/thai/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,242 @@ +--- +category: general +date: 2026-09-19 +description: เรียนรู้วิธีจำกัดทรัพยากรซ้อนใน Aspose.HTML สำหรับ Python ด้วย ResourceHandlingOptions + ควบคุมความลึกสูงสุดของการจัดการและหลีกเลี่ยงลูปไม่สิ้นสุด +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: th +lastmod: 2026-09-19 +og_description: จำกัดทรัพยากรซ้อนใน Aspose.HTML สำหรับ Python ด้วย ResourceHandlingOptions + ตั้งค่าความลึกการจัดการสูงสุดเพื่อป้องกันการทำซ้ำเชิงลึกและปรับปรุงประสิทธิภาพ. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: วิธีจำกัดทรัพยากรซ้อนใน Aspose.HTML สำหรับ Python – คู่มือขั้นตอนโดยละเอียด +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: วิธีจำกัดทรัพยากรซ้อนเมื่อประมวลผล HTML ด้วย Aspose.HTML สำหรับ Python +url: /th/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# วิธีจำกัดทรัพยากรที่ซ้อนกันเมื่อประมวลผล HTML ด้วย Aspose.HTML สำหรับ Python + +หากคุณต้องการ **จำกัดทรัพยากรที่ซ้อนกัน** ระหว่างการเรนเดอร์หรือแปลง HTML คู่มือนี้จะแสดงขั้นตอนที่แน่นอนในการกำหนดค่า Aspose.HTML สำหรับ Python การควบคุมความลึกของการจัดการทรัพยากรช่วยป้องกันการทำซ้ำอย่างไม่สิ้นสุดเมื่อหน้าเว็บมีหลายชั้นของ CSS, JavaScript หรือการอ้างอิงรูปภาพ + +การจำกัดทรัพยากรที่ซ้อนกันเป็นสิ่งสำคัญโดยเฉพาะสำหรับตัวรวบรวมข้อมูลขนาดใหญ่, กระบวนการเรนเดอร์อีเมล, หรือเวิร์กโฟลว์อัตโนมัติใด ๆ ที่ต้องอยู่ภายในขอบเขตของหน่วยความจำและเวลา ในส่วนต่อไปนี้คุณจะได้เรียนรู้ว่าทำไมต้องตั้งค่าขีดจำกัดความลึก, วิธีใช้คลาส `ResourceHandlingOptions`, และวิธีตรวจสอบว่าขีดจำกัดทำงานตามที่คาดหวัง + +## ทำไมคุณควรจำกัดทรัพยากรที่ซ้อนกัน + +เอกสาร HTML มักอ้างอิงถึงทรัพยากรอื่น ๆ — เช่น สไตล์ชีต, สคริปต์, รูปภาพ, ฟอนต์ หรือแม้แต่ไฟล์ HTML อื่น ๆ แต่ละทรัพยากรเหล่านี้อาจอ้างอิงไฟล์เพิ่มเติมต่อไป ทำให้เกิดต้นไม้ของการพึ่งพา หากไม่มีการจำกัด ต้นไม้เหล่านี้อาจลึกโดยไม่มีขอบเขต: + +* หน้าเว็บโหลดไฟล์ CSS ที่นำเข้าไฟล์ CSS อื่น, ซึ่งนำเข้าไฟล์ต่อไปเรื่อย ๆ +* JavaScript อาจโหลดสคริปต์เพิ่มเติมแบบไดนามิก +* แม่แบบอีเมลอาจฝังรูปภาพที่อ้างอิง URL ภายนอกซึ่งเปลี่ยนเส้นทางไปยังทรัพยากรเพิ่มเติม + +เมื่อความลึกของการทำซ้ำเพิ่มขึ้นโดยไม่มีการตรวจสอบ คุณจะเสี่ยงต่อ: + +* **การใช้หน่วยความจำเกินความจำเป็น** – ทรัพยากรที่ดึงมาทุกรายการจะใช้บัฟเฟอร์ +* **เวลาประมวลผลที่ยาวนานขึ้น** – ความหน่วงของเครือข่ายจะคูณเพิ่มขึ้นในแต่ละระดับ +* **ความเป็นไปได้ของลูปไม่สิ้นสุด** – การอ้างอิงแบบวงกลมอาจทำให้เอนจินไม่คืนค่า + +การตั้งค่า **max handling depth** จะบอก Aspose.HTML ให้หยุดตามลิงก์ทรัพยากรหลังจากระดับที่กำหนดไว้ ทำให้ประสิทธิภาพคาดเดาได้ + +## วิธีจำกัดทรัพยากรที่ซ้อนกันใน Aspose.HTML สำหรับ Python + +Aspose.HTML มีคลาส `ResourceHandlingOptions` ซึ่งมีคุณสมบัติ `max_handling_depth` โดยการกำหนดค่าตัวเลข (เช่น `3`) คุณจะสั่งให้เอนจินหยุดหลังจากระดับที่ซ้อนกันสามระดับ + +ด้านล่างเป็นตัวอย่างที่สมบูรณ์และสามารถรันได้ซึ่งแสดงกระบวนการทั้งหมด: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### คำอธิบายของแต่ละขั้นตอน + +1. **ติดตั้งแพคเกจ** – จำเป็นต้องใช้ wheel `aspose-html` คำสั่ง `pip install` แสดงเป็นคอมเมนต์เพื่อความครบถ้วน +2. **นำเข้าคลาส** – `HtmlDocument` โหลดหน้า, `ResourceHandlingOptions` เก็บค่าขีดจำกัด, และ `HtmlLoadOptions` เชื่อมสองอย่างเข้าด้วยกัน +3. **สร้างอ็อบเจกต์ตัวเลือก** – การสร้างอินสแตนซ์ของ `ResourceHandlingOptions` ให้คอนเทนเนอร์ที่แก้ไขได้ +4. **ตั้งค่า `max_handling_depth`** – กำหนดค่า `3` (หรือจำนวนเต็มใดก็ได้) เพื่อจำกัดเอนจินให้ทำงานที่ระดับทรัพยากรซ้อนกันสามระดับ นี่คือหัวใจของ **limit nested resources** +5. **แนบตัวเลือกเข้ากับการตั้งค่าโหลด** – `HtmlLoadOptions` ให้คุณส่ง `resource_options` ไปยัง loader +6. **โหลด HTML** – ตัวสร้างของ `HtmlDocument` รับ URL หรือเส้นทางไฟล์พร้อมกับ `load_options` เอนจินจะเคารพขีดจำกัดความลึก +7. **ตรวจสอบ** – โดยการวนลูป `document.resources` คุณสามารถดูจำนวนทรัพยากรที่ดึงจริงและระดับที่ลึกที่สุด หากระดับที่ลึกที่สุดเป็น `3` หรือต่ำกว่า ขีดจำกัดสำเร็จ +8. **บันทึก** – บันทึกเอกสารที่ประมวลผล ไฟล์ที่บันทึกจะมีเฉพาะทรัพยากรที่อยู่ภายในความลึกที่อนุญาต + +#### ผลลัพธ์ที่คาดหวัง + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +ตัวเลขอาจแตกต่างกันตามหน้าแหล่งที่มา แต่ระดับที่ลึกที่สุดจะต้องไม่เกิน `3` เนื่องจากเราได้ตั้งค่า `max_handling_depth = 3` + +## การเปลี่ยนแปลงทั่วไปและกรณีขอบ + +### การเปลี่ยนขีดจำกัดความลึก + +คุณอาจต้องการขีดจำกัดที่ลึกหรือตื้นกว่าตามสภาพแวดล้อมของคุณ: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### การปิดการจำกัดอย่างสมบูรณ์ + +การตั้งค่าคุณสมบัติเป็น `0` จะบอก Aspose.HTML ให้ **ลบข้อจำกัดความลึกทั้งหมด**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +ทำเช่นนี้เฉพาะเมื่อคุณมั่นใจว่า HTML แหล่งที่มามีพฤติกรรมที่ดี + +### การจัดการการอ้างอิงแบบวงกลม + +แม้จะมีขีดจำกัดความลึก การอ้างอิงแบบวงกลมยังอาจปรากฏในระดับเดียวกัน Aspose.HTML ตรวจจับวงจรและหยุดโหลดทรัพยากรที่ได้ประมวลผลแล้ว ไม่ว่าจะตั้งค่าความลึกอย่างไร อย่างไรก็ตาม การตั้งค่า `max_handling_depth` ให้ต่ำลงจะลดโอกาสเจอวงจรตั้งแต่แรก + +### การใช้ขีดจำกัดกับไฟล์ในเครื่อง + +วิธีเดียวกันนี้ทำงานกับไฟล์ HTML ในเครื่องได้เช่นกัน: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +เอนจินจะจัดการแอตทริบิวต์ `href` หรือ `src` แบบ relative เช่นเดียวกับ URL ระยะไกล โดยใช้ขีดจำกัดความลึกกับทรัพยากรในระบบไฟล์ด้วย + +### การผสานรวมกับฟีเจอร์อื่นของ Aspose.HTML + +หากคุณต้องการควบคุม **เวลาในการดาวน์โหลดทรัพยากร** ด้วย คุณสามารถรวม `ResourceHandlingOptions` กับ `NetworkOptions` ได้: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +ตัวเลือกทั้งสองทำงานแยกกัน ดังนั้นคุณสามารถปรับจูนประสิทธิภาพและความปลอดภัยพร้อมกันได้ + +## เคล็ดลับระดับมืออาชีพสำหรับการใช้งานในโปรดักชัน + +* **บันทึกต้นไม้ของทรัพยากร** – เมื่อดีบัก ให้วนลูป `document.resources` และบันทึก URL และระดับของแต่ละทรัพยากร ซึ่งช่วยให้คุณเข้าใจว่าทำไมหน้าหนึ่งจึงเกินคาดหวังของคุณ +* **แคชทรัพยากรที่ดึงมา** – หากคุณประมวลผลทรัพยากรภายนอกเดียวกันหลายครั้ง ให้เปิดใช้งานการแคชเพื่อหลีกเลี่ยงการเรียกเครือข่ายซ้ำซ้อน +* **รวมกับรายการอนุญาต (whitelist)** – หากเชื่อถือเฉพาะโดเมนบางแห่ง ให้กรอง `document.resources` หลังการโหลดและละทิ้งรายการที่อยู่นอก whitelist +* **ทดสอบกับหน้าที่เป็นขอบกรณี** – สร้างไฟล์ HTML สังเคราะห์ที่นำเข้าโซ่ของไฟล์ CSS จำนวน 10 ไฟล์ ตรวจสอบว่าขีดจำกัดของคุณตัดโซ่นั้นตามที่ตั้งใจหรือไม่ + +## สรุป + +ตอนนี้คุณรู้วิธี **จำกัดทรัพยากรที่ซ้อนกัน** ใน Aspose.HTML สำหรับ Python โดยการกำหนดค่า `ResourceHandlingOptions.max_handling_depth` การตั้งค่าขีดจำกัดความลึกช่วยปกป้องแอปพลิเคชันของคุณจากการใช้หน่วยความจำเกิน, เวลาประมวลผลนาน, และความเป็นไปได้ของลูปไม่สิ้นสุดที่เกิดจากการอ้างอิงทรัพยากรที่ซ้อนลึกหรือเป็นวงกลม + +จากจุดนี้คุณสามารถ: + +* ปรับความลึกให้ตรงกับงบประมาณประสิทธิภาพของคุณ (`resource_handling_options.max_handling_depth`) +* ผสานขีดจำกัดกับเวลาเครือข่าย, การแคช, หรือ whitelist ของโดเมนเพื่อสร้าง pipeline ที่แข็งแรง +* สำรวจหัวข้อที่เกี่ยวข้องเช่น **resource handling options**, **max handling depth**, และ **nested resource handling** เพื่อควบคุมการประมวลผล HTML อย่างละเอียดยิ่งขึ้น + +ทดลองใช้ค่าความลึกต่าง ๆ และสังเกตว่าจำนวนทรัพยากรที่โหลดเปลี่ยนแปลงอย่างไร เมื่อพร้อมแล้ว ให้นำรูปแบบนี้ไปผสานกับบริการแปลงหรือเรนเดอร์ HTML ขนาดใหญ่ของคุณเพื่อให้การทำงานคาดเดาได้, ปลอดภัย, และมีประสิทธิภาพ + +## คุณควรเรียนรู้อะไรต่อไป? + +บทแนะนำต่อไปนี้ครอบคลุมหัวข้อที่เกี่ยวข้องอย่างใกล้ชิดและต่อยอดจากเทคนิคที่แสดงในคู่มือนี้ แต่ละแหล่งข้อมูลมีตัวอย่างโค้ดทำงานครบถ้วนพร้อมคำอธิบายขั้นตอนเพื่อช่วยให้คุณเชี่ยวชาญฟีเจอร์ API เพิ่มเติมและสำรวจวิธีการทำงานแบบอื่นในโครงการของคุณ + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/thai/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/thai/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..0510520772 --- /dev/null +++ b/html/thai/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,258 @@ +--- +category: general +date: 2026-09-19 +description: เรียนรู้บทแนะนำการแปลง HTML เป็น PDF ด้วย Python ที่สาธิตวิธีสร้าง PDF + จาก HTML อย่างรวดเร็วด้วย Aspose.HTML. ติดตามคู่มือขั้นตอนต่อขั้นตอนได้เลยตอนนี้. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: th +lastmod: 2026-09-19 +og_description: 'บทแนะนำการแปลง HTML เป็น PDF: แปลงหน้า HTML ใด ๆ เป็นไฟล์ PDF ด้วย + Python และ Aspose.HTML คู่มือนี้แสดงวิธีสร้าง PDF จาก HTML ภายในไม่กี่นาที' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: การสอนแปลง HTML เป็น PDF ด้วย Python – คู่มือขั้นตอนเต็มแบบละเอียด +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: วิธีทำบทแนะนำการแปลง HTML เป็น PDF ด้วย Python +url: /th/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# วิธีทำ tutorial html to pdf ด้วย Python + +หากคุณต้องการ **html to pdf tutorial** นี้ คู่มือนี้จะแสดงให้คุณเห็นอย่างชัดเจนว่าจะแปลง HTML เป็น PDF ด้วยเพียงไม่กี่บรรทัดของโค้ด Python อย่างไร ไม่ว่าคุณจะทำการสร้างรายงานอัตโนมัติหรือส่งออกเนื้อหาเว็บเพื่อการอ่านแบบออฟไลน์ ไลบรารี Aspose.HTML ทำให้การแปลงเป็นเรื่องง่ายดาย + +ใน tutorial นี้คุณจะได้เรียนรู้วิธีตั้งค่าสภาพแวดล้อม, เขียนสคริปต์การแปลง, และจัดการกับกรณีขอบที่พบบ่อย เช่น ไฟล์หายหรือการตั้งค่าหน้ากำหนดเอง เมื่อเสร็จสิ้นคุณจะสามารถ **how to generate pdf** ไฟล์จากแหล่ง HTML ใดก็ได้โดยไม่ต้องออกจากระบบนิเวศของ Python + +## สิ่งที่คุณต้องมี + +* ติดตั้ง Python 3.8 หรือใหม่กว่า +* มีใบอนุญาต Aspose.HTML for Python ที่ใช้งานได้ (ทดลองฟรีก็ใช้ได้สำหรับการประเมิน) +* สามารถใช้ `pip` เพื่อติดตั้งแพ็กเกจ `aspose-html` +* ไฟล์ HTML ง่าย ๆ ที่คุณต้องการแปลง (เช่น `input.html`) + +> **เคล็ดลับ:** เก็บไฟล์ HTML และทรัพยากร (รูปภาพ, CSS) ไว้ในไดเรกทอรีเดียวกันเพื่อหลีกเลี่ยงปัญหาการแก้ไขเส้นทางระหว่างการแปลง + +## ขั้นตอนที่ 1: ติดตั้งแพ็กเกจ Aspose.HTML + +เปิดเทอร์มินัลและรันคำสั่งต่อไปนี้: + +```bash +pip install aspose-html +``` + +`aspose-html` wheel จะบรรจุไลบรารีเนทีฟที่จำเป็นสำหรับการเรนเดอร์คุณภาพสูง ดังนั้นจึงไม่ต้องการการพึ่งพาระบบเพิ่มเติม + +## ขั้นตอนที่ 2: สร้างสคริปต์ Python ขั้นต่ำ + +สร้างไฟล์ใหม่ชื่อ `convert_html_to_pdf.py` แล้ววางโค้ดด้านล่าง สคริปต์นี้ทำตามรูปแบบ **html to pdf tutorial** ของกระบวนการสามขั้นตอน: การนำเข้า, การกำหนดเส้นทาง, และการเรียกใช้การแปลง + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### ทำไมวิธีนี้ถึงได้ผล + +* **การนำเข้า `Converter`** ให้คุณเข้าถึง API ระดับสูงที่ซ่อนการทำงานของเอนจินการเรนเดอร์ไว้ +* **การกำหนดเส้นทางแบบ absolute** ป้องกันข้อผิดพลาดของเส้นทาง relative เมื่อสคริปต์ทำงานจากไดเรกทอรีทำงานที่ต่างกัน +* **`Converter.convert_html`** ทำงานทั้งหมดของ pipeline การเรนเดอร์—การพาร์ส HTML, การจัดวาง CSS, และการแปลงเป็น PDF—in one call, ซึ่งเป็นวิธีที่แนะนำสำหรับ **how to generate pdf** อย่างรวดเร็ว + +## ขั้นตอนที่ 3: รันสคริปต์และตรวจสอบผลลัพธ์ + +เรียกใช้สคริปต์จากเทอร์มินัล: + +```bash +python convert_html_to_pdf.py +``` + +หากทุกอย่างตั้งค่าอย่างถูกต้อง คุณจะเห็น: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +เปิด `output.pdf` ด้วยโปรแกรมดู PDF ใดก็ได้ เอกสารควรมีลักษณะเหมือนกับหน้า HTML ดั้งเดิม รวมถึงฟอนต์, รูปภาพ, และสไตล์ CSS พื้นฐาน + +![Generated PDF preview](https://example.com/images/pdf-preview.png "ภาพหน้าต่าง PDF ที่สร้างจาก HTML ด้วย Python"){: .center-image alt="ภาพหน้าต่าง PDF ที่สร้างจากไฟล์ HTML ด้วย Python"} + +## ขั้นตอนที่ 4: ปรับแต่งการแปลง (ทางเลือก) + +**html to pdf tutorial** พื้นฐานครอบคลุมการแปลงแบบหนึ่งต่อหนึ่ง แต่สถานการณ์จริงมักต้องการการปรับแต่ง + +| ความต้องการ | วิธีทำด้วย Aspose.HTML | +|-------------|------------------------| +| กำหนดขนาดหน้า (A4, Letter) | ส่งอ็อบเจกต์ `PdfSaveOptions` ไปยัง `convert_html` | +| เพิ่มขอบหรือส่วนหัว/ส่วนท้าย | ใช้ `PdfPageSettings` ภายในตัวเลือก | +| ฝังฟอนต์กำหนดเอง | ตรวจสอบให้ไฟล์ฟอนต์เข้าถึงได้และตั้งค่า `FontSettings` | + +ด้านล่างเป็นตัวอย่างที่กำหนดขนาดหน้าเป็น A4 และเพิ่มขอบ 1‑inch: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **หมายเหตุ:** การใช้ตัวเลือกกำหนดเองเป็นเทคนิค **generate pdf from html** ที่แนะนำเมื่อคุณต้องการควบคุมเลย์เอาต์อย่างแม่นยำ + +## ขั้นตอนที่ 5: จัดการไฟล์ HTML หลายไฟล์ (การแปลงแบบแบตช์) + +หากคุณมีโฟลเดอร์ที่เต็มไปด้วยรายงาน HTML คุณสามารถวนลูปผ่านไฟล์เหล่านั้นได้: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +ส่วนนี้แสดงตัวอย่าง workflow **python convert html pdf** ที่สามารถขยายได้และเหมาะกับ CI pipelines หรือ งานที่กำหนดเวลา + +## ข้อผิดพลาดทั่วไปและวิธีหลีกเลี่ยง + +| ปัญหา | สาเหตุ | วิธีแก้ | +|-------|--------|----------| +| รูปภาพหายใน PDF | เส้นทางรูปภาพแบบ relative ที่เสียเมื่อสคริปต์ทำงานจากโฟลเดอร์อื่น | ใช้เส้นทาง absolute หรือกำหนด `base_uri` ในตัวเลือกของ `Converter` | +| CSS ไม่ถูกนำไปใช้ | สไตล์ชีตภายนอกที่อ้างอิงด้วย URL ที่ต้องการการเชื่อมต่ออินเทอร์เน็ต | ดาวน์โหลดสไตล์ชีตลงในเครื่องและอ้างอิงด้วยเส้นทาง relative | +| การแทนที่ฟอนต์ | ฟอนต์ไม่ได้ติดตั้งบนเครื่องโฮสต์ | ใส่ไฟล์ฟอนต์ในโปรเจกต์และตั้งค่า `FontSettings` | + +การจัดการกับกรณีขอบเหล่านี้ทำให้กระบวนการ **export html as pdf** ของคุณมีความเสถียรในทุกสภาพแวดล้อม + +## ตัวอย่างเต็มที่สามารถรันได้ + +ด้านล่างเป็นสคริปต์เต็มที่รวมการตั้งค่าทางเลือก, การจัดการข้อผิดพลาด, และตรรกะการประมวลผลแบบแบตช์ คัดลอกไปยัง `full_html_to_pdf.py` แล้วรันตามที่แสดงก่อนหน้า + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +การรันสคริปต์นี้จะสร้าง PDF สำหรับทุกไฟล์ HTML ในไดเรกทอรีเป้าหมาย โดยใช้การตั้งค่าหน้าแบบสม่ำเสมอ—เป็นโซลูชัน **python convert html pdf** ที่ครบถ้วนพร้อมใช้งานในขั้นตอนผลิต + +## สรุป + +ตอนนี้คุณมี **html to pdf tutorial** ที่เป็นประโยชน์ซึ่งแสดงวิธีสร้างไฟล์ PDF จาก HTML ด้วย Python และ Aspose.HTML คู่มือได้ครอบคลุมการตั้งค่าสภาพแวดล้อม, สคริปต์การแปลงขั้นต่ำ, การปรับแต่งทางเลือก, การประมวลผลแบบแบตช์, และเคล็ดลับการแก้ปัญหา + +จากนี้คุณสามารถสำรวจหัวข้อที่เกี่ยวข้อง เช่น **how to generate pdf** พร้อมลายน้ำ, การรวม PDF หลายไฟล์, หรือการแปลง HTML ไปเป็นรูปแบบอื่นเช่น DOCX ทดลองใช้ API `PdfSaveOptions` เพื่อปรับแต่งผลลัพธ์อย่างละเอียด และผสานสคริปต์เข้ากับเว็บเซอร์วิสหรือ pipeline การรายงานอัตโนมัติ + +ขอให้สนุกกับการเขียนโค้ดและเพลิดเพลินกับการแปลงเนื้อหา HTML ของคุณให้เป็น PDF ที่สวยงาม! + +## สิ่งที่คุณควรเรียนต่อไป? + +บทเรียนต่อไปนี้ครอบคลุมหัวข้อที่เกี่ยวข้องอย่างใกล้ชิดซึ่งต่อยอดจากเทคนิคที่แสดงในคู่มือนี้ แต่ละแหล่งข้อมูลมีตัวอย่างโค้ดทำงานครบถ้วนพร้อมคำอธิบายทีละขั้นตอน เพื่อช่วยให้คุณเชี่ยวชาญฟีเจอร์ API เพิ่มเติมและสำรวจวิธีการดำเนินการแบบอื่นในโปรเจกต์ของคุณ + +- [แปลง HTML เป็น PDF ด้วย Aspose.HTML – คู่มือเต็มขั้นตอน](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [แปลง HTML เป็น PDF ด้วย Aspose.HTML – คู่มือการจัดการเต็มรูปแบบ](/html/english/) +- [วิธีแปลง HTML เป็น PDF ด้วย Java – ใช้ Aspose.HTML สำหรับ Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/turkish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/turkish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..bd3ce70ff2 --- /dev/null +++ b/html/turkish/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-09-19 +description: Python ile bir HTML dosyasındaki başlığı nasıl değiştireceğinizi öğrenin. + Bu rehber, HTML okuma, title etiketini güncelleme ve değiştirilmiş HTML'yi kaydetme + konularını kapsar. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: tr +lastmod: 2026-09-19 +og_description: Python ile bir HTML dosyasındaki başlığı nasıl değiştirirsiniz. HTML'yi + okuyup, title etiketini güncelleyip, değiştirilen belgeyi kaydetmek için bu tam + örneği izleyin. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Python ile bir HTML dosyasındaki başlığı nasıl değiştirirsiniz – adım adım + rehber +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Python ile bir HTML dosyasındaki başlığı nasıl değiştiririz +url: /tr/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# HTML dosyasında başlığı Python ile nasıl değiştirirsiniz + +If you need to **how to change title** in an HTML document programmatically, Python makes the job straightforward. In this tutorial you’ll read an HTML file, update the `<title>` element, and save the modified HTML back to disk—all with clear, runnable code. + +Changing the page title is a common step when you generate static sites, customize scraped pages, or automate SEO updates. By the end of this guide you’ll know how to **update html title**, how to **read html with python**, and how to **save modified html** safely. + +## Önkoşullar + +- Python 3.8 veya daha yeni bir sürüm yüklü +- `beautifulsoup4` paketi (`pip install beautifulsoup4`) +- Düzenlemek istediğiniz bir HTML dosyası (örnek, seçtiğiniz bir klasördeki `index.html` dosyasını kullanır) + +Harici hizmetlere gerek yok; her şey yerel olarak çalışır. + +## Adım 1: HTML dosyasını Python ile yükleyin + +The first task is to **load html file python**‑style. Using `BeautifulSoup` gives you a forgiving parser that works with imperfect markup. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Bu adımın önemi:* +`BeautifulSoup` bir ağaç temsili oluşturur, böylece elemanları manuel dize işleme gerek kalmadan sorgulayabilir ve değiştirebilirsiniz. Yerleşik `html.parser` hızlıdır ve ek ikili dosyalar gerektirmez. + +## Adım 2: `<title>` öğesini bulun + +HTML documents usually contain a single `<title>` tag inside `<head>`. We retrieve the first occurrence, which satisfies the **update html title** requirement. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Neden `None` kontrolü yapıyoruz*: +Bazı HTML parçacıkları başlığı içermez. Otomatik olarak eklemek, sonraki hataları önler ve betiği sağlam tutar. + +## Adım 3: Başlık metnini değiştirin + +Now we **update html title** by assigning new text to the tag’s string. This is the core of the **how to change title** operation. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +The `string` attribute represents the text node inside `<title>`. Overwriting it updates the DOM in memory. + +## Adım 4: Değiştirilmiş HTML'yi kaydedin + +Finally, write the altered document to a new file. This fulfills the **save modified html** step and leaves the original untouched. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` formats the output with indentation, making the file easy to read after the change. + +### Beklenen çıktı + +Running the script on a sample `index.html` that originally contains: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +produces console output similar to: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +The saved `index_modified.html` will now start with: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Hızlı kopyala‑yapıştır için tam betik + +Below is the complete, ready‑to‑run program that combines all four steps. Save it as `change_title.py` and adjust `YOUR_DIRECTORY` as needed. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Run the script: + +```bash +python change_title.py +``` + +You’ll see the console messages and a new `index_modified.html` file with the updated title. + +## Ek ipuçları ve uç durumlar + +| Durum | Ne yapılmalı | +|-----------|------------| +| **Multiple `<title>` tags** | `soup.find_all("title")` bir liste döndürür; tümünü değiştirmek istiyorsanız ilk öğeyi güncelleyin veya döngüyle işleyin. | +| **Encoding problems** | BOM varsa `encoding="utf-8-sig"` ile dosyaları açın, ya da kodlamayı `chardet` ile tespit edin. | +| **Large HTML files** | Daha iyi performans için `lxml` ayrıştırıcısını kullanın (`BeautifulSoup(html_content, "lxml")`). | +| **Preserving original formatting** | Tam boşlukları korumanız gerekiyorsa `prettify()` yerine `str(soup)` yazın. | +| **Automating across many files** | Mantığı bir fonksiyona sarın ve `Path.rglob("*.html")` ile döngüleyin. | + +These variations keep the core **how to change title** logic intact while adapting to real‑world projects. + +## Sonuç + +You now know how to **how to change title** in any HTML document using Python. The tutorial covered reading HTML, locating the `<title>` tag, updating its text, and **saving modified html** safely. With the full script you can integrate this pattern into static‑site generators, SEO pipelines, or any automation that requires dynamic title changes. + +Next, explore related topics such as **read html with python** for extracting meta tags, or **load html file python** techniques for handling malformed markup. Experiment with batch processing to update titles across an entire website—your new skill is the foundation for many web‑automation tasks. Happy coding! + +## Sonra Ne Öğrenmelisiniz? + +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 Save HTML with Aspose.Html – Complete C# Guide](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [How to Save HTML in C# – Complete Guide Using a Custom Resource Handler](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [How to Render HTML to PNG – Complete Step‑by‑Step Guide](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/turkish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/turkish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..820ce37240 --- /dev/null +++ b/html/turkish/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,202 @@ +--- +category: general +date: 2026-09-19 +description: Python ve Aspose.HTML kullanarak yerel HTML dosyasını PDF'ye dönüştürün + – adım adım tam bir rehber ve ayrıca HTML'yi PDF'ye dönüştürme Python seçeneklerini + de kapsar. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: tr +lastmod: 2026-09-19 +og_description: Python kullanarak yerel HTML dosyasını PDF'ye dönüştürün. Aspose.HTML + ile Python'da HTML'yi PDF'ye dönüştürmenin en iyi yolunu öğrenin; font gömme ve + hata yönetimini de içeren. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Python ile yerel bir HTML dosyasını PDF'ye dönüştürme – tam rehber +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Python ile yerel bir HTML dosyasını PDF'ye nasıl dönüştürürsünüz +url: /tr/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Yerel bir HTML dosyasını Python ile PDF'ye dönüştürme + +Python projesinde **yerel HTML dosyasını PDF'ye dönüştürmeniz** gerekiyorsa, bu öğretici size hazır‑çalıştır çözümünü gösterir. Aspose.HTML kütüphanesini nasıl kuracağınızı, PDF seçeneklerini nasıl yapılandıracağınızı ve dönüşümü sadece birkaç kod satırıyla nasıl çalıştıracağınızı göreceksiniz. Kılavuz ayrıca **convert html to pdf python** en iyi uygulamalarını da açıklıyor, böylece kodu kendi iş akışlarınıza uyarlayabilirsiniz. + +Aşağıdaki adımlar bilmeniz gereken her şeyi kapsar: SDK'yı kurma, kaydetme seçeneklerini hazırlama, yaygın sorunları ele alma ve çıktıyı doğrulama. Makalenin sonunda, herhangi bir Python uygulamasına ekleyebileceğiniz yeniden kullanılabilir bir fonksiyona sahip olacaksınız. + +## Önkoşullar + +* Python 3.8 ve üzeri bir sürümünün makinenizde kurulu olması. +* Aktif bir Aspose.HTML for Python lisansı (ücretsiz deneme sürümü değerlendirme için çalışır). +* PDF'ye dönüştürmek istediğiniz yerel bir HTML dosyası (ör. `page.html`). + +Ek bir sistem‑seviyesi bağımlılığa ihtiyacınız yoktur; SDK PDF oluşturmak için gereken her şeyi içinde barındırır. + +## Aspose.HTML paketini kurma + +Aspose.HTML SDK'sı PyPI üzerinden dağıtılır. Sanal ortamınızda `pip` ile kurun: + +```bash +pip install aspose-html +``` + +Komutu çalıştırmak, kurulu sürümü yazdırır ve paketin içe aktarılabilir olduğunu doğrular. + +## Adım 1: Gerekli sınıfları içe aktarın + +Dönüştürme iş akışı iki ana sınıfa dayanır: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` gerçek dönüşümü gerçekleştiren statik `convert_html` metodunu sağlar. +* `PDFSaveOptions` PDF çıktısını, örneğin standart yazı tiplerini gömmek gibi, ince ayarlamanıza olanak tanır. + +## Adım 2: PDF kaydetme seçeneklerini oluşturun ve standart yazı tiplerini gömmeyi etkinleştirin + +Yazı tiplerini gömmek, oluşturulan PDF'nin her cihazda aynı görünmesini sağlar; hatta görüntüleyicide yerel olarak yazı tipleri yüklü olmasa bile. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +`embed_standard_fonts` değerini `True` olarak ayarlamak, çoğu üretim senaryosu için önerilir çünkü PDF okuyuculardaki yazı tipi değiştirme uyarılarını ortadan kaldırır. + +## Adım 3: Yapılandırılmış seçenekleri kullanarak HTML dosyasını PDF'ye dönüştürün + +Şimdi `Converter.convert_html` metodunu çağırın, kaynak HTML yolunu, hedef PDF yolunu ve hazırladığınız seçenek nesnesini ileterek: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Dönüştürme başarılı olursa, metod `None` döndürür ve PDF dosyası belirttiğiniz konumda ortaya çıkar. + +## Yeniden kullanılabilir bir fonksiyonda tam örnek + +Mantığı bir fonksiyon içinde paketlemek, birden fazla projede yeniden kullanmayı kolaylaştırır: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Fonksiyonun faydaları + +* **Girdi doğrulama** – `FileNotFoundError`, HTML yolunun yanlış olduğunda hata ayıklamayı kolaylaştırır. +* **Otomatik dizin oluşturma** – `os.makedirs(..., exist_ok=True)` “dizin mevcut değil” hatalarını önler. +* **Yapılandırılabilir yazı tipi gömme** – Hedef ortamın zaten gerekli yazı tiplerine sahip olduğunu biliyorsanız, daha küçük dosyalar için gömme özelliğini kapatabilirsiniz. + +## Yaygın kenar durumları ve nasıl ele alınır + +| Durum | Önerilen çözüm | +|-----------|----------------------| +| **HTML harici CSS veya resimler içeriyor** | Mutlak URL'ler kullanın veya kaynakları HTML dosyasının yanına kopyalayın; Aspose.HTML bir tarayıcı gibi aynı kuralları izler. | +| **Büyük HTML dosyaları (>10 MB)** | `pdf_options.memory_limit` ayarlayarak varsayılan bellek limitini artırın; `OutOfMemoryException` ile karşılaşırsanız bunu yapın. | +| **Şifre korumalı PDF'lere ihtiyacınız var** | `convert_html` çağırmadan önce `pdf_options.encryption_details` içine bir kullanıcı şifresi ayarlayın. | +| **Grafiksiz (headless) bir sunucuda çalıştırma** | Ek bir yapılandırma gerekmez; SDK bir GUI'ye bağımlı değildir. | + +Bu senaryoları önceden ele almak, beklenmeyen çalışma zamanı hatalarından sizi korur. + +## Dönüştürme sonucunu doğrulama + +Betik tamamlandıktan sonra, oluşturulan PDF'yi herhangi bir görüntüleyicide (Adobe Reader, Chrome vb.) açın. Görsel düzen orijinal HTML ile eşleşmeli ve tüm yazı tipleri doğru şekilde görünmelidir çünkü gömülmüşlerdir. + +Ayrıca programlı olarak dosyanın var olduğunu ve sıfırdan farklı bir boyuta sahip olduğunu doğrulayabilirsiniz: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Üretim kullanımı için profesyonel ipuçları + +* **Toplu işleme** – HTML dosyaları listesini döngüye alıp her biri için `html_to_pdf` metodunu çağırın; nesne oluşturma yükünü azaltmak için tek bir `PDFSaveOptions` örneğini yeniden kullanın. +* **Günlükleme** – Dönüştürme zaman damgalarını ve olası istisnaları yakalamak için Python'un `logging` modülünü entegre edin. +* **Performans** – Çok sayıda dosya dönüştürürken, `concurrent.futures.ThreadPoolExecutor` kullanarak dönüşümleri paralel çalıştırmayı düşünün, ancak SDK'nın yalnızca ayrı `Converter` çağrıları için iş parçacığı‑güvenli olduğunu unutmayın. + +## Sonuç + +Artık Python kullanarak **yerel HTML dosyasını PDF'ye dönüştürmek** için eksiksiz, üretim‑hazır bir yönteme sahipsiniz. Çözüm, temel adımları kapsar—Aspose.HTML kurulumunu, PDF seçeneklerini yapılandırmayı, yaygın kenar durumlarını ele almayı ve çıktıyı doğrulamayı—ve aynı zamanda daha geniş **convert html to pdf python** iş akışını gösterir. + +Buradan, PDF şifreleme, özel sayfa boyutları veya filigran ekleme gibi gelişmiş özellikleri keşfedebilirsiniz; hepsi aynı SDK tarafından desteklenir. Projenize en uygun seçeneklerle deneyler yapın ve herhangi bir Python ortamında HTML‑to‑PDF dönüşümünü güvenilir bir şekilde otomatikleştirebileceksiniz. + +--- + +## Sonra Ne Öğrenmelisiniz? + +Aşağıdaki öğreticiler, bu rehberde gösterilen tekniklere dayanan ve yakından ilgili konuları kapsar. Her kaynak, ek API özelliklerini öğrenmenize ve kendi projelerinizde alternatif uygulama yaklaşımlarını keşfetmenize yardımcı olacak adım adım açıklamalar içeren tam çalışan kod örnekleri sunar. + +- [Aspose.HTML ile HTML'yi PDF'ye Dönüştürme – Tam Adım‑Adım Kılavuz](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Aspose.HTML ile HTML'yi PDF'ye Dönüştürme – Tam Manipülasyon Kılavuzu](/html/english/) +- [.NET'te Aspose.HTML ile HTML'yi PDF'ye Dönüştürme](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/turkish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/turkish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..17dea2bd11 --- /dev/null +++ b/html/turkish/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Python’da HTML’yi Markdown’a dönüştürmeyi öğrenin. Bu öğreticide, HTML’yi + Markdown olarak kaydetme ve HTML’den hızlıca Markdown üretme yöntemleri gösterilmektedir. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: tr +lastmod: 2026-09-19 +og_description: HTML'yi Python ile Markdown'a dönüştürün. HTML'yi Markdown olarak + kaydetmek, HTML'den Markdown üretmek ve bir HTML'den Markdown dosyası oluşturmak + için bu kılavuzu izleyin. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Python'da HTML'yi Markdown'a Dönüştür – tam programlama rehberi +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Python ile HTML'yi Markdown'a Dönüştürme – Adım Adım Rehber +url: /tr/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python ile HTML'yi Markdown'a Dönüştürme – adım adım rehber + +HTML'yi **Markdown'a dönüştürmeniz** gerektiğinde, bu rehber size tüm süreci anlatıyor. **HTML'yi Markdown olarak kaydetmeyi**, HTML'den Markdown üretmeyi ve statik site jeneratörleri, dokümantasyon hatları veya düz metin işaretlemesini tercih eden herhangi bir iş akışı için kullanılabilecek bir *html to markdown dosyası* oluşturmayı öğreneceksiniz. + +Bu öğretici, gerekli kütüphanenin kurulmasından gömülü resimler ve özel biçimlendirme gibi kenar durumlarının ele alınmasına kadar her şeyi kapsar. Sonunda çalıştırmaya hazır bir betiğiniz ve her adımın neden önemli olduğuna dair net bir anlayışınız olacak. + +## Önkoşullar + +Başlamadan önce şunların kurulu olduğundan emin olun: + +- Makinenizde Python 3.8 veya daha yeni bir sürüm. +- Python betikleme konusunda temel bilgi. +- Bir terminal veya komut istemcisine erişim. +- `aspose.html` kütüphanesi (veya uyumlu herhangi bir HTML‑to‑Markdown paketi). Bu öğreticide **Aspose.HTML for Python via .NET** kullanılıyor; kod örneğinde gösterilen `HTMLDocument`, `MarkdownSaveOptions` ve `Converter` sınıflarını sağlıyor. + +> **Pro ipucu:** Saf Python çözümünü tercih ediyorsanız, `aspose.html` yerine `html2text` paketini kullanabilirsiniz. Genel akış aynı kalır. + +## Adım 1: Dönüştürme kütüphanesini kurun + +`HTMLDocument`, `MarkdownSaveOptions` ve `Converter` sınıflarını sağlayan kütüphaneyi önce kurun. Aşağıdaki komutu çalıştırın: + +```bash +pip install aspose-html +``` + +Paket, **html'den markdown üretmek** için gerekli yerel motoru hızlı ve yüksek doğrulukla içerir. Kurulum, standart bir geniş bant bağlantısında genellikle bir dakikadan kısa sürer. + +## Adım 2: Kaynak HTML belgesini yükleyin + +HTML dosyasını yüklemek, dönüşüm hattındaki ilk somut adımdır. `HTMLDocument` sınıfı dosyayı ayrıştırır ve bellekte bir DOM oluşturur; bu DOM daha sonra Markdown üretmek için dönüştürücü tarafından gezilir. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Neden önemli:** Bir `HTMLDocument` nesnesi oluşturduğunuzda, tablolar, listeler ve satır içi stiller gibi karmaşık yapılar dönüşümden önce doğru şekilde yorumlanır. Bu adımı atlamak, dönüştürücünün ham metni okumasına neden olur ve biçim kaybına yol açar. + +## Adım 3: Markdown kaydetme seçeneklerini yapılandırın + +`MarkdownSaveOptions` nesnesi, çıktı formatını ince ayar yapmanıza olanak tanır. **Git‑flavored Markdown** üretmek için `formatter` özelliğini `"GIT"` olarak ayarlayın. Bu, GitHub, GitLab ve Bitbucket gibi platformların kullandığı sözdizimiyle eşleşir. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Ayrıca, **html'i markdown olarak kaydetme** sürecinde nasıl kullanılacağınıza bağlı olarak `preserve_links` veya `code_block_style` gibi diğer ayarları da değiştirebilirsiniz. + +## Adım 4: HTML'yi Markdown'a dönüştürün ve sonucu kaydedin + +Belge yüklendi ve seçenekler ayarlandıktan sonra, statik `convert_html` metodunu çağırın. Bu metod DOM'u okur, seçilen biçimlendiriciyi uygular ve çıktı dosyasını yazar. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Betik çalıştırıldıktan sonra, belirtilen dizinde `output.md` adlı yeni bir dosya bulacaksınız. Açtığınızda, sürüm kontrolü veya yayınlama için hazır, temiz ve Git‑uyumlu bir Markdown göreceksiniz. + +## Adım 5: Oluşturulan markdown dosyasını doğrulayın + +Kısa bir tutarlılık kontrolü, dönüşümün başarılı olduğunu ve **html to markdown dosyasının** beklenen içeriği içerdiğini doğrulamanıza yardımcı olur. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Basit bir HTML sayfası için tipik çıktı şu şekildedir: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Başlıkların eksik veya listelerin bozuk olduğunu fark ederseniz, **Adım 3**'e geri dönün ve farklı `formatter` değerleri (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`) ile deney yapın. + +## İleri Seviye: Resimleri ve göreli yolları ele alma + +Kaynak HTML resimler içeriyorsa, dönüştürücü bunları veri URI'ları olarak gömebilir veya orijinal `src` özniteliklerini koruyabilir. **html'den markdown üretme** sürecini hafif tutmak için resim dosyalarını paralel bir klasöre kopyalayıp yolları ayarlamak isteyebilirsiniz. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Dönüştürme sonrası Markdown, `![Alt text](images/picture.png)` şeklinde resimlere referans verir. Bu yaklaşım, daha sonra **html'i markdown olarak kaydetme** işlemini yapan bir statik site jeneratörünün varlıkları ayrı bir klasörde beklediği durumlarda iyi çalışır. + +## Kopyalayıp‑yapıştırabileceğiniz tam betik + +Aşağıda, tartışılan tüm adımları içeren eksiksiz, çalıştırılabilir betik yer alıyor. `convert_html_to_md.py` olarak kaydedin ve `python convert_html_to_md.py` ile çalıştırın. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Beklenen çıktı + +Betik çalıştırıldığında, daha önce gösterildiği gibi Markdown dosyasının ilk on satırını ve bir onay mesajını yazdırır. Oluşturulan `output.md` herhangi bir metin düzenleyicide açılabilir, VS Code'da ön izlenebilir veya bir Git deposuna commit edilebilir. + +## Yaygın sorular ve kenar‑durum yönetimi + +| Soru | Cevap | +|----------|--------| +| **HTML dosyası büyükse (> 10 MB) ne olur?** | `HTMLDocument` sınıfı girişi akış olarak işler, bu yüzden bellek kullanımı makul seviyede kalır. Ancak `MemoryError` alırsanız Python sürecinin bellek limitini artırmayı düşünün. | +| **Bir dosya yerine HTML dizesi dönüştürebilir miyim?** | Evet. `HTMLDocument.from_string(html_string)` (veya eşdeğer yapıcı) kullanarak `Converter.convert_html`'i çağırmadan önce belgeyi oluşturabilirsiniz. | +| **Orijinal HTML yorumlarını korumak istiyorum, nasıl?** | `md_options.preserve_comments = True` ayarlayın. Yorumlar Markdown dosyası içinde HTML yorumları (`<!-- … -->`) olarak yer alır. | +| **Farklı bir Markdown lehçesine hedeflemek mümkün mü?** | `md_options.formatter` değerini `"COMMONMARK"` veya `"MARKDOWN_EXTRA"` olarak değiştirin; hedef platforma göre ayarlayın. | +| **.NET runtime'ını ayrı olarak kurmam gerekiyor mu?** | `aspose-html` paketi çoğu platform için gerekli runtime'ı içinde barındırır. Linux'ta `libgdiplus` kurulu olduğundan emin olun (`sudo apt-get install libgdiplus`). | + +## Sonuç + +Artık Python kullanarak **HTML'yi Markdown'a dönüştürmeyi**, **html'i markdown olarak kaydetmeyi** ve **html'den markdown üretmeyi** biçimlendirme ve varlıklar üzerinde ince ayarlarla nasıl yapacağınızı biliyorsunuz. Betik, kaynak dosyanın yüklenmesinden temiz bir *html to markdown dosyası* üretimine kadar tam iş akışını gösteriyor; bu dosya sürüm kontrolü veya yayınlama için hazır. + +Sonraki adımda, **birden fazla HTML dosyasını toplu olarak dönüştürme**, dönüşüm adımını CI/CD hattına entegre etme veya Hugo ya da Jekyll gibi belirli statik site jeneratörleri için Markdown çıktısını özelleştirme gibi konuları keşfedebilirsiniz. Projenizin stil kılavuzuna uygun sonuçlar elde etmek için çeşitli `MarkdownSaveOptions` ayarlarıyla deney yapın. + +İyi dönüşümler! + +## Sonraki Öğrenmeniz Gerekenler + +Aşağıdaki öğreticiler, bu rehberde gösterilen tekniklere dayanan ve yakından ilgili konuları kapsar. Her kaynak, ek API özelliklerini öğrenmenize ve projelerinizde alternatif uygulama yaklaşımlarını keşfetmenize yardımcı olacak tam çalışan kod örnekleri ve adım adım açıklamalar içerir. + +- [Convert HTML to Markdown in .NET with Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/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/turkish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/turkish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..8c61fa0ca7 --- /dev/null +++ b/html/turkish/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,221 @@ +--- +category: general +date: 2026-09-19 +description: Python kullanarak HTML'yi Markdown'a dönüştürürken özellikleri nasıl + etkinleştireceğinizi öğrenin. HTML belgesini dönüştürmeyi ve HTML'yi kesin özellik + kontrolüyle Markdown olarak kaydetmeyi keşfedin. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: tr +lastmod: 2026-09-19 +og_description: HTML'yi Markdown'a dönüştürürken özellikleri nasıl etkinleştirirsiniz. + Bu rehber, bir HTML belgesini adım adım nasıl dönüştüreceğinizi ve HTML'yi ince + ayarlı kontrolle Markdown olarak kaydedeceğinizi gösterir. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: HTML'yi Markdown'a dönüştürürken özellikleri nasıl etkinleştirirsiniz +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: HTML'yi Markdown'a dönüştürürken özellikleri nasıl etkinleştirirsiniz +url: /tr/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# HTML'yi Markdown'a Dönüştürürken Özellikleri Nasıl Etkinleştirirsiniz + +Eğer bir dönüşüm sırasında **özellikleri nasıl etkinleştirirsiniz** gerekiyorsa, bu kılavuz size eksiksiz, çalıştırılabilir bir çözüm sunar. HTML'yi Markdown'a nasıl dönüştüreceğinizi, hangi Markdown özelliklerinin üretileceğini nasıl kontrol edeceğinizi ve HTML'yi tek bir geçişte Markdown olarak nasıl kaydedeceğinizi tam olarak göreceksiniz. + +Örnek, popüler **GroupDocs.Conversion** Python SDK'sını kullanıyor, ancak kavramlar özellik setlerini yapılandırmanıza izin veren herhangi bir kütüphane için geçerlidir. Bu öğreticinin sonunda bir HTML belgesini dönüştürebilir, yalnızca bağlantıları ve paragrafları tutabilir ve istenmeyen tablolar, görseller veya kod bloklarından kaçınabilirsiniz. + +## Neyi Başaracaksınız + +* **özellikleri nasıl etkinleştirirsiniz** Markdown kaydetme seçeneklerinde +* net bir **html'yi markdown'a dönüştür** iş akışı +* **html'yi nasıl dönüştürürsünüz** seçmeli çıktı ile +* **html belgesini dönüştür** ve **html'yi markdown olarak kaydet** için hazır‑çalıştır script + +### Önkoşullar + +* Python 3.8+ yüklü +* `groupdocs-conversion` paketi ( `pip install groupdocs-conversion` ile kurun) +* Bilinen bir dizinde örnek bir HTML dosyası (`sample.html`) + +--- + +## Markdown Dönüşümünde Özellikleri Nasıl Etkinleştirirsiniz + +İlk adım bir `MarkdownSaveOptions` nesnesi oluşturmak ve dönüştürücüye hangi öğeleri tutmak istediğinizi söylemektir. Bu öğreticide yalnızca **Link** ve **Paragraph** öğelerini etkinleştiriyoruz. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Neden Bu Şekilde Çalışır:** +* `HTMLDocument` kaynak dosyayı sarar, böylece dönüştürücü onu okuyabilir. +* `MarkdownSaveOptions` tüm dönüşüm ayarlarını tutar; `features` listesi **özellikleri nasıl etkinleştirirsiniz** ana özelliktir. +* `["Link", "Paragraph"]` atayarak motorun yalnızca Markdown bağlantılarını (`[text](url)`) ve düz paragrafları üretmesini sağlarsınız, görseller, tablolar ve diğer işaretlemeler atılır. +* `Converter.convert_html` gerçek **html'yi markdown'a dönüştür** işlemini gerçekleştirir ve sonucu `sample.md` dosyasına yazar. + +--- + +## Özel Seçeneklerle HTML Belgesini Nasıl Dönüştürürsünüz + +Daha sonra `"Header"` veya `"Bold"` gibi ek özellik bayrakları eklemeniz gerekirse, sadece listeyi genişletin: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +Aynı `Converter.convert_html` çağrısı artık bu ek öğeleri de içerecektir. Bu desen, **html'yi nasıl dönüştürürsünüz** yüksek derecede yapılandırılabilir bir şekilde, özel ayrıştırıcılar yazmadan yapmanızı sağlar. + +--- + +## HTML'yi Belirli Bir Klasöre Markdown Olarak Nasıl Kaydedersiniz + +`convert_html` yöntemi mutlak ya da göreli bir çıktı yolu kabul eder. **html'yi markdown olarak kaydet** için `output` adlı bir alt‑klasöre kaydetmek istiyorsanız, üçüncü argümanı şu şekilde ayarlayın: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Script'i çalıştırdığınızda `output` klasörü (var değilse) oluşturulur ve Markdown dosyası oraya yazılır. Bu yaklaşım, kaynak HTML'nizi ve oluşturulan Markdown'ı düzenli bir şekilde tutar. + +--- + +## Kopyalayıp Yapıştırabileceğiniz Tam Script + +Aşağıda, çalıştırmaya hazır tüm program yer alıyor. `YOUR_DIRECTORY` kısmını `sample.html` dosyasının bulunduğu yol ile değiştirin. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Beklenen çıktı** (konsola basılan): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +`sample.md` dosyasını açtığınızda yalnızca Markdown bağlantılarını ve düz paragrafları göreceksiniz, örneğin: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Diğer tüm HTML öğeleri **özellikleri nasıl etkinleştirirsiniz** sayesinde iki seçili tipe sınırlı olduğu için dışarıda bırakıldı. + +--- + +## Yaygın Sorular ve Kenar Durumları + +| Soru | Cevap | +|----------|--------| +| *HTML dosyası hiç bağlantı içermiyorsa ne olur?* | Dönüştürücü yine paragrafları yazar; çıktı bağlantı sözdizimi olmadan düz metin içerir. | +| *Tüm özellikleri devre dışı bırakabilir miyim?* | `markdown_options.features = []` ayarı boş bir Markdown dosyası üretir. Bunu yalnızca test amaçlı kullanın. | +| *SDK geçersiz HTML ile nasıl başa çıkar?* | Ayrıştırıcı, özellik filtresini uygulamadan önce bozuk işaretlemeyi temizlemeye çalışır. Hatalar kaydedilir ancak dönüşüm durmaz. | +| *Görselleri tutup tabloları bırakmak mümkün mü?* | Evet. `markdown_options.features = ["Link", "Paragraph", "Image"]` şeklinde ayarlayın. Özellik listesi eklemedir, çıkarmaz. | +| *Bir klasördeki birçok dosyayı dönüştürmem gerekirse?* | Dönüştürme mantığını `Path.glob("*.html")` ile dönen bir döngüye sarın. Aynı **özellikleri nasıl etkinleştirirsiniz** yapılandırması her dosya için yeniden kullanılabilir. | + +**İpucu:** Büyük toplu işlemler yaparken `MarkdownSaveOptions` nesnesini bir kez oluşturup yeniden kullanın. Bu, nesne oluşturma maliyetini azaltır ve **html'yi markdown'a dönüştür** hattını hızlı tutar. + +--- + +## Sonuç + +Artık **özellikleri nasıl etkinleştirirsiniz** while **html'yi markdown'a dönüştürürken**, **html'yi nasıl dönüştürürsünüz** seçmeli çıktı ile ve **html belgesini dönüştür** ve **html'yi markdown olarak kaydet** konularında kısa bir Python script'i kullanarak bilgi sahibisiniz. `MarkdownSaveOptions.features`'ı yapılandırarak, nihai dosyada hangi Markdown öğelerinin görüneceği üzerinde tam kontrol elde edersiniz. + +### Sonraki adımlar + +* Markdown çıktınızı zenginleştirmek için `"Header"`, `"Bold"` ve `"Italic"` gibi ek özellik bayraklarını keşfedin. +* Bu script'i bir dosya‑izleyici (ör. `watchdog`) ile birleştirerek yeni HTML dosyaları geldikçe otomatik olarak dönüştürün. +* Gelişmiş senaryolar için [GroupDocs.Conversion Python SDK belgelerini](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) inceleyin; PDF‑to‑Markdown veya DOCX‑to‑HTML dönüşümleri gibi. + +Farklı özellik setleriyle denemeler yapmaktan ve bulgularınızı toplulukla paylaşmaktan çekinmeyin. İyi dönüşümler! + +## Sonra Ne Öğrenmelisiniz? + + +Aşağıdaki öğreticiler, bu kılavuzda gösterilen tekniklere dayanan ve yakından ilgili konuları kapsar. Her kaynak, ek API özelliklerini ustalaşmanız ve projelerinizde alternatif uygulama yaklaşımlarını keşfetmeniz için adım‑adım açıklamalarla tam çalışan kod örnekleri içerir. + +- [Convert HTML to Markdown in Aspose.HTML for Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown to HTML Java - Convert with Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [How to Enable JavaScript in Aspose HTML – Load HTML & Get Text](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/turkish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/turkish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..3ae597a171 --- /dev/null +++ b/html/turkish/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,246 @@ +--- +category: general +date: 2026-09-19 +description: Aspose.HTML for Python'da ResourceHandlingOptions kullanarak iç içe kaynakları + nasıl sınırlayacağınızı öğrenin. Maksimum işleme derinliğini kontrol edin ve sonsuz + döngülerden kaçının. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: tr +lastmod: 2026-09-19 +og_description: Aspose.HTML for Python'da ResourceHandlingOptions kullanarak iç içe + kaynakları sınırlayın. Derin özyinelemeyi önlemek ve performansı artırmak için maksimum + işleme derinliğini ayarlayın. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Aspose.HTML for Python'da iç içe kaynakları sınırlama – adım adım rehber +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Aspose.HTML for Python ile HTML işlenirken iç içe kaynakları nasıl sınırlarsınız +url: /tr/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Aspose.HTML for Python ile HTML işlenirken iç içe kaynakları nasıl sınırlarsınız + +HTML'yi **iç içe kaynakları sınırlayarak** render ederken veya dönüştürürken, bu kılavuz Aspose.HTML for Python'u yapılandırmak için gereken adımları gösterir. Kaynak işleme derinliğini kontrol etmek, bir sayfa birçok katman CSS, JavaScript veya resim referansı içerdiğinde kontrolsüz özyinelemeyi önler. + +İç içe kaynakları sınırlamak, büyük ölçekli tarayıcılar, e‑posta renderleme hatları veya bellek ve zaman bütçeleri içinde kalması gereken herhangi bir otomatik iş akışı için özellikle önemlidir. Aşağıdaki bölümlerde neden bir derinlik sınırı ayarlamanız gerektiğini, `ResourceHandlingOptions` sınıfını nasıl kullanacağınızı ve sınırın beklendiği gibi çalıştığını nasıl doğrulayacağınızı öğreneceksiniz. + +## Neden iç içe kaynakları sınırlamalısınız + +HTML belgeleri sık sık diğer kaynaklara referans verir—stil sayfaları, betikler, resimler, yazı tipleri veya hatta başka HTML dosyaları. Bu kaynakların her biri de ek dosyalara referans verebilir ve böylece bir bağımlılık ağacı oluşur. Bir koruma mekanizması olmadan, ağaç keyfi derecede derinleşebilir: + +* Bir sayfa, başka bir CSS dosyasını içe aktaran bir CSS dosyası yükler, bu da bir başkasını içe aktarır ve bu böyle devam eder. +* JavaScript, dinamik olarak ek betikler yükleyebilir. +* Bir e‑posta şablonu, dış URL'lere yönlendiren ve daha fazla varlığa işaret eden resimler içerebilir. + +Özyineleme derinliği kontrolsüz büyüdüğünde şu riskler ortaya çıkar: + +* **Aşırı bellek tüketimi** – her alınan kaynak tamponlar tutar. +* **Daha uzun işleme süreleri** – ağ gecikmesi her seviye ile katlanır. +* **Potansiyel sonsuz döngüler** – döngüsel referanslar motorun hiç dönmemesine neden olabilir. + +Bir **maksimum işleme derinliği** ayarlamak, Aspose.HTML'e belirli bir seviyeden sonra kaynak bağlantılarını takip etmeyi durdurmasını söyler ve öngörülebilir performans sağlar. + +## Aspose.HTML for Python'da iç içe kaynakları nasıl sınırlarsınız + +Aspose.HTML, `max_handling_depth` özelliğine sahip `ResourceHandlingOptions` sınıfını sunar. Sayısal bir değer (ör. `3`) atayarak motoru üç iç içe seviyeden sonra durdurursunuz. + +Aşağıda tüm iş akışını gösteren tam, çalıştırılabilir bir örnek bulunmaktadır: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Her adımın açıklaması + +1. **Paketi kurun** – `aspose-html` tekerleği gereklidir. `pip install` komutu bütünlük açısından yorum satırı olarak gösterilmiştir. +2. **Sınıfları içe aktarın** – `HtmlDocument` sayfayı yükler, `ResourceHandlingOptions` sınırı tutar ve `HtmlLoadOptions` ikisini birleştirir. +3. **Seçenek nesnesini oluşturun** – `ResourceHandlingOptions` örneği oluşturularak değiştirilebilir bir kapsayıcı elde edilir. +4. **`max_handling_depth` ayarlayın** – `3` (veya herhangi bir tam sayı) atayarak motoru üç seviyeye kadar sınırlarsınız. Bu, **iç içe kaynakları sınırlama**nın özüdür. +5. **Seçenekleri yükleme yapılandırmasına ekleyin** – `HtmlLoadOptions`, `resource_options`ı yükleyiciye iletmenizi sağlar. +6. **HTML'yi yükleyin** – `HtmlDocument` yapıcıları bir URL ya da dosya yolu ile `load_options` alır. Motor artık derinlik sınırını uygular. +7. **Doğrulayın** – `document.resources` üzerinde döngü kurarak kaç kaynağın alındığını ve karşılaşılan en derin seviyeyi görebilirsiniz. En derin seviye `3` veya daha düşükse sınır başarılıdır. +8. **Kaydedin** – İşlenmiş belgeyi kalıcı hale getirin. Kaydedilen dosya yalnızca izin verilen derinliğe kadar olan kaynakları içerir. + +#### Beklenen çıktı + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +Sayfanın kaynağına bağlı olarak sayılar değişecektir, ancak en derin seviye `max_handling_depth = 3` olduğundan `3`'ten büyük olmayacaktır. + +## Yaygın varyasyonlar ve kenar durumları + +### Derinlik sınırını değiştirme + +Ortamınıza göre daha derin ya da daha sığ bir sınır gerekebilir: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Sınırı tamamen devre dışı bırakma + +Özelliği `0` olarak ayarlamak, Aspose.HTML'in **herhangi bir derinlik kısıtlamasını kaldırmasını** sağlar: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Bunu yalnızca kaynak HTML'nin iyi davranış gösterdiğinden emin olduğunuzda yapın. + +### Döngüsel referansları ele alma + +Derinlik sınırı olsa bile, aynı seviyede döngüsel referanslar ortaya çıkabilir. Aspose.HTML döngüleri algılar ve derinlik ayarına bakılmaksızın daha önce işlenmiş bir kaynağı yüklemeyi durdurur. Ancak, daha düşük bir `max_handling_depth` ayarlamak, döngüyle karşılaşma ihtimalini baştan azaltır. + +### Yerel dosyalarla sınırı kullanma + +Aynı yaklaşım yerel HTML dosyaları için de çalışır: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +Motor, göreli `href` veya `src` özniteliklerini uzak URL'ler gibi ele alır ve dosya sistemi kaynaklarına da derinlik sınırını uygular. + +### Diğer Aspose.HTML özellikleriyle entegrasyon + +Ayrıca **kaynak indirme zaman aşımını** kontrol etmeniz gerekiyorsa, `ResourceHandlingOptions`ı `NetworkOptions` ile birleştirebilirsiniz: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Her iki seçenek de bağımsızdır; böylece performans ve güvenliği aynı anda ince ayar yapabilirsiniz. + +## Üretim kullanımı için profesyonel ipuçları + +* **Kaynak ağacını kaydedin** – Hata ayıklarken `document.resources` üzerinde döngü kurup her kaynağın URL ve derinliğini loglayın. Bu, bir sayfanın beklentilerinizi neden aştığını anlamanıza yardımcı olur. +* **Alınan kaynakları önbelleğe alın** – Aynı dış varlıkları tekrar tekrar işliyorsanız, gereksiz ağ çağrılarını önlemek için önbellekleme etkinleştirin. +* **Beyaz liste ile birleştirin** – Yalnızca belirli alan adları güvenilir ise, yüklemeden sonra `document.resources`ı filtreleyip beyaz liste dışındaki kaynakları atın. +* **Kenar‑durum sayfalarıyla test edin** – 10 CSS dosyasını zincirleme içe aktaran sentetik bir HTML dosyası oluşturun. Sınırınızın zinciri istediğiniz gibi kestiğini doğrulayın. + +## Sonuç + +`ResourceHandlingOptions.max_handling_depth` yapılandırmasıyla Aspose.HTML for Python'da **iç içe kaynakları sınırlamayı** nasıl yapacağınızı artık biliyorsunuz. Derinlik sınırı, uygulamanızı aşırı bellek kullanımı, uzun işleme süreleri ve derinlemesine ya da döngüsel kaynak referanslarından kaynaklanan potansiyel sonsuz döngülerden korur. + +Bu noktadan itibaren şunları yapabilirsiniz: + +* Performans bütçenize uygun olarak derinliği ayarlayın (`resource_handling_options.max_handling_depth`). +* Sınırı ağ zaman aşımı, önbellekleme veya alan adı beyaz listeleriyle birleştirerek sağlam hat hatları oluşturun. +* **resource handling options**, **max handling depth** ve **nested resource handling** gibi ilgili konuları keşfederek HTML işleme üzerindeki kontrolünüzü daha da sıkılaştırın. + +Farklı derinlik değerleriyle denemeler yapın ve yüklü kaynak sayısının nasıl değiştiğini gözlemleyin. Hazır olduğunuzda bu deseni daha büyük HTML dönüşüm veya render hizmetinize entegre ederek öngörülebilir, güvenli ve verimli bir yürütme sağlayın. + + +## Sonra Ne Öğrenmelisiniz? + + +Aşağıdaki öğreticiler, bu kılavuzda gösterilen tekniklere dayanarak yakından ilgili konuları kapsar. Her kaynak, ek API özelliklerini ustalaşmanız ve kendi projelerinizde alternatif uygulama yaklaşımlarını keşfetmeniz için adım adım açıklamalı tam çalışan kod örnekleri içerir. + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/turkish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/turkish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..e4a520a849 --- /dev/null +++ b/html/turkish/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-09-19 +description: Aspose.HTML ile HTML'den PDF'yi hızlı bir şekilde oluşturmayı gösteren + Python'da bir HTML'den PDF öğreticisini öğrenin. Şimdi adım adım rehberi takip edin. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: tr +lastmod: 2026-09-19 +og_description: 'html''den pdf''ye öğretici: Python ve Aspose.HTML kullanarak herhangi + bir HTML sayfasını PDF dosyasına dönüştürün. Bu kılavuz, HTML''den PDF''yi dakikalar + içinde nasıl oluşturacağınızı gösterir.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Python'da HTML'den PDF'ye öğretici – eksiksiz adım adım rehber +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Python kullanarak HTML'den PDF'ye dönüşüm öğreticisi nasıl yapılır +url: /tr/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Python ile html'den pdf oluşturma öğreticisi + +Eğer bir **html'den pdf öğreticisi** arıyorsanız, bu rehber size sadece birkaç satır Python kodu ile HTML'den PDF nasıl oluşturulacağını tam olarak gösterir. Rapor oluşturmayı otomatikleştiriyor ya da web içeriğini çevrimdışı okumak için dışa aktarıyor olun, Aspose.HTML kütüphanesi dönüşümü zahmetsiz hâle getirir. + +Bu öğreticide ortamı nasıl kuracağınızı, dönüşüm betiğini nasıl yazacağınızı ve eksik dosyalar ya da özel sayfa ayarları gibi yaygın kenar durumlarını nasıl yöneteceğinizi öğreneceksiniz. Sonunda Python ekosisteminden çıkmadan herhangi bir HTML kaynağından **pdf nasıl oluşturulur** dosyaları üretebileceksiniz. + +## Gereksinimler + +Başlamadan önce şunların yüklü olduğundan emin olun: + +* Python 3.8 veya daha yeni bir sürüm +* Aktif bir Aspose.HTML for Python lisansı (değerlendirme için ücretsiz deneme sürümü yeterli) +* `aspose-html` paketini kurmak için `pip` erişimi +* Dönüştürmek istediğiniz basit bir HTML dosyası (ör. `input.html`) + +> **İpucu:** HTML ve varlıklarınızı (görseller, CSS) aynı dizinde tutun; böylece dönüşüm sırasında yol‑çözümleme sorunlarından kaçınmış olursunuz. + +## Adım 1: Aspose.HTML paketini kurun + +Bir terminal açın ve aşağıdaki komutu çalıştırın: + +```bash +pip install aspose-html +``` + +`aspose-html` tekerleği, yüksek‑kaliteli render için gereken yerel kütüphaneleri içinde barındırır; ek sistem bağımlılıkları gerekmez. + +## Adım 2: Minimal bir Python betiği oluşturun + +`convert_html_to_pdf.py` adında yeni bir dosya oluşturun ve aşağıdaki kodu yapıştırın. Bu betik, **html'den pdf öğreticisi** modeline uygun üç‑adımlı bir süreci izler: içe aktarım, yol tanımlama ve dönüşüm çağrısı. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Neden bu şekilde çalışır + +* **`Converter`'ı içe aktarmak**, render motorunu soyutlayan yüksek‑seviyeli bir API'ye erişim sağlar. +* **Mutlak yolları tanımlamak**, betik farklı bir çalışma dizininden çalıştırıldığında ortaya çıkabilecek göreli‑yol hatalarını önler. +* **`Converter.convert_html`**, tüm render hattını—HTML ayrıştırma, CSS yerleşimi ve PDF serileştirmesini—tek bir çağrıda gerçekleştirir; bu da **pdf nasıl oluşturulur** sorusuna hızlı bir yanıt verir. + +## Adım 3: Betiği çalıştırın ve çıktıyı doğrulayın + +Betik çalıştırmak için terminalde şu komutu verin: + +```bash +python convert_html_to_pdf.py +``` + +Her şey doğru kurulduysa şu çıktıyı görmelisiniz: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +`output.pdf` dosyasını herhangi bir PDF görüntüleyici ile açın. Belge, orijinal HTML sayfasına, fontlara, görsellere ve temel CSS stiline bire bir benzemelidir. + +![Generated PDF preview](https://example.com/images/pdf-preview.png "Screenshot of generated PDF from HTML using Python"){: .center-image alt="Python kullanarak HTML'den oluşturulan PDF'in ekran görüntüsü"} + +## Adım 4: Dönüşümü özelleştirme (isteğe bağlı) + +Temel **html'den pdf öğreticisi** tek‑bir‑tek dönüşümü kapsar, ancak gerçek dünya senaryoları genellikle ince ayarlar gerektirir: + +| Gereksinim | Aspose.HTML ile nasıl sağlanır | +|-------------|------------------------------------| +| Sayfa boyutunu ayarla (A4, Letter) | `convert_html`'e bir `PdfSaveOptions` nesnesi geçir | +| Kenar boşlukları veya üst‑alt bilgi ekle | Seçenekler içinde `PdfPageSettings` kullan | +| Özel fontları göm | Font dosyalarının erişilebilir olduğundan emin ol ve `FontSettings` ayarla | + +Aşağıda sayfa boyutunu A4 olarak ayarlayan ve 1 inç kenar boşluğu ekleyen bir örnek yer alıyor: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Not:** Özel seçenekler kullanmak, düzen üzerinde kesin kontrol gerektiğinde tercih edilen **html'den pdf oluşturma** tekniğidir. + +## Adım 5: Birden fazla HTML dosyasını işleme (toplu dönüşüm) + +Eğer bir klasörde çok sayıda HTML raporu varsa, bunlar üzerinde döngü kurabilirsiniz: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Bu kod parçacığı, CI boru hatlarına ya da zamanlanmış görevlere uyum sağlayan ölçeklenebilir bir **python html pdf dönüştürme** iş akışını gösterir. + +## Yaygın tuzaklar ve nasıl önlenir + +| Sorun | Neden | Çözüm | +|-------|-------|-----| +| PDF'de eksik görseller | Betik farklı bir klasörden çalıştırıldığında kırılan göreli görsel yolları | Mutlak yollar kullan veya `Converter` seçeneklerinde `base_uri` ayarla | +| CSS uygulanmıyor | İnternet erişimi gerektiren harici stil sayfası referansı | Stil sayfasını yerel olarak indir ve göreli yol ile referans ver | +| Font ikamesi | Host makinede font yüklü değil | Font dosyasını projeye ekle ve `FontSettings` yapılandır | + +Bu kenar durumlarını ele almak, **html'yi pdf olarak dışa aktar** sürecinizin farklı ortamlar arasında sağlam olmasını sağlar. + +## Tam, çalıştırılabilir örnek + +Aşağıda isteğe bağlı ayarlar, hata yönetimi ve toplu işleme mantığını içeren tam betik yer alıyor. `full_html_to_pdf.py` dosyasına kopyalayıp daha önce gösterildiği gibi çalıştırın. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Bu betiği çalıştırdığınızda hedef dizindeki her HTML dosyası için tutarlı sayfa ayarlarıyla bir PDF üretilir—tam bir **python html pdf dönüştürme** çözümü, üretim ortamına hazır. + +## Sonuç + +Artık Python ve Aspose.HTML kullanarak HTML'den PDF dosyaları oluşturmayı gösteren pratik bir **html'den pdf öğreticisi**'ne sahipsiniz. Rehber, ortam kurulumunu, minimal dönüşüm betiğini, isteğe bağlı özelleştirmeyi, toplu işleme ve sorun giderme ipuçlarını kapsadı. + +Bundan sonra **pdf nasıl oluşturulur** konusunu su işaretleriyle, birden fazla PDF birleştirme ya da HTML'yi DOCX gibi diğer formatlara dönüştürme gibi ilgili konuları keşfedebilirsiniz. `PdfSaveOptions` API'siyle çıktıyı ince ayar yapın ve betiği web servislerine ya da otomatik raporlama boru hatlarına entegre edin. + +İyi kodlamalar ve HTML içeriğinizi şık PDF'lere dönüştürmenin tadını çıkarın! + + +## Sonraki Öğrenmeniz Gerekenler + + +Aşağıdaki öğreticiler, bu rehberde gösterilen tekniklere dayanarak yakından ilgili konuları kapsar. Her kaynak, ek API özelliklerini ustalaşmanız ve projelerinizde alternatif uygulama yaklaşımlarını keşfetmeniz için adım‑adım açıklamalı tam çalışan kod örnekleri içerir. + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [How to Convert HTML to PDF Java – Using Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/vietnamese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md b/html/vietnamese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md new file mode 100644 index 0000000000..f1910e185a --- /dev/null +++ b/html/vietnamese/python/general/how-to-change-title-in-an-html-file-using-python/_index.md @@ -0,0 +1,260 @@ +--- +category: general +date: 2026-09-19 +description: Học cách thay đổi tiêu đề trong tệp HTML bằng Python. Hướng dẫn này bao + gồm việc đọc HTML, cập nhật thẻ tiêu đề và lưu HTML đã chỉnh sửa. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to change title +- update html title +- read html with python +- load html file python +- save modified html +language: vi +lastmod: 2026-09-19 +og_description: Cách thay đổi tiêu đề trong tệp HTML bằng Python. Theo dõi ví dụ đầy + đủ này để đọc HTML, cập nhật thẻ tiêu đề và lưu tài liệu đã chỉnh sửa. +og_image_alt: Diagram showing how to change title in an HTML file using Python +og_title: Cách thay đổi tiêu đề trong tệp HTML bằng Python – hướng dẫn từng bước +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to change title in an HTML file with Python. This guide covers + reading HTML, updating the title tag, and saving the modified HTML. + headline: How to change title in an HTML file using Python + type: TechArticle +tags: +- Python +- HTML +- Web scraping +title: Cách thay đổi tiêu đề trong tệp HTML bằng Python +url: /vi/python/general/how-to-change-title-in-an-html-file-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cách thay đổi tiêu đề trong tệp HTML bằng Python + +Nếu bạn cần **cách thay đổi tiêu đề** trong một tài liệu HTML một cách lập trình, Python giúp công việc trở nên đơn giản. Trong hướng dẫn này, bạn sẽ đọc một tệp HTML, cập nhật phần tử `<title>`, và lưu HTML đã chỉnh sửa trở lại đĩa—tất cả với mã rõ ràng, có thể chạy được. + +Thay đổi tiêu đề trang là một bước phổ biến khi bạn tạo các trang tĩnh, tùy chỉnh các trang đã thu thập, hoặc tự động hoá các cập nhật SEO. Khi kết thúc hướng dẫn này, bạn sẽ biết cách **cập nhật tiêu đề html**, cách **đọc html bằng python**, và cách **lưu html đã chỉnh sửa** một cách an toàn. + +## Yêu cầu trước + +- Python 3.8 hoặc mới hơn đã được cài đặt +- Gói `beautifulsoup4` (`pip install beautifulsoup4`) +- Một tệp HTML bạn muốn chỉnh sửa (ví dụ sử dụng `index.html` trong thư mục bạn chọn) + +Không cần dịch vụ bên ngoài; mọi thứ chạy trên máy cục bộ. + +## Bước 1: Tải tệp HTML bằng Python + +Nhiệm vụ đầu tiên là **tải tệp html bằng python**‑style. Sử dụng `BeautifulSoup` cung cấp cho bạn một bộ phân tích linh hoạt, hoạt động tốt với markup không hoàn hảo. + +```python +from pathlib import Path +from bs4 import BeautifulSoup + +# Define the directory that holds the original HTML +html_dir = Path("YOUR_DIRECTORY") +original_path = html_dir / "index.html" + +# Read the file contents (this is how you **read html with python**) +with original_path.open(encoding="utf-8") as f: + html_content = f.read() + +# Parse the document +soup = BeautifulSoup(html_content, "html.parser") +``` + +*Tại sao bước này quan trọng:* +`BeautifulSoup` xây dựng một cấu trúc cây, cho phép bạn truy vấn và sửa đổi các phần tử mà không cần xử lý chuỗi thủ công. Bộ phân tích `html.parser` tích hợp nhanh và không yêu cầu các binary bổ sung. + +## Bước 2: Xác định phần tử `<title>` + +Các tài liệu HTML thường chứa một thẻ `<title>` duy nhất trong `<head>`. Chúng ta lấy lần xuất hiện đầu tiên, đáp ứng yêu cầu **cập nhật tiêu đề html**. + +```python +# Find the first <title> element; BeautifulSoup returns None if missing +title_tag = soup.find("title") + +if title_tag is None: + # If the document lacks a <title>, create one inside <head> + head_tag = soup.find("head") + if head_tag is None: + # As a safety net, add a <head> element at the top + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +# Show the current title (useful for debugging) +print("Current title:", title_tag.string) +``` + +*Tại sao chúng ta kiểm tra `None`*: +Một số đoạn HTML có thể thiếu thẻ title. Thêm nó tự động ngăn ngừa lỗi sau này và giữ cho script ổn định. + +## Bước 3: Thay đổi nội dung tiêu đề + +Bây giờ chúng ta **cập nhật tiêu đề html** bằng cách gán văn bản mới cho chuỗi của thẻ. Đây là phần cốt lõi của thao tác **cách thay đổi tiêu đề**. + +```python +new_title = "New Title" + +# Replace the existing title text +title_tag.string = new_title + +print("Updated title:", title_tag.string) +``` + +Thuộc tính `string` đại diện cho nút văn bản bên trong `<title>`. Ghi đè nó sẽ cập nhật DOM trong bộ nhớ. + +## Bước 4: Lưu HTML đã chỉnh sửa + +Cuối cùng, ghi tài liệu đã thay đổi vào một tệp mới. Điều này hoàn thành bước **lưu html đã chỉnh sửa** và giữ nguyên tệp gốc. + +```python +# Define the output path +modified_path = html_dir / "index_modified.html" + +# Write the prettified HTML back to disk +with modified_path.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_path}") +``` + +`prettify()` định dạng đầu ra với thụt lề, giúp tệp dễ đọc hơn sau khi thay đổi. + +### Kết quả mong đợi + +Chạy script trên một mẫu `index.html` ban đầu chứa: + +```html +<!DOCTYPE html> +<html> +<head> + <title>Old Title + + +

Welcome

+ + +``` + +sẽ tạo ra đầu ra console tương tự như: + +``` +Current title: Old Title +Updated title: New Title +Modified HTML saved to YOUR_DIRECTORY/index_modified.html +``` + +Tệp `index_modified.html` đã lưu sẽ bắt đầu như sau: + +```html + + + + + New Title + + + +

+ Welcome +

+ + +``` + +## Toàn bộ script để sao chép nhanh + +Dưới đây là chương trình hoàn chỉnh, sẵn sàng chạy, kết hợp cả bốn bước. Lưu lại với tên `change_title.py` và điều chỉnh `YOUR_DIRECTORY` theo nhu cầu. + +```python +# change_title.py +from pathlib import Path +from bs4 import BeautifulSoup + +# ---------------------------------------------------------------------- +# Configuration – change these values to match your environment +# ---------------------------------------------------------------------- +html_dir = Path("YOUR_DIRECTORY") # Folder containing index.html +original_file = html_dir / "index.html" +modified_file = html_dir / "index_modified.html" +new_title = "New Title" # Desired title text +# ---------------------------------------------------------------------- + +# 1️⃣ Load the HTML file (read html with python) +with original_file.open(encoding="utf-8") as f: + html_content = f.read() + +soup = BeautifulSoup(html_content, "html.parser") + +# 2️⃣ Locate or create the element +title_tag = soup.find("title") +if title_tag is None: + head_tag = soup.find("head") + if head_tag is None: + head_tag = soup.new_tag("head") + soup.insert(0, head_tag) + title_tag = soup.new_tag("title") + head_tag.append(title_tag) + +print("Current title:", title_tag.string) + +# 3️⃣ Update the title (how to change title) +title_tag.string = new_title +print("Updated title:", title_tag.string) + +# 4️⃣ Save the modified HTML (save modified html) +with modified_file.open("w", encoding="utf-8") as f: + f.write(soup.prettify()) + +print(f"Modified HTML saved to {modified_file}") +``` + +Chạy script: + +```bash +python change_title.py +``` + +Bạn sẽ thấy các thông báo trên console và một tệp `index_modified.html` mới với tiêu đề đã được cập nhật. + +## Mẹo bổ sung và các trường hợp đặc biệt + +| Tình huống | Cách thực hiện | +|-----------|----------------| +| **Nhiều thẻ `<title>`** | `soup.find_all("title")` trả về một danh sách; cập nhật phần tử đầu tiên hoặc lặp lại nếu bạn cần thay đổi tất cả. | +| **Vấn đề mã hoá** | Mở tệp với `encoding="utf-8-sig"` nếu có BOM, hoặc phát hiện mã hoá bằng `chardet`. | +| **Các tệp HTML lớn** | Sử dụng bộ phân tích `lxml` (`BeautifulSoup(html_content, "lxml")`) để có hiệu năng tốt hơn. | +| **Giữ nguyên định dạng gốc** | Nếu bạn cần giữ nguyên khoảng trắng, ghi `str(soup)` thay vì `prettify()`. | +| **Tự động hoá trên nhiều tệp** | Đóng gói logic trong một hàm và lặp qua `Path.rglob("*.html")`. | + +Các biến thể này giữ nguyên logic **cách thay đổi tiêu đề** trong khi thích nghi với các dự án thực tế. + +## Kết luận + +Bây giờ bạn đã biết cách **cách thay đổi tiêu đề** trong bất kỳ tài liệu HTML nào bằng Python. Hướng dẫn đã bao gồm việc đọc HTML, xác định thẻ `<title>`, cập nhật nội dung của nó, và **lưu html đã chỉnh sửa** một cách an toàn. Với script đầy đủ, bạn có thể tích hợp mẫu này vào các công cụ tạo trang tĩnh, quy trình SEO, hoặc bất kỳ tự động hoá nào cần thay đổi tiêu đề động. + +Tiếp theo, khám phá các chủ đề liên quan như **đọc html bằng python** để trích xuất các thẻ meta, hoặc các kỹ thuật **tải tệp html bằng python** để xử lý markup không chuẩn. Thử nghiệm xử lý hàng loạt để cập nhật tiêu đề trên toàn bộ website—kỹ năng mới của bạn là nền tảng cho nhiều nhiệm vụ tự động hoá web. Chúc lập trình vui! + +## Bạn nên học gì tiếp theo? + +Các hướng dẫn sau đây bao gồm các chủ đề liên quan chặt chẽ, xây dựng trên các kỹ thuật đã trình bày trong hướng dẫn này. Mỗi tài nguyên đều có các ví dụ mã hoạt động đầy đủ với giải thích từng bước để giúp bạn nắm vững các tính năng API bổ sung và khám phá các cách triển khai thay thế trong dự án của mình. + +- [Cách lưu HTML với Aspose.Html – Hướng dẫn đầy đủ C#](/html/english/net/working-with-html-documents/how-to-save-html-with-aspose-html-complete-c-guide/) +- [Cách lưu HTML trong C# – Hướng dẫn đầy đủ sử dụng Trình xử lý tài nguyên tùy chỉnh](/html/english/net/working-with-html-documents/how-to-save-html-in-c-complete-guide-using-a-custom-resource/) +- [Cách chuyển đổi HTML sang PNG – Hướng dẫn chi tiết từng bước](/html/english/net/rendering-html-documents/how-to-render-html-to-png-complete-step-by-step-guide/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/vietnamese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md b/html/vietnamese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md new file mode 100644 index 0000000000..f4fc8b31b7 --- /dev/null +++ b/html/vietnamese/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/_index.md @@ -0,0 +1,204 @@ +--- +category: general +date: 2026-09-19 +description: Chuyển đổi tệp HTML cục bộ sang PDF bằng Python và Aspose.HTML – hướng + dẫn chi tiết từng bước, bao gồm cả các tùy chọn chuyển đổi HTML sang PDF bằng Python. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert local html file to pdf +- convert html to pdf python +- Aspose.HTML Python conversion +- PDF generation Python +- embedding fonts PDF +language: vi +lastmod: 2026-09-19 +og_description: Chuyển đổi tệp HTML cục bộ sang PDF bằng Python. Tìm hiểu cách tốt + nhất để chuyển đổi HTML sang PDF bằng Python với Aspose.HTML, bao gồm nhúng phông + chữ và xử lý lỗi. +og_image_alt: Screenshot showing a local HTML file successfully converted to PDF using + Python +og_title: Chuyển đổi tệp HTML cục bộ sang PDF bằng Python – hướng dẫn đầy đủ +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Convert local HTML file to PDF using Python and Aspose.HTML – a complete + step‑by‑step guide that also covers convert html to pdf python options. + headline: How to convert a local HTML file to PDF with Python + type: TechArticle +tags: +- python +- html +- pdf +- Aspose +title: Cách chuyển đổi tệp HTML cục bộ sang PDF bằng Python +url: /vi/python/general/how-to-convert-a-local-html-file-to-pdf-with-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cách chuyển đổi tệp HTML cục bộ sang PDF bằng Python + +Nếu bạn cần **chuyển đổi tệp HTML cục bộ sang PDF** trong một dự án Python, hướng dẫn này sẽ cung cấp cho bạn một giải pháp sẵn sàng chạy. Bạn sẽ thấy cách thiết lập thư viện Aspose.HTML, cấu hình các tùy chọn PDF và thực hiện việc chuyển đổi chỉ trong vài dòng mã. Hướng dẫn cũng giải thích các thực hành tốt nhất cho **convert html to pdf python**, để bạn có thể điều chỉnh mã cho quy trình làm việc của mình. + +Các bước dưới đây bao gồm mọi thứ bạn cần biết: cài đặt SDK, chuẩn bị các tùy chọn lưu, xử lý các vấn đề thường gặp và xác minh kết quả. Khi kết thúc bài viết, bạn sẽ có một hàm có thể tái sử dụng và chèn vào bất kỳ ứng dụng Python nào. + +## Yêu cầu trước + +Trước khi bắt đầu, hãy chắc chắn rằng bạn có: + +* Python 3.8 hoặc mới hơn đã được cài đặt trên máy của bạn. +* Giấy phép Aspose.HTML for Python đang hoạt động (bản dùng thử miễn phí dùng cho đánh giá). +* Một tệp HTML cục bộ mà bạn muốn chuyển thành PDF (ví dụ, `page.html`). + +Bạn không cần bất kỳ phụ thuộc hệ thống nào khác; SDK đã gói mọi thứ cần thiết cho việc tạo PDF. + +## Cài đặt gói Aspose.HTML + +Aspose.HTML SDK được phân phối qua PyPI. Cài đặt nó bằng `pip` trong môi trường ảo của bạn: + +```bash +pip install aspose-html +``` + +Chạy lệnh sẽ in ra phiên bản đã cài đặt, xác nhận rằng gói có thể được import. + +## Bước 1: Nhập các lớp cần thiết + +Quy trình chuyển đổi dựa trên hai lớp chính: + +```python +from aspose.html import Converter, PDFSaveOptions +``` + +* `Converter` cung cấp phương thức tĩnh `convert_html` thực hiện việc chuyển đổi thực tế. +* `PDFSaveOptions` cho phép bạn tinh chỉnh đầu ra PDF, chẳng hạn như nhúng các phông chữ chuẩn. + +## Bước 2: Tạo tùy chọn lưu PDF và bật nhúng phông chữ chuẩn + +Nhúng phông chữ đảm bảo rằng PDF được tạo ra sẽ hiển thị giống nhau trên mọi thiết bị, ngay cả khi người xem không có các phông chữ được cài đặt cục bộ. + +```python +pdf_options = PDFSaveOptions() +pdf_options.embed_standard_fonts = True +``` + +Đặt `embed_standard_fonts` thành `True` được khuyến nghị cho hầu hết các kịch bản sản xuất vì nó loại bỏ các cảnh báo thay thế phông chữ trong trình đọc PDF. + +## Bước 3: Chuyển đổi tệp HTML sang PDF bằng các tùy chọn đã cấu hình + +Bây giờ gọi `Converter.convert_html`, truyền đường dẫn HTML nguồn, đường dẫn PDF đích và đối tượng tùy chọn bạn đã chuẩn bị: + +```python +Converter.convert_html( + "YOUR_DIRECTORY/page.html", # path to the local HTML file + "YOUR_DIRECTORY/page.pdf", # path where the PDF will be saved + pdf_options # the PDF options defined above +) +``` + +Nếu chuyển đổi thành công, phương thức sẽ trả về `None` và tệp PDF sẽ xuất hiện ở vị trí bạn chỉ định. + +## Ví dụ đầy đủ trong một hàm có thể tái sử dụng + +Đóng gói logic trong một hàm giúp dễ dàng tái sử dụng trên nhiều dự án: + +```python +from aspose.html import Converter, PDFSaveOptions +import os + +def html_to_pdf(source_html: str, target_pdf: str, embed_fonts: bool = True) -> None: + """ + Convert a local HTML file to PDF. + + Parameters + ---------- + source_html : str + Full path to the HTML file on the local filesystem. + target_pdf : str + Full path where the resulting PDF should be written. + embed_fonts : bool, optional + When True, standard fonts are embedded in the PDF. Default is True. + """ + if not os.path.isfile(source_html): + raise FileNotFoundError(f"HTML source not found: {source_html}") + + # Ensure the output directory exists + os.makedirs(os.path.dirname(target_pdf), exist_ok=True) + + # Configure PDF options + pdf_options = PDFSaveOptions() + pdf_options.embed_standard_fonts = embed_fonts + + # Perform the conversion + Converter.convert_html(source_html, target_pdf, pdf_options) + +# Example usage +if __name__ == "__main__": + html_path = "samples/page.html" + pdf_path = "output/page.pdf" + html_to_pdf(html_path, pdf_path) + print(f"PDF generated at: {pdf_path}") +``` + +### Tại sao hàm này hữu ích + +* **Kiểm tra đầu vào** – `FileNotFoundError` giúp việc gỡ lỗi dễ dàng hơn khi đường dẫn HTML sai. +* **Tự động tạo thư mục** – `os.makedirs(..., exist_ok=True)` ngăn ngừa lỗi “thư mục không tồn tại”. +* **Nhúng phông chữ có thể cấu hình** – Bạn có thể tắt việc nhúng phông chữ để giảm kích thước file nếu biết môi trường đích đã có các phông chữ cần thiết. + +## Các trường hợp góc cạnh thường gặp và cách xử lý + +| Situation | Recommended handling | +|-----------|----------------------| +| **HTML chứa CSS hoặc hình ảnh bên ngoài** | Sử dụng URL tuyệt đối hoặc sao chép các tài nguyên bên cạnh tệp HTML; Aspose.HTML tuân theo cùng quy tắc như trình duyệt. | +| **Tệp HTML lớn (>10 MB)** | Tăng giới hạn bộ nhớ mặc định bằng cách đặt `pdf_options.memory_limit` nếu gặp `OutOfMemoryException`. | +| **Bạn cần PDF có mật khẩu bảo vệ** | Đặt `pdf_options.encryption_details` với mật khẩu người dùng trước khi gọi `convert_html`. | +| **Chạy trên máy chủ không giao diện** | Không cần cấu hình bổ sung; SDK không phụ thuộc vào giao diện người dùng. | + +Việc giải quyết những kịch bản này từ đầu sẽ giúp bạn tránh các lỗi runtime không mong muốn. + +## Xác minh kết quả chuyển đổi + +Sau khi script hoàn thành, mở PDF đã tạo bằng bất kỳ trình xem nào (Adobe Reader, Chrome, v.v.). Bố cục hình ảnh nên khớp với HTML gốc, và tất cả phông chữ sẽ hiển thị đúng vì chúng đã được nhúng. + +Bạn cũng có thể xác nhận chương trình rằng tệp tồn tại và có kích thước khác 0: + +```python +import os +if os.path.getsize(pdf_path) > 0: + print("Conversion succeeded.") +else: + print("PDF file is empty – check the source HTML and options.") +``` + +## Mẹo chuyên nghiệp cho môi trường sản xuất + +* **Xử lý hàng loạt** – Lặp qua danh sách các tệp HTML và gọi `html_to_pdf` cho mỗi tệp; tái sử dụng một thể hiện `PDFSaveOptions` duy nhất để giảm chi phí tạo đối tượng. +* **Ghi nhật ký** – Tích hợp mô-đun `logging` của Python để ghi lại thời gian chuyển đổi và bất kỳ ngoại lệ nào. +* **Hiệu năng** – Khi chuyển đổi nhiều tệp, cân nhắc thực hiện chuyển đổi song song bằng `concurrent.futures.ThreadPoolExecutor`, nhưng lưu ý SDK chỉ an toàn với các lời gọi `Converter` riêng biệt. + +## Kết luận + +Bạn giờ đã có một phương pháp hoàn chỉnh, sẵn sàng cho sản xuất để **chuyển đổi tệp HTML cục bộ sang PDF** bằng Python. Giải pháp bao gồm các bước thiết yếu—cài đặt Aspose.HTML, cấu hình tùy chọn PDF, xử lý các trường hợp góc cạnh thường gặp và xác minh kết quả—cùng với việc minh họa quy trình **convert html to pdf python** rộng hơn. + +Từ đây bạn có thể khám phá các tính năng nâng cao như mã hoá PDF, kích thước trang tùy chỉnh, hoặc thêm watermark, tất cả đều được SDK hỗ trợ. Thử nghiệm với các tùy chọn phù hợp nhất cho dự án của bạn, và bạn sẽ có thể tự động hoá việc chuyển đổi HTML‑to‑PDF một cách đáng tin cậy trong bất kỳ môi trường Python nào. + +--- + + +## Bạn nên học gì tiếp theo? + +Các hướng dẫn sau đây bao gồm các chủ đề liên quan chặt chẽ, xây dựng trên các kỹ thuật được trình bày trong hướng dẫn này. Mỗi tài nguyên đều có các ví dụ mã đầy đủ và giải thích từng bước để giúp bạn làm chủ các tính năng API bổ sung và khám phá các cách triển khai thay thế trong dự án của mình. + +- [Chuyển đổi HTML sang PDF với Aspose.HTML – Hướng dẫn chi tiết từng bước](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Chuyển đổi HTML sang PDF với Aspose.HTML – Hướng dẫn thao tác đầy đủ](/html/english/) +- [Chuyển đổi HTML sang PDF trong .NET với Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/vietnamese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md b/html/vietnamese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md new file mode 100644 index 0000000000..5ac98c9310 --- /dev/null +++ b/html/vietnamese/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/_index.md @@ -0,0 +1,218 @@ +--- +category: general +date: 2026-09-19 +description: Học cách chuyển đổi HTML sang Markdown trong Python. Hướng dẫn này cho + thấy cách lưu HTML dưới dạng Markdown và tạo Markdown từ HTML một cách nhanh chóng. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- convert html to markdown +- save html as markdown +- generate markdown from html +- how to convert html +- html to markdown file +language: vi +lastmod: 2026-09-19 +og_description: Chuyển đổi HTML sang Markdown bằng Python. Hãy làm theo hướng dẫn + này để lưu HTML dưới dạng Markdown, tạo Markdown từ HTML và tạo một tệp HTML sang + Markdown. +og_image_alt: Screenshot showing convert html to markdown script output +og_title: Chuyển đổi HTML sang Markdown trong Python – hướng dẫn lập trình toàn diện +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn to convert HTML to Markdown in Python. This tutorial shows how + to save HTML as Markdown and generate Markdown from HTML quickly. + headline: How to convert HTML to Markdown with Python – step‑by‑step guide + type: TechArticle +tags: +- Python +- HTML +- Markdown +- File conversion +title: Cách chuyển đổi HTML sang Markdown bằng Python – hướng dẫn từng bước +url: /vi/python/general/how-to-convert-html-to-markdown-with-python-step-by-step-gui/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cách chuyển đổi HTML sang Markdown bằng Python – hướng dẫn từng bước + +Nếu bạn cần **convert HTML to Markdown**, hướng dẫn này sẽ đưa bạn qua toàn bộ quá trình. Bạn sẽ thấy cách **save HTML as Markdown**, tạo Markdown từ HTML, và tạo một *html to markdown file* có thể được sử dụng trong các trình tạo trang tĩnh, quy trình tài liệu, hoặc bất kỳ quy trình nào ưu tiên đánh dấu văn bản thuần. + +Hướng dẫn bao gồm mọi thứ từ cài đặt thư viện cần thiết đến xử lý các trường hợp đặc biệt như hình ảnh nhúng và định dạng tùy chỉnh. Khi hoàn thành, bạn sẽ có một script sẵn sàng chạy và hiểu rõ lý do mỗi bước quan trọng. + +## Yêu cầu trước + +- Python 3.8 hoặc mới hơn đã được cài đặt trên máy của bạn. +- Có kiến thức cơ bản về lập trình Python. +- Truy cập được tới terminal hoặc command prompt. +- Thư viện `aspose.html` (hoặc bất kỳ gói HTML‑to‑Markdown nào tương thích). Hướng dẫn này sử dụng **Aspose.HTML for Python via .NET**, cung cấp các lớp `HTMLDocument`, `MarkdownSaveOptions`, và `Converter` như trong ví dụ code. + +> **Pro tip:** Nếu bạn muốn giải pháp thuần Python, có thể thay `aspose.html` bằng gói `html2text`. Luồng công việc tổng thể vẫn giữ nguyên. + +## Bước 1: Cài đặt thư viện chuyển đổi + +Đầu tiên, cài đặt thư viện cung cấp `HTMLDocument`, `MarkdownSaveOptions`, và `Converter`. Chạy lệnh sau: + +```bash +pip install aspose-html +``` + +Gói này bao gồm engine gốc cần thiết để **generate markdown from html** nhanh chóng và với độ chính xác cao. Quá trình cài đặt thường hoàn thành trong vòng chưa tới một phút trên kết nối băng thông rộng tiêu chuẩn. + +## Bước 2: Tải tài liệu HTML nguồn + +Việc tải file HTML là hành động cụ thể đầu tiên trong quy trình chuyển đổi. Lớp `HTMLDocument` sẽ phân tích file và xây dựng một DOM trong bộ nhớ, mà bộ chuyển đổi sẽ duyệt để tạo ra Markdown. + +```python +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter + +# Step 2: Load the source HTML document +html_path = "YOUR_DIRECTORY/input.html" +html_doc = HTMLDocument(html_path) +``` + +> **Why this matters:** Bằng cách tạo một đối tượng `HTMLDocument`, bạn đảm bảo các cấu trúc phức tạp—bảng, danh sách và kiểu inline—được diễn giải đúng trước khi chuyển đổi. Bỏ qua bước này sẽ buộc bộ chuyển đổi đọc văn bản thô, dẫn đến mất định dạng. + +## Bước 3: Cấu hình tùy chọn lưu Markdown + +Đối tượng `MarkdownSaveOptions` cho phép bạn tinh chỉnh định dạng đầu ra. Để tạo **Git‑flavored Markdown**, đặt thuộc tính `formatter` thành `"GIT"`. Điều này khớp với cú pháp được sử dụng bởi các nền tảng như GitHub, GitLab và Bitbucket. + +```python +# Step 3: Create Markdown save options and select Git‑flavored Markdown +md_options = MarkdownSaveOptions() +md_options.formatter = "GIT" # Equivalent to md_options.git = True +``` + +Bạn cũng có thể điều chỉnh các thiết lập khác, chẳng hạn `preserve_links` hoặc `code_block_style`, tùy thuộc vào cách bạn dự định **save html as markdown** trong các công cụ downstream. + +## Bước 4: Chuyển đổi HTML sang Markdown và lưu kết quả + +Với tài liệu đã được tải và các tùy chọn đã cấu hình, gọi phương thức tĩnh `convert_html`. Phương thức này đọc DOM, áp dụng formatter đã chọn và ghi file đầu ra. + +```python +# Step 4: Convert the HTML to Markdown and save the result +output_path = "YOUR_DIRECTORY/output.md" +Converter.convert_html(html_doc, output_path, md_options) +print(f"Conversion complete – Markdown saved to {output_path}") +``` + +Sau khi chạy script, bạn sẽ thấy một file mới có tên `output.md` trong thư mục đã chỉ định. Mở nó lên sẽ hiển thị Markdown sạch sẽ, tương thích với Git, sẵn sàng cho việc kiểm soát phiên bản hoặc xuất bản. + +## Bước 5: Xác minh file markdown đã tạo + +Một kiểm tra nhanh giúp bạn xác nhận việc chuyển đổi thành công và rằng **html to markdown file** chứa nội dung mong đợi. + +```python +# Step 5: Load and print the first 10 lines of the generated Markdown +with open(output_path, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) +``` + +Kết quả điển hình cho một trang HTML đơn giản trông như sau: + +``` +# Sample Document + +This is a **bold** paragraph with a [link](https://example.com). + +- Item 1 +- Item 2 +- Item 3 +``` + +Nếu bạn nhận thấy thiếu tiêu đề hoặc danh sách bị lỗi, hãy quay lại **Step 3** và thử các giá trị `formatter` khác (`"COMMONMARK"`, `"MARKDOWN_EXTRA"`). + +## Nâng cao: Xử lý hình ảnh và đường dẫn tương đối + +Khi HTML nguồn chứa hình ảnh, bộ chuyển đổi có thể nhúng chúng dưới dạng data URI hoặc giữ nguyên thuộc tính `src`. Để quá trình **generate markdown from html** nhẹ nhàng, bạn có thể sao chép các file hình ảnh vào một thư mục song song và điều chỉnh đường dẫn. + +```python +md_options.image_handling = "COPY" # Options: "EMBED", "COPY", "IGNORE" +md_options.images_folder = "YOUR_DIRECTORY/images" +``` + +Sau khi chuyển đổi, Markdown sẽ tham chiếu hình ảnh như `![Alt text](images/picture.png)`. Cách này hoạt động tốt khi bạn sau này **save html as markdown** trong một trình tạo trang tĩnh yêu cầu tài nguyên nằm trong thư mục riêng. + +## Script đầy đủ bạn có thể sao chép‑dán + +Dưới đây là script hoàn chỉnh, có thể chạy được, tích hợp tất cả các bước đã thảo luận. Lưu lại với tên `convert_html_to_md.py` và thực thi bằng `python convert_html_to_md.py`. + +```python +# convert_html_to_md.py +# Complete script to convert an HTML file to a Git‑flavored Markdown file. + +from aspose.html import HTMLDocument, MarkdownSaveOptions, Converter +import os + +def main(): + # Define input and output locations + input_html = os.path.join("YOUR_DIRECTORY", "input.html") + output_md = os.path.join("YOUR_DIRECTORY", "output.md") + + # 1️⃣ Load the HTML document + html_doc = HTMLDocument(input_html) + + # 2️⃣ Set up Markdown options (Git‑flavored) + md_options = MarkdownSaveOptions() + md_options.formatter = "GIT" # Git‑flavored Markdown + md_options.image_handling = "COPY" # Copy images to a folder + md_options.images_folder = os.path.join("YOUR_DIRECTORY", "images") + + # 3️⃣ Perform the conversion + Converter.convert_html(html_doc, output_md, md_options) + print(f"✅ Conversion complete – Markdown saved to: {output_md}") + + # 4️⃣ Quick verification – show first few lines + print("\n--- First 10 lines of the generated Markdown ---") + with open(output_md, "r", encoding="utf-8") as md_file: + for i, line in enumerate(md_file): + if i >= 10: + break + print(line.rstrip()) + +if __name__ == "__main__": + main() +``` + +### Kết quả mong đợi + +Chạy script sẽ in ra thông báo xác nhận, sau đó là mười dòng đầu tiên của file Markdown, như đã trình bày ở trên. File `output.md` được tạo ra có thể mở bằng bất kỳ trình soạn thảo văn bản nào, xem trước trong VS Code, hoặc commit vào repository Git. + +## Các câu hỏi thường gặp và xử lý trường hợp đặc biệt + +| Câu hỏi | Trả lời | +|----------|--------| +| **Nếu file HTML quá lớn (> 10 MB) thì sao?** | Lớp `HTMLDocument` sẽ stream dữ liệu vào, vì vậy mức sử dụng bộ nhớ vẫn ở mức vừa phải. Tuy nhiên, nếu gặp `MemoryError` hãy cân nhắc tăng giới hạn bộ nhớ cho quá trình Python. | +| **Tôi có thể chuyển đổi một chuỗi HTML thay vì file không?** | Có. Dùng `HTMLDocument.from_string(html_string)` (hoặc constructor tương đương) trước khi gọi `Converter.convert_html`. | +| **Làm sao giữ lại các comment HTML gốc?** | Đặt `md_options.preserve_comments = True`. Các comment sẽ xuất hiện dưới dạng comment HTML (`<!-- … -->`) trong file Markdown. | +| **Có thể nhắm tới một dialect Markdown khác không?** | Thay đổi `md_options.formatter` thành `"COMMONMARK"` hoặc `"MARKDOWN_EXTRA"` tùy vào nền tảng mục tiêu. | +| **Có cần cài đặt .NET runtime riêng không?** | Gói `aspose-html` đã bao gồm runtime cần thiết cho hầu hết các nền tảng. Trên Linux, hãy chắc chắn cài `libgdiplus` (`sudo apt-get install libgdiplus`). | + +## Kết luận + +Bây giờ bạn đã biết cách **convert HTML to Markdown** bằng Python, cách **save html as markdown**, và cách **generate markdown from html** với kiểm soát chi tiết về định dạng và tài nguyên. Script minh họa toàn bộ quy trình—from tải file nguồn đến tạo ra một *html to markdown file* sạch sẽ, sẵn sàng cho kiểm soát phiên bản hoặc xuất bản. + +Tiếp theo, hãy khám phá các chủ đề liên quan như **batch converting multiple HTML files**, tích hợp bước chuyển đổi vào pipeline CI/CD, hoặc tùy chỉnh đầu ra Markdown cho các trình tạo trang tĩnh cụ thể như Hugo hoặc Jekyll. Thử nghiệm các thiết lập `MarkdownSaveOptions` khác nhau để điều chỉnh kết quả phù hợp với style guide của dự án. + +Chúc bạn chuyển đổi thành công! + +## Bạn nên học gì tiếp theo? + +Các tutorial sau đây đề cập đến các chủ đề liên quan chặt chẽ, xây dựng trên các kỹ thuật đã trình bày trong hướng dẫn này. Mỗi tài nguyên bao gồm các ví dụ code đầy đủ, kèm giải thích từng bước để giúp bạn làm chủ các tính năng API bổ sung và khám phá các cách triển khai thay thế trong dự án của mình. + +- [Chuyển đổi HTML sang Markdown trong .NET với Aspose.HTML](/html/english/net/html-extensions-and-conversions/convert-html-to-markdown/) +- [Chuyển đổi HTML sang Markdown trong Aspose.HTML cho Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown sang HTML Java - Chuyển đổi với 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/vietnamese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md b/html/vietnamese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md new file mode 100644 index 0000000000..1f88fee9ef --- /dev/null +++ b/html/vietnamese/python/general/how-to-enable-features-while-converting-html-to-markdown/_index.md @@ -0,0 +1,220 @@ +--- +category: general +date: 2026-09-19 +description: Cách bật các tính năng khi chuyển đổi HTML sang Markdown bằng Python. + Tìm hiểu cách chuyển đổi tài liệu HTML và lưu HTML dưới dạng Markdown với kiểm soát + tính năng chính xác. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- how to enable features +- convert html to markdown +- how to convert html +- convert html document +- save html as markdown +language: vi +lastmod: 2026-09-19 +og_description: Cách bật các tính năng khi chuyển đổi HTML sang Markdown. Hướng dẫn + này sẽ chỉ cho bạn từng bước cách chuyển đổi tài liệu HTML và lưu HTML dưới dạng + Markdown với kiểm soát chi tiết. +og_image_alt: Screenshot of Python code that enables features for HTML‑to‑Markdown + conversion +og_title: Cách bật tính năng khi chuyển đổi HTML sang Markdown +schemas: +- author: GroupDocs + dateModified: '2026-09-19' + description: How to enable features while converting HTML to Markdown using Python. + Learn to convert HTML document and save HTML as Markdown with precise feature + control. + headline: How to enable features while converting HTML to Markdown + type: TechArticle +tags: +- HTML conversion +- Markdown +- Python +title: Cách bật các tính năng khi chuyển đổi HTML sang Markdown +url: /vi/python/general/how-to-enable-features-while-converting-html-to-markdown/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cách bật các tính năng khi chuyển đổi HTML sang Markdown + +Nếu bạn cần **how to enable features** trong quá trình chuyển đổi, hướng dẫn này cung cấp cho bạn một giải pháp hoàn chỉnh, có thể chạy được. Bạn sẽ thấy chính xác cách chuyển đổi HTML sang Markdown, kiểm soát các tính năng Markdown được tạo ra, và lưu HTML dưới dạng Markdown trong một lần thực thi. + +Ví dụ sử dụng **GroupDocs.Conversion** Python SDK phổ biến, nhưng các khái niệm áp dụng cho bất kỳ thư viện nào cho phép bạn cấu hình các tập hợp tính năng. Khi kết thúc hướng dẫn này, bạn có thể chuyển đổi một tài liệu HTML, chỉ giữ lại các liên kết và đoạn văn, và tránh các bảng, hình ảnh hoặc khối mã không mong muốn. + +## Những gì bạn sẽ đạt được + +* **how to enable features** trong tùy chọn lưu Markdown +* một quy trình **convert html to markdown** rõ ràng +* khả năng **how to convert html** với đầu ra chọn lọc +* một script sẵn sàng chạy mà **convert html document** và **save html as markdown** + +### Yêu cầu trước + +* Python 3.8+ đã được cài đặt +* gói `groupdocs-conversion` (cài đặt bằng `pip install groupdocs-conversion`) +* Một tệp HTML mẫu (`sample.html`) trong một thư mục đã biết + +--- + +## Cách bật các tính năng trong chuyển đổi Markdown + +Bước đầu tiên là tạo một đối tượng `MarkdownSaveOptions` và cho trình chuyển đổi biết các phần tử bạn muốn giữ lại. Trong hướng dẫn này, chúng tôi chỉ bật **links** và **paragraphs**. + +```python +# Import the required classes from the GroupDocs.Conversion SDK +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# Step 1: Load the source HTML document +html_doc = HTMLDocument("YOUR_DIRECTORY/sample.html") + +# Step 2: Create Markdown save options +markdown_options = MarkdownSaveOptions() + +# Step 3: Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# Step 4: Convert the HTML document to Markdown using the configured options +Converter.convert_html(html_doc, "YOUR_DIRECTORY/sample.md", markdown_options) +``` + +**Tại sao cách này hoạt động:** +* `HTMLDocument` bọc tệp nguồn để trình chuyển đổi có thể đọc nó. +* `MarkdownSaveOptions` chứa tất cả cài đặt chuyển đổi; danh sách `features` là thuộc tính chính mà **how to enable features**. +* Bằng cách gán `["Link", "Paragraph"]` bạn nói cho engine chỉ tạo ra các liên kết Markdown (`[text](url)`) và các đoạn văn thuần, loại bỏ hình ảnh, bảng và các markup khác. +* `Converter.convert_html` thực hiện thao tác **convert html to markdown** thực tế và ghi kết quả vào `sample.md`. + +--- + +## Cách chuyển đổi tài liệu HTML với các tùy chọn tùy chỉnh + +Nếu sau này bạn cần thêm nhiều cờ tính năng—như `"Header"` hoặc `"Bold"`—chỉ cần mở rộng danh sách: + +```python +# Enable links, paragraphs, headers, and bold text +markdown_options.features = ["Link", "Paragraph", "Header", "Bold"] +``` + +Lệnh gọi `Converter.convert_html` giống nhau bây giờ sẽ bao gồm các phần tử bổ sung đó. Mẫu này cho phép bạn **how to convert html** một cách cấu hình cao mà không cần viết trình phân tích tùy chỉnh. + +--- + +## Cách lưu HTML dưới dạng Markdown trong một thư mục cụ thể + +Phương thức `convert_html` chấp nhận một đường dẫn đầu ra tuyệt đối hoặc tương đối. Để **save html as markdown** trong một thư mục con có tên `output`, điều chỉnh đối số thứ ba: + +```python +output_path = "YOUR_DIRECTORY/output/sample.md" +Converter.convert_html(html_doc, output_path, markdown_options) +``` + +Chạy script sẽ tạo thư mục `output` (nếu chưa tồn tại) và ghi tệp Markdown vào đó. Cách tiếp cận này giữ cho HTML nguồn và Markdown đã tạo được tổ chức gọn gàng. + +--- + +## Toàn bộ script bạn có thể sao chép‑dán + +Dưới đây là toàn bộ chương trình, sẵn sàng để chạy. Thay thế `YOUR_DIRECTORY` bằng đường dẫn chứa `sample.html`. + +```python +# -*- coding: utf-8 -*- +""" +How to enable features while converting HTML to Markdown + +This script demonstrates: +* loading an HTML document, +* configuring MarkdownSaveOptions to keep only links and paragraphs, +* converting the HTML to Markdown, +* and saving the result to a .md file. +""" + +from pathlib import Path +from groupdocs.conversion import Converter, HTMLDocument, MarkdownSaveOptions + +# ---------------------------------------------------------------------- +# Configuration +# ---------------------------------------------------------------------- +BASE_DIR = Path("YOUR_DIRECTORY") # <— change this +HTML_FILE = BASE_DIR / "sample.html" +OUTPUT_MD = BASE_DIR / "sample.md" # <— change if you want a different name + +# ---------------------------------------------------------------------- +# Step 1: Load the source HTML document +# ---------------------------------------------------------------------- +html_doc = HTMLDocument(str(HTML_FILE)) + +# ---------------------------------------------------------------------- +# Step 2: Create and configure Markdown save options +# ---------------------------------------------------------------------- +markdown_options = MarkdownSaveOptions() +# Enable only the desired features (links and paragraphs) +markdown_options.features = ["Link", "Paragraph"] + +# ---------------------------------------------------------------------- +# Step 3: Perform the conversion and write the Markdown file +# ---------------------------------------------------------------------- +Converter.convert_html(html_doc, str(OUTPUT_MD), markdown_options) + +print(f"Conversion complete. Markdown saved to: {OUTPUT_MD}") +``` + +**Kết quả mong đợi** (được in ra console): + +``` +Conversion complete. Markdown saved to: /path/to/YOUR_DIRECTORY/sample.md +``` + +Mở `sample.md` và bạn sẽ thấy chỉ có các liên kết Markdown và các đoạn văn thuần, ví dụ: + +```markdown +This is a paragraph with a [link](https://example.com) inside. +Another paragraph follows without any images or tables. +``` + +Tất cả các phần tử HTML khác đã bị loại bỏ vì **how to enable features** đã giới hạn đầu ra chỉ còn hai loại đã chọn. + +--- + +## Các câu hỏi thường gặp và các trường hợp đặc biệt + +| Question | Answer | +|----------|--------| +| *Nếu tệp HTML không chứa liên kết nào thì sao?* | Trình chuyển đổi vẫn ghi các đoạn văn; đầu ra sẽ chứa văn bản thuần mà không có cú pháp liên kết. | +| *Tôi có thể tắt tất cả các tính năng không?* | Cài đặt `markdown_options.features = []` sẽ tạo ra một tệp Markdown trống. Chỉ sử dụng điều này cho mục đích thử nghiệm. | +| *SDK xử lý HTML không hợp lệ như thế nào?* | Bộ phân tích cố gắng làm sạch markup sai định dạng trước khi áp dụng bộ lọc tính năng. Các lỗi được ghi lại nhưng không làm dừng quá trình chuyển đổi. | +| *Có thể giữ lại hình ảnh trong khi loại bỏ bảng không?* | Có. Đặt `markdown_options.features = ["Link", "Paragraph", "Image"]`. Danh sách tính năng là cộng dồn, không loại trừ. | +| *Nếu tôi cần chuyển đổi nhiều tệp trong một thư mục thì sao?* | Bao quanh logic chuyển đổi trong một vòng lặp lặp qua `Path.glob("*.html")`. Cấu hình **how to enable features** giống nhau có thể được tái sử dụng cho mỗi tệp. | + +**Mẹo chuyên nghiệp:** Khi xử lý các lô lớn, khởi tạo `MarkdownSaveOptions` một lần và tái sử dụng nó. Điều này giảm chi phí tạo đối tượng và giữ cho pipeline **convert html to markdown** nhanh chóng. + +--- + +## Kết luận + +Bây giờ bạn đã biết **how to enable features** khi bạn **convert html to markdown**, cách **how to convert html** với đầu ra chọn lọc, và cách **convert html document** và **save html as markdown** bằng một script Python ngắn gọn. Bằng cách cấu hình `MarkdownSaveOptions.features`, bạn có toàn quyền kiểm soát các yếu tố Markdown xuất hiện trong tệp cuối cùng. + +### Các bước tiếp theo + +* Khám phá các cờ tính năng bổ sung như `"Header"`, `"Bold"` và `"Italic"` để làm phong phú đầu ra Markdown của bạn. +* Kết hợp script này với một trình theo dõi tệp (ví dụ, `watchdog`) để tự động chuyển đổi các tệp HTML mới khi chúng xuất hiện. +* Xem lại tài liệu [GroupDocs.Conversion Python SDK documentation](https://github.com/groupdocs-conversion/GroupDocs.Conversion-Examples) để biết các kịch bản nâng cao như chuyển đổi PDF‑to‑Markdown hoặc DOCX‑to‑HTML. + +Bạn có thể thoải mái thử nghiệm các bộ tính năng khác nhau và chia sẻ phát hiện của mình với cộng đồng. Chúc bạn chuyển đổi vui vẻ! + +## Bạn nên học gì tiếp theo? + +Các hướng dẫn sau đây bao gồm các chủ đề liên quan chặt chẽ, xây dựng dựa trên các kỹ thuật được trình bày trong hướng dẫn này. Mỗi tài nguyên bao gồm các ví dụ mã hoạt động đầy đủ với các giải thích từng bước để giúp bạn làm chủ các tính năng API bổ sung và khám phá các cách triển khai thay thế trong dự án của mình. + +- [Chuyển đổi HTML sang Markdown trong Aspose.HTML cho Java](/html/english/java/saving-html-documents/convert-html-to-markdown/) +- [Markdown sang HTML Java - Chuyển đổi với Aspose.HTML](/html/english/java/conversion-html-to-other-formats/convert-markdown-to-html/) +- [Cách bật JavaScript trong Aspose HTML – Tải HTML & Lấy Văn bản](/html/english/java/advanced-usage/how-to-enable-javascript-in-aspose-html-load-html-get-text/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/vietnamese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md b/html/vietnamese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md new file mode 100644 index 0000000000..e25735e5c9 --- /dev/null +++ b/html/vietnamese/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/_index.md @@ -0,0 +1,245 @@ +--- +category: general +date: 2026-09-19 +description: Tìm hiểu cách giới hạn tài nguyên lồng nhau trong Aspose.HTML cho Python + bằng ResourceHandlingOptions. Kiểm soát độ sâu xử lý tối đa và tránh vòng lặp vô + hạn. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- limit nested resources +- resource handling options +- Aspose HTML Python +- max handling depth +- nested resource handling +language: vi +lastmod: 2026-09-19 +og_description: Giới hạn tài nguyên lồng nhau trong Aspose.HTML cho Python bằng cách + sử dụng ResourceHandlingOptions. Đặt độ sâu xử lý tối đa để ngăn ngừa đệ quy sâu + và cải thiện hiệu suất. +og_image_alt: Screenshot of Python code that limits nested resources with Aspose.HTML +og_title: Cách giới hạn tài nguyên lồng nhau trong Aspose.HTML cho Python – hướng + dẫn từng bước +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + headline: How to limit nested resources when processing HTML with Aspose.HTML for + Python + type: TechArticle +- description: Learn how to limit nested resources in Aspose.HTML for Python using + ResourceHandlingOptions. Control max handling depth and avoid infinite loops. + name: How to limit nested resources when processing HTML with Aspose.HTML for Python + steps: + - name: Explanation of each step + text: 1. **Install the package** – The `aspose-html` wheel is required. The `pip + install` command is shown as a comment for completeness. 2. **Import classes** + – `HtmlDocument` loads the page, `ResourceHandlingOptions` holds the limit, + and `HtmlLoadOptions` ties the two together. 3. **Create the options o + - name: Changing the depth limit + text: 'You might need a deeper or shallower limit based on your environment:' + - name: Disabling the limit completely + text: 'Setting the property to `0` tells Aspose.HTML to **remove any depth restriction**:' + - name: Handling circular references + text: 'Even with a depth limit, circular references can still appear at the same + level. Aspose.HTML detects cycles and stops loading a resource that has already + been processed, regardless of the depth setting. However, setting a lower `max_handling_depth` + reduces the chance of hitting a cycle in the first ' + - name: Using the limit with local files + text: 'The same approach works for local HTML files:' + - name: Integrating with other Aspose.HTML features + text: 'If you also need to control **resource download timeout**, you can combine + `ResourceHandlingOptions` with `NetworkOptions`:' + type: HowTo +tags: +- Aspose +- Python +- HTML processing +- Resource management +title: Cách giới hạn tài nguyên lồng nhau khi xử lý HTML bằng Aspose.HTML cho Python +url: /vi/python/general/how-to-limit-nested-resources-when-processing-html-with-aspo/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cách giới hạn tài nguyên lồng nhau khi xử lý HTML với Aspose.HTML cho Python + +Nếu bạn cần **giới hạn tài nguyên lồng nhau** khi render hoặc chuyển đổi HTML, hướng dẫn này sẽ chỉ cho bạn các bước chính xác để cấu hình Aspose.HTML cho Python. Kiểm soát độ sâu của việc xử lý tài nguyên giúp ngăn ngừa đệ quy vô hạn khi một trang bao gồm nhiều lớp CSS, JavaScript hoặc tham chiếu hình ảnh. + +Việc giới hạn tài nguyên lồng nhau đặc biệt quan trọng đối với các trình thu thập dữ liệu quy mô lớn, quy trình render email, hoặc bất kỳ luồng công việc tự động nào phải tuân thủ ngân sách bộ nhớ và thời gian. Trong các phần sau, bạn sẽ hiểu tại sao nên đặt giới hạn độ sâu, cách sử dụng lớp `ResourceHandlingOptions`, và cách kiểm tra xem giới hạn có hoạt động như mong đợi hay không. + +## Tại sao bạn nên giới hạn tài nguyên lồng nhau + +Các tài liệu HTML thường tham chiếu đến các tài nguyên khác—bảng kiểu, script, hình ảnh, phông chữ, hoặc thậm chí các tệp HTML khác. Mỗi tài nguyên đó lại có thể tham chiếu đến các tệp bổ sung, tạo thành một cây phụ thuộc. Nếu không có biện pháp bảo vệ, cây này có thể trở nên sâu tùy ý: + +* Một trang tải tệp CSS mà trong đó lại import một tệp CSS khác, tiếp tục import nữa, và cứ thế. +* JavaScript có thể tải động các script bổ sung. +* Một mẫu email có thể nhúng hình ảnh mà URL bên ngoài lại chuyển hướng tới các tài sản khác. + +Khi độ sâu đệ quy tăng mà không được kiểm soát, bạn sẽ gặp: + +* **Tiêu thụ bộ nhớ quá mức** – mỗi tài nguyên được lấy về chiếm một bộ đệm. +* **Thời gian xử lý lâu hơn** – độ trễ mạng nhân lên theo mỗi cấp độ. +* **Có khả năng vòng lặp vô hạn** – các tham chiếu vòng có thể khiến engine không bao giờ trả về. + +Đặt **độ sâu xử lý tối đa** cho Aspose.HTML dừng việc theo dõi các liên kết tài nguyên sau một số mức nhất định, đảm bảo hiệu năng dự đoán được. + +## Cách giới hạn tài nguyên lồng nhau trong Aspose.HTML cho Python + +Aspose.HTML cung cấp lớp `ResourceHandlingOptions`, trong đó có thuộc tính `max_handling_depth`. Bằng cách gán một giá trị số (ví dụ, `3`), bạn chỉ định cho engine dừng sau ba mức tài nguyên lồng nhau. + +Dưới đây là một ví dụ hoàn chỉnh, có thể chạy được, minh họa toàn bộ quy trình: + +```python +# --------------------------------------------------------- +# Step 0: Install the Aspose.HTML package (if not already) +# --------------------------------------------------------- +# pip install aspose-html + +# --------------------------------------------------------- +# Step 1: Import the required classes +# --------------------------------------------------------- +from aspose.html import HtmlDocument, ResourceHandlingOptions, HtmlLoadOptions + +# --------------------------------------------------------- +# Step 2: Create a ResourceHandlingOptions instance +# --------------------------------------------------------- +resource_options = ResourceHandlingOptions() +# Limit the handling depth to three levels of nested resources +resource_options.max_handling_depth = 3 + +# --------------------------------------------------------- +# Step 3: Attach the options to the HTML load configuration +# --------------------------------------------------------- +load_options = HtmlLoadOptions() +load_options.resource_handling_options = resource_options + +# --------------------------------------------------------- +# Step 4: Load an HTML page using the configured options +# --------------------------------------------------------- +# Replace the URL with any page that has deep resource nesting +html_url = "https://example.com/deep-nested.html" +document = HtmlDocument(html_url, load_options) + +# --------------------------------------------------------- +# Step 5: Verify the depth limit worked +# --------------------------------------------------------- +# The Document object exposes a collection of loaded resources. +# We'll print the total number of resources and the deepest level reached. +print(f"Total resources loaded: {len(document.resources)}") +deepest_level = max((res.depth for res in document.resources), default=0) +print(f"Deepest resource level: {deepest_level}") + +# --------------------------------------------------------- +# Step 6: (Optional) Save the processed HTML to disk +# --------------------------------------------------------- +output_path = "output_limited.html" +document.save(output_path) +print(f"Processed HTML saved to {output_path}") +``` + +### Giải thích từng bước + +1. **Cài đặt gói** – Wheel `aspose-html` là bắt buộc. Lệnh `pip install` được đưa vào dưới dạng comment để đầy đủ. +2. **Nhập các lớp** – `HtmlDocument` tải trang, `ResourceHandlingOptions` chứa giới hạn, và `HtmlLoadOptions` kết hợp hai thành phần này. +3. **Tạo đối tượng tùy chọn** – Khi khởi tạo `ResourceHandlingOptions` bạn nhận được một container có thể thay đổi. +4. **Đặt `max_handling_depth`** – Gán `3` (hoặc bất kỳ số nguyên nào) để hạn chế engine chỉ xử lý ba mức tài nguyên lồng nhau. Đây là phần cốt lõi của **giới hạn tài nguyên lồng nhau**. +5. **Gắn tùy chọn vào cấu hình tải** – `HtmlLoadOptions` cho phép bạn truyền `resource_options` cho bộ tải. +6. **Tải HTML** – Hàm khởi tạo của `HtmlDocument` chấp nhận URL hoặc đường dẫn tệp cùng với `load_options`. Engine bây giờ sẽ tuân theo giới hạn độ sâu. +7. **Xác minh** – Bằng cách lặp qua `document.resources`, bạn có thể thấy bao nhiêu tài nguyên thực sự đã được lấy và mức độ sâu nhất đã gặp. Nếu mức độ sâu nhất là `3` hoặc thấp hơn, giới hạn đã thành công. +8. **Lưu** – Ghi lại tài liệu đã xử lý. Tệp đã lưu chỉ chứa các tài nguyên tới độ sâu cho phép. + +#### Kết quả mong đợi + +``` +Total resources loaded: 12 +Deepest resource level: 3 +Processed HTML saved to output_limited.html +``` + +Các số sẽ thay đổi tùy theo trang nguồn, nhưng mức độ sâu nhất không bao giờ vượt quá `3` vì chúng ta đã đặt `max_handling_depth = 3`. + +## Các biến thể phổ biến và trường hợp góc cạnh + +### Thay đổi giới hạn độ sâu + +Bạn có thể cần một giới hạn sâu hơn hoặc nông hơn tùy vào môi trường: + +```python +resource_options.max_handling_depth = 1 # Only top‑level resources (e.g., images directly referenced) +resource_options.max_handling_depth = 5 # Allow deeper CSS imports but still guard against runaway recursion +``` + +### Vô hiệu hoá hoàn toàn giới hạn + +Đặt thuộc tính thành `0` sẽ khiến Aspose.HTML **bỏ mọi hạn chế độ sâu**: + +```python +resource_options.max_handling_depth = 0 # No limit – use with caution +``` + +Chỉ thực hiện việc này khi bạn chắc chắn HTML nguồn hoạt động đúng. + +### Xử lý các tham chiếu vòng + +Ngay cả khi đã có giới hạn độ sâu, các tham chiếu vòng vẫn có thể xuất hiện ở cùng một mức. Aspose.HTML phát hiện các vòng và dừng tải tài nguyên đã được xử lý, bất kể cài đặt độ sâu. Tuy nhiên, giảm `max_handling_depth` sẽ giảm khả năng gặp vòng ngay từ đầu. + +### Sử dụng giới hạn với tệp cục bộ + +Cách tiếp cận này cũng áp dụng cho các tệp HTML cục bộ: + +```python +document = HtmlDocument("C:/myproject/templates/email.html", load_options) +``` + +Engine xử lý các thuộc tính `href` hoặc `src` tương đối giống như URL từ xa, áp dụng giới hạn độ sâu cho các tài nguyên trên hệ thống tập tin. + +### Kết hợp với các tính năng khác của Aspose.HTML + +Nếu bạn cũng cần kiểm soát **thời gian chờ tải tài nguyên**, có thể kết hợp `ResourceHandlingOptions` với `NetworkOptions`: + +```python +from aspose.html import NetworkOptions + +network_opts = NetworkOptions() +network_opts.timeout = 5000 # milliseconds +load_options.network_options = network_opts +``` + +Hai tùy chọn này độc lập, cho phép bạn tinh chỉnh hiệu năng và độ an toàn đồng thời. + +## Mẹo chuyên nghiệp cho môi trường production + +* **Ghi lại cây tài nguyên** – Khi debug, lặp qua `document.resources` và ghi log URL cùng độ sâu của mỗi tài nguyên. Điều này giúp bạn hiểu tại sao một trang cụ thể vượt quá mong đợi. +* **Cache các tài nguyên đã lấy** – Nếu bạn thường xuyên xử lý cùng các tài sản bên ngoài, bật cache để tránh các cuộc gọi mạng lặp lại. +* **Kết hợp với whitelist** – Nếu chỉ một số miền được tin cậy, lọc `document.resources` sau khi tải và loại bỏ những tài nguyên nằm ngoài whitelist. +* **Kiểm tra với các trang góc cạnh** – Tạo một tệp HTML tổng hợp mà import chuỗi 10 tệp CSS. Xác minh rằng giới hạn của bạn cắt ngắn chuỗi đúng như mong muốn. + +## Kết luận + +Bạn đã biết cách **giới hạn tài nguyên lồng nhau** trong Aspose.HTML cho Python bằng cách cấu hình `ResourceHandlingOptions.max_handling_depth`. Đặt giới hạn độ sâu bảo vệ ứng dụng khỏi việc tiêu tốn bộ nhớ quá mức, thời gian xử lý kéo dài và các vòng lặp vô hạn do các tham chiếu tài nguyên sâu hoặc vòng. + +Từ đây, bạn có thể: + +* Điều chỉnh độ sâu để phù hợp với ngân sách hiệu năng của mình (`resource_handling_options.max_handling_depth`). +* Kết hợp giới hạn với thời gian chờ mạng, cache, hoặc whitelist miền để xây dựng các pipeline vững chắc. +* Khám phá các chủ đề liên quan như **resource handling options**, **max handling depth**, và **nested resource handling** để kiểm soát chặt chẽ hơn quá trình xử lý HTML. + +Thử nghiệm với các giá trị độ sâu khác nhau và quan sát cách số lượng tài nguyên được tải thay đổi. Khi đã sẵn sàng, tích hợp mẫu này vào dịch vụ chuyển đổi hoặc render HTML lớn hơn của bạn để đảm bảo thực thi dự đoán được, an toàn và hiệu quả. + +## Bạn nên học gì tiếp theo? + +Các hướng dẫn sau đây đề cập đến các chủ đề liên quan chặt chẽ, xây dựng trên các kỹ thuật được trình bày trong hướng dẫn này. Mỗi tài nguyên bao gồm các ví dụ mã hoàn chỉnh với giải thích từng bước để giúp bạn làm chủ các tính năng API bổ sung và khám phá các cách triển khai thay thế trong dự án của mình. + +- [Message Handling and Networking in Aspose.HTML for Java](/html/english/java/message-handling-networking/) +- [Custom Schema Filter and Message Handling in Aspose.HTML for Java](/html/english/java/custom-schema-message-handling/) +- [Data Handling and Stream Management in Aspose.HTML for Java](/html/english/java/data-handling-stream-management/) + +{{< /blocks/products/pf/tutorial-page-section >}} +{{< /blocks/products/pf/main-container >}} +{{< /blocks/products/pf/main-wrap-class >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/html/vietnamese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md b/html/vietnamese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md new file mode 100644 index 0000000000..beb424a148 --- /dev/null +++ b/html/vietnamese/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/_index.md @@ -0,0 +1,261 @@ +--- +category: general +date: 2026-09-19 +description: Học hướng dẫn chuyển html sang pdf bằng Python, cho thấy cách tạo pdf + nhanh chóng từ html với Aspose.HTML. Hãy theo dõi hướng dẫn từng bước ngay bây giờ. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- html to pdf tutorial +- how to generate pdf +- generate pdf from html +- python convert html pdf +- export html as pdf +language: vi +lastmod: 2026-09-19 +og_description: 'Hướng dẫn HTML sang PDF: Chuyển đổi bất kỳ trang HTML nào thành tệp + PDF bằng Python và Aspose.HTML. Hướng dẫn này chỉ cách tạo PDF từ HTML trong vài + phút.' +og_image_alt: Screenshot of a PDF generated from an HTML file using Python +og_title: Hướng dẫn chuyển HTML sang PDF trong Python – hướng dẫn chi tiết từng bước +schemas: +- author: Aspose + dateModified: '2026-09-19' + description: Learn an html to pdf tutorial in Python that shows how to generate + pdf from html quickly with Aspose.HTML. Follow the step‑by‑step guide now. + headline: How to perform an html to pdf tutorial using Python + type: TechArticle +tags: +- Python +- PDF conversion +- Aspose.HTML +- HTML rendering +title: Cách thực hiện hướng dẫn chuyển HTML sang PDF bằng Python +url: /vi/python/general/how-to-perform-an-html-to-pdf-tutorial-using-python/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Cách thực hiện hướng dẫn html sang pdf bằng Python + +Nếu bạn cần một **html to pdf tutorial**, hướng dẫn này sẽ cho bạn thấy cách tạo PDF từ HTML chỉ với vài dòng mã Python. Dù bạn đang tự động hoá việc tạo báo cáo hay xuất nội dung web để đọc ngoại tuyến, thư viện Aspose.HTML giúp quá trình chuyển đổi trở nên dễ dàng. + +Trong tutorial này bạn sẽ học cách thiết lập môi trường, viết script chuyển đổi, và xử lý các trường hợp đặc biệt như file bị thiếu hoặc cài đặt trang tùy chỉnh. Khi hoàn thành, bạn có thể **how to generate pdf** từ bất kỳ nguồn HTML nào mà không rời khỏi hệ sinh thái Python. + +## Những gì bạn cần + +Trước khi bắt đầu, hãy chắc chắn rằng bạn có: + +* Python 3.8 hoặc mới hơn đã được cài đặt +* Giấy phép Aspose.HTML for Python đang hoạt động (bản dùng thử miễn phí cũng đủ để đánh giá) +* Quyền truy cập `pip` để cài đặt gói `aspose-html` +* Một file HTML đơn giản mà bạn muốn chuyển đổi (ví dụ: `input.html`) + +> **Pro tip:** Giữ HTML và các tài nguyên (hình ảnh, CSS) trong cùng một thư mục để tránh các vấn đề giải quyết đường dẫn trong quá trình chuyển đổi. + +## Bước 1: Cài đặt gói Aspose.HTML + +Mở terminal và chạy lệnh sau: + +```bash +pip install aspose-html +``` + +Gói `aspose-html` wheel đã bao gồm các thư viện gốc cần thiết cho việc render chất lượng cao, vì vậy không cần thêm bất kỳ phụ thuộc hệ thống nào. + +## Bước 2: Tạo một script Python tối thiểu + +Tạo một file mới tên `convert_html_to_pdf.py` và dán đoạn mã dưới đây. Script này tuân theo mẫu **html to pdf tutorial** ba bước: import, định nghĩa đường dẫn, và gọi hàm chuyển đổi. + +```python +# convert_html_to_pdf.py +# ------------------------------------------------- +# Step 1: Import the Converter class from Aspose.HTML +from aspose.html import Converter +import os +import sys + +# Step 2: Define source HTML and destination PDF file paths +# Replace YOUR_DIRECTORY with the folder that contains input.html +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_PATH = os.path.join(BASE_DIR, "input.html") +PDF_PATH = os.path.join(BASE_DIR, "output.pdf") + +# Verify that the HTML file exists before attempting conversion +if not os.path.isfile(HTML_PATH): + sys.exit(f"Error: HTML source file not found at {HTML_PATH}") + +# Step 3: Convert the HTML document to PDF in a single call +try: + # The static method `convert_html` handles rendering and PDF creation + Converter.convert_html(HTML_PATH, PDF_PATH) + print(f"Success: PDF generated at {PDF_PATH}") +except Exception as e: + # Capture any conversion errors (e.g., unsupported CSS, missing fonts) + sys.exit(f"Conversion failed: {e}") +``` + +### Tại sao cách này hoạt động + +* **Import `Converter`** cung cấp cho bạn một API cấp cao giúp ẩn đi chi tiết của engine render. +* **Định nghĩa đường dẫn tuyệt đối** ngăn ngừa lỗi đường dẫn tương đối khi script chạy từ thư mục làm việc khác. +* **`Converter.convert_html`** thực hiện toàn bộ pipeline render — phân tích HTML, bố trí CSS, và tuần tự hoá PDF — trong một lời gọi, đây là cách **how to generate pdf** nhanh nhất và được khuyến nghị. + +## Bước 3: Chạy script và kiểm tra kết quả + +Thực thi script từ terminal: + +```bash +python convert_html_to_pdf.py +``` + +Nếu mọi thứ được thiết lập đúng, bạn sẽ thấy: + +``` +Success: PDF generated at /full/path/YOUR_DIRECTORY/output.pdf +``` + +Mở `output.pdf` bằng bất kỳ trình xem PDF nào. Tài liệu sẽ trông giống hệt trang HTML gốc, bao gồm phông chữ, hình ảnh và kiểu CSS cơ bản. + +![Generated PDF preview](https://example.com/images/pdf-preview.png "Screenshot of generated PDF from HTML using Python"){: .center-image alt="Screenshot of a PDF generated from an HTML file using Python"} + +## Bước 4: Tùy chỉnh quá trình chuyển đổi (tùy chọn) + +**html to pdf tutorial** cơ bản chỉ thực hiện chuyển đổi một‑đối‑một, nhưng trong thực tế thường cần tinh chỉnh: + +| Yêu cầu | Cách thực hiện với Aspose.HTML | +|-------------|------------------------------------| +| Đặt kích thước trang (A4, Letter) | Truyền một đối tượng `PdfSaveOptions` vào `convert_html` | +| Thêm lề hoặc header/footer | Sử dụng `PdfPageSettings` trong các tùy chọn | +| Nhúng phông chữ tùy chỉnh | Đảm bảo các file phông chữ có thể truy cập và thiết lập `FontSettings` | + +Dưới đây là ví dụ đặt kích thước trang thành A4 và thêm lề 1‑inch: + +```python +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit + +# Configure PDF save options +options = PdfSaveOptions() +page_settings = PdfPageSettings() +page_settings.size = PdfPageSettings.PdfPageSize.A4 +page_settings.margin_top = page_settings.margin_bottom = page_settings.margin_left = page_settings.margin_right = LengthUnit.inch(1) + +options.page_settings = page_settings + +# Perform conversion with custom options +Converter.convert_html(HTML_PATH, PDF_PATH, options) +print("PDF with custom page settings generated.") +``` + +> **Note:** Sử dụng các tùy chọn tùy chỉnh là kỹ thuật **generate pdf from html** ưu tiên khi bạn cần kiểm soát chính xác bố cục. + +## Bước 5: Xử lý nhiều file HTML (chuyển đổi hàng loạt) + +Nếu bạn có một thư mục chứa nhiều báo cáo HTML, bạn có thể lặp qua chúng: + +```python +import glob + +html_files = glob.glob(os.path.join(BASE_DIR, "*.html")) + +for html_file in html_files: + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + Converter.convert_html(html_file, pdf_file) + print(f"Converted {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as err: + print(f"Failed to convert {html_file}: {err}") +``` + +Đoạn mã này minh hoạ quy trình **python convert html pdf** có thể mở rộng, phù hợp với pipeline CI hoặc các job được lên lịch. + +## Những lỗi thường gặp và cách tránh + +| Vấn đề | Nguyên nhân | Giải pháp | +|-------|-------|-----| +| Hình ảnh bị thiếu trong PDF | Đường dẫn hình ảnh tương đối bị phá vỡ khi script chạy từ thư mục khác | Sử dụng đường dẫn tuyệt đối hoặc thiết lập `base_uri` trong tùy chọn `Converter` | +| CSS không được áp dụng | Stylesheet bên ngoài được tham chiếu bằng URL cần kết nối internet | Tải stylesheet về máy và tham chiếu bằng đường dẫn tương đối | +| Thay thế phông chữ | Phông chữ không được cài trên máy chủ | Bao gồm file phông trong dự án và cấu hình `FontSettings` | + +Xử lý những trường hợp này giúp quy trình **export html as pdf** của bạn ổn định trên mọi môi trường. + +## Ví dụ đầy đủ, có thể chạy ngay + +Dưới đây là script hoàn chỉnh bao gồm cài đặt tùy chọn, xử lý lỗi, và logic xử lý hàng loạt. Sao chép vào `full_html_to_pdf.py` và chạy như đã mô tả ở trên. + +```python +# full_html_to_pdf.py +# ------------------------------------------------- +from aspose.html import Converter, PdfSaveOptions, PdfPageSettings, LengthUnit +import os +import sys +import glob + +# ------------------------------------------------- +# Configuration +BASE_DIR = os.path.abspath("YOUR_DIRECTORY") +HTML_GLOB = os.path.join(BASE_DIR, "*.html") + +# ------------------------------------------------- +# Helper: create PDF options (A4 page, 1‑inch margins) +def create_options(): + opts = PdfSaveOptions() + pg = PdfPageSettings() + pg.size = PdfPageSettings.PdfPageSize.A4 + pg.margin_top = pg.margin_bottom = pg.margin_left = pg.margin_right = LengthUnit.inch(1) + opts.page_settings = pg + return opts + +# ------------------------------------------------- +def convert_file(html_path, pdf_path, options=None): + if not os.path.isfile(html_path): + raise FileNotFoundError(f"HTML file not found: {html_path}") + + if options: + Converter.convert_html(html_path, pdf_path, options) + else: + Converter.convert_html(html_path, pdf_path) + +# ------------------------------------------------- +def main(): + options = create_options() + for html_file in glob.glob(HTML_GLOB): + pdf_file = os.path.splitext(html_file)[0] + ".pdf" + try: + convert_file(html_file, pdf_file, options) + print(f"✅ Converted: {os.path.basename(html_file)} → {os.path.basename(pdf_file)}") + except Exception as exc: + print(f"❌ Failed: {html_file} – {exc}") + +if __name__ == "__main__": + try: + main() + except Exception as e: + sys.exit(f"Unexpected error: {e}") +``` + +Chạy script này sẽ tạo một PDF cho mỗi file HTML trong thư mục mục tiêu, áp dụng các cài đặt trang đồng nhất — một giải pháp **python convert html pdf** hoàn chỉnh, sẵn sàng cho môi trường production. + +## Kết luận + +Bạn đã có một **html to pdf tutorial** thực tế, cho thấy cách tạo file PDF từ HTML bằng Python và Aspose.HTML. Hướng dẫn đã bao gồm thiết lập môi trường, script chuyển đổi tối thiểu, tùy chỉnh tùy chọn, xử lý hàng loạt và các mẹo khắc phục sự cố. + +Từ đây, bạn có thể khám phá các chủ đề liên quan như **how to generate pdf** với watermark, gộp nhiều PDF, hoặc chuyển HTML sang các định dạng khác như DOCX. Thử nghiệm với API `PdfSaveOptions` để tinh chỉnh đầu ra, và tích hợp script vào dịch vụ web hoặc pipeline báo cáo tự động. + +Chúc lập trình vui vẻ, và tận hưởng việc biến nội dung HTML thành các PDF chuyên nghiệp! + +## Bạn nên học gì tiếp theo? + +Các tutorial sau đây đề cập đến các chủ đề liên quan chặt chẽ, xây dựng trên các kỹ thuật đã được trình bày trong hướng dẫn này. Mỗi tài nguyên bao gồm các ví dụ mã hoàn chỉnh với giải thích chi tiết từng bước, giúp bạn nắm vững các tính năng API bổ sung và khám phá các cách triển khai thay thế trong dự án của mình. + +- [Convert HTML to PDF with Aspose.HTML – Full Step‑by‑Step Guide](/html/english/net/html-extensions-and-conversions/convert-html-to-pdf-with-aspose-html-full-step-by-step-guide/) +- [Convert HTML to PDF with Aspose.HTML – Full Manipulation Guide](/html/english/) +- [How to Convert HTML to PDF Java – Using Aspose.HTML for Java](/html/english/java/conversion-html-to-other-formats/convert-html-to-pdf/) + +{{< /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