From dd0ab67dc6749f505f39e899d641e4f0ac4c8262 Mon Sep 17 00:00:00 2001 From: Muhammad Adil Date: Thu, 23 Jul 2026 18:15:07 +0000 Subject: [PATCH] Add 1 pdf net tutorials MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Categories: document-manipulation Source: AI Search API Tutorials: - Save Updated PDF – Edit PDF Resources with Aspose.Pdf Auto-generated by Professionalize.Tutorials Agent --- .../net/document-manipulation/_index.md | 40 +-- .../_index.md | 263 +++++++++++++++++ .../net/document-manipulation/_index.md | 3 + .../_index.md | 261 +++++++++++++++++ pdf/czech/net/document-manipulation/_index.md | 3 + .../_index.md | 264 +++++++++++++++++ pdf/dutch/net/document-manipulation/_index.md | 3 + .../_index.md | 265 ++++++++++++++++++ .../net/document-manipulation/_index.md | 7 +- .../_index.md | 265 ++++++++++++++++++ .../og-image.png | Bin 0 -> 49060 bytes .../net/document-manipulation/_index.md | 5 +- .../_index.md | 262 +++++++++++++++++ .../net/document-manipulation/_index.md | 5 +- .../_index.md | 260 +++++++++++++++++ pdf/greek/net/document-manipulation/_index.md | 7 +- .../_index.md | 260 +++++++++++++++++ pdf/hindi/net/document-manipulation/_index.md | 12 +- .../_index.md | 263 +++++++++++++++++ .../net/document-manipulation/_index.md | 5 +- .../_index.md | 257 +++++++++++++++++ .../net/document-manipulation/_index.md | 5 +- .../_index.md | 260 +++++++++++++++++ .../net/document-manipulation/_index.md | 5 +- .../_index.md | 264 +++++++++++++++++ .../net/document-manipulation/_index.md | 3 + .../_index.md | 258 +++++++++++++++++ .../net/document-manipulation/_index.md | 5 +- .../_index.md | 258 +++++++++++++++++ .../net/document-manipulation/_index.md | 39 +-- .../_index.md | 257 +++++++++++++++++ .../net/document-manipulation/_index.md | 3 + .../_index.md | 261 +++++++++++++++++ .../net/document-manipulation/_index.md | 5 +- .../_index.md | 259 +++++++++++++++++ .../net/document-manipulation/_index.md | 7 +- .../_index.md | 263 +++++++++++++++++ .../net/document-manipulation/_index.md | 9 +- .../_index.md | 263 +++++++++++++++++ .../net/document-manipulation/_index.md | 3 + .../_index.md | 263 +++++++++++++++++ pdf/thai/net/document-manipulation/_index.md | 15 +- .../_index.md | 263 +++++++++++++++++ .../net/document-manipulation/_index.md | 14 +- .../_index.md | 264 +++++++++++++++++ .../net/document-manipulation/_index.md | 7 +- .../_index.md | 260 +++++++++++++++++ 47 files changed, 6150 insertions(+), 73 deletions(-) create mode 100644 pdf/arabic/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/chinese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/czech/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/dutch/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/english/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/english/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/og-image.png create mode 100644 pdf/french/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/german/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/greek/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/hindi/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/hongkong/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/hungarian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/indonesian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/italian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/japanese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/korean/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/polish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/portuguese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/russian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/spanish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/swedish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/thai/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/turkish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md create mode 100644 pdf/vietnamese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md diff --git a/pdf/arabic/net/document-manipulation/_index.md b/pdf/arabic/net/document-manipulation/_index.md index 1ae9f4b936..32cb2e2c98 100644 --- a/pdf/arabic/net/document-manipulation/_index.md +++ b/pdf/arabic/net/document-manipulation/_index.md @@ -207,7 +207,7 @@ تعلّم كيفية تحديث الروابط برمجيًا في ملفات PDF باستخدام Aspose.PDF لـ .NET. أتمتة تحديثات الروابط بكفاءة من خلال هذا الدليل المفصل. ### [كيفية تحديث لون نص رابط PDF باستخدام Aspose.PDF .NET: دليل شامل](./update-pdf-link-text-color-aspose-net/) -تعرّف على كيفية تغيير لون نص الروابط في ملفات PDF بسهولة باستخدام Aspose.PDF لـ .NET. يغطي هذا الدليل الشامل نصائح التثبيت والتنفيذ والتحسين. +تعرّف على كيفية تغيير لون نص الروابط في ملفات PDF بسهولة باستخدام Aspose.PDF .NET. يغطي هذا الدليل الشامل نصائح التثبيت والتنفيذ والتحسين. ### [إدراج صفحات في ملف PDF باستخدام Aspose.PDF لـ .NET: دليل كامل لمعالجة المستندات](./insert-pages-pdf-aspose-dotnet-guide/) تعرّف على كيفية إدراج صفحات في ملف PDF باستخدام Aspose.PDF لـ .NET. يغطي هذا الدليل التفصيلي كل شيء، من الإعداد إلى التنفيذ، وهو مثالي لمطوري C#. @@ -216,7 +216,7 @@ تعرّف على كيفية إدراج صفحات في ملف PDF باستخدام Aspose.PDF لـ .NET من خلال هذا الدليل المفصل. حسّن سير عمل مستندك بكفاءة. ### [إدراج صفحة فارغة في ملف PDF باستخدام Aspose.PDF .NET: دليل شامل](./aspose-pdf-net-insert-empty-page/) -تعلّم كيفية إدراج صفحات فارغة في مستندات PDF بسهولة باستخدام Aspose.PDF لـ .NET. اتبع هذا الدليل خطوة بخطوة لتحسين مهاراتك في التعامل مع المستندات. +تعلّم كيفية إدراج صفحات فارغة في مستندات PDF بسهولة باستخدام Aspose.PDF .NET. اتبع هذا الدليل خطوة بخطوة لتحسين مهاراتك في التعامل مع المستندات. ### [إتقان أسلوب MakeNUp في Aspose.PDF .NET لإنشاء تخطيطات PDF فعّالة](./aspose-pdf-net-make-nup-method-pdf-layout/) تعلّم كيفية إعادة ترتيب صفحات PDF متعددة بكفاءة إلى تخطيطات جديدة باستخدام أسلوب MakeNUP في Aspose.PDF .NET. مثالي للنشرات الإخبارية والكتيبات والتقارير. @@ -258,19 +258,19 @@ برنامج تعليمي لبرمجة Aspose.PDF Net ### [إتقان عناوين PDF الديناميكية مع الجداول والصور باستخدام Aspose.PDF .NET](./dynamic-pdf-headers-tables-images-aspose-pdf/) -تعلّم كيفية إنشاء عناوين PDF ديناميكية مع جداول وصور باستخدام Aspose.PDF لـ .NET. حسّن تصميم مستندك بسهولة. +تعلّم كيفية إنشاء عناوين PDF ديناميكية مع جداول وصور باستخدام Aspose.PDF .NET. حسّن تصميم مستندك بسهولة. ### [إتقان ربط ملفات PDF باستخدام Aspose.PDF لـ .NET: دليل شامل](./mastering-pdf-concatenation-aspose-net-guide/) تعرّف على كيفية ربط ملفات PDF متعددة بسلاسة باستخدام Aspose.PDF لـ .NET. يغطي هذا الدليل الإعداد والربط ومعالجة الملفات التالفة. ### [إتقان إدارة ملفات PDF: تحديد اتجاه الصفحة واللون والكشف عن المساحات الفارغة بكفاءة باستخدام Aspose.PDF .NET](./aspose-pdf-net-page-orientation-color-blank-detection/) -تعرف على كيفية إدارة مستندات PDF بكفاءة عن طريق تغيير اتجاه الصفحة، واكتشاف اللون الأبيض، وتحديد الصفحات الفارغة باستخدام Aspose.PDF لـ .NET. +تعرف على كيفية إدارة مستندات PDF بكفاءة عن طريق تغيير اتجاه الصفحة، واكتشاف اللون الأبيض، وتحديد الصفحات الفارغة باستخدام Aspose.PDF .NET. -### [إتقان التعامل مع ملفات PDF: دليل شامل لاستخدام Aspose.PDF لـ .NET](./aspose-pdf-net-manipulation-guide/) -تعرّف على كيفية التعامل بكفاءة مع ملفات PDF باستخدام Aspose.PDF لـ .NET. يغطي هذا الدليل كل ما تحتاجه لأتمتة المستندات، بدءًا من الإعداد وحتى الميزات المتقدمة. +### [إتقان التعامل مع ملفات PDF: دليل شامل لاستخدام Aspose.PDF .NET](./aspose-pdf-net-manipulation-guide/) +تعرّف على كيفية التعامل بكفاءة مع ملفات PDF باستخدام Aspose.PDF .NET. يغطي هذا الدليل كل ما تحتاجه لأتمتة المستندات، بدءًا من الإعداد وحتى الميزات المتقدمة. ### [إتقان التعامل مع ملفات PDF: Aspose.PDF .NET للبحث عن التعابير العادية ومعالجة المستندات](./aspose-pdf-net-regex-searching/) -تعرّف على كيفية استخدام Aspose.PDF لـ .NET لتحميل مستندات PDF ومعالجتها وإجراء عمليات بحث عن التعابير العادية فيها. أتمت معالجة مستنداتك بكفاءة. +تعرّف على كيفية استخدام Aspose.PDF .NET لتحميل مستندات PDF ومعالجتها وإجراء عمليات بحث عن التعابير العادية فيها. أتمت معالجة مستنداتك بكفاءة. ### [إتقان تقسيم صفحات PDF باستخدام Aspose.PDF .NET](./mastering-page-splitting-aspose-pdf-net/) برنامج تعليمي لبرمجة Aspose.PDF Net @@ -282,34 +282,36 @@ تعرّف على كيفية نقل حقول نماذج PDF وإعادة وضعها بسهولة باستخدام Aspose.PDF لـ .NET. يغطي هذا الدليل عملية الإعداد، والتعليمات خطوة بخطوة، ونصائح لاستكشاف الأخطاء وإصلاحها. ### [التعامل مع ملفات PDF بسهولة: دليل Aspose.PDF .NET للتحميل والحفظ وتكوين التكبير/التصغير](./master-pdf-manipulation-aspose-dotnet-load-save-configure-page-zoom/) -أتقن التعامل مع ملفات PDF باستخدام Aspose.PDF لـ .NET. تعلّم كيفية تحميل وحفظ واستخراج الأبعاد وضبط إعدادات التكبير والتصغير بكفاءة. +أتقن التعامل مع ملفات PDF باستخدام Aspose.PDF .NET. تعلّم كيفية تحميل وحفظ واستخراج الأبعاد وضبط إعدادات التكبير والتصغير بكفاءة. -### [استبدال أول ظهور للنص في ملف PDF باستخدام Aspose.PDF لـ .NET - دليل شامل](./replace-first-text-occurrence-aspose-pdf-net/) -تعرّف على كيفية استبدال أول نص في ملف PDF باستخدام Aspose.PDF لـ .NET. يغطي هذا الدليل الإعداد، وأمثلة التعليمات البرمجية، والتطبيقات العملية. +### [استبدال أول ظهور للنص في ملف PDF باستخدام Aspose.PDF .NET - دليل شامل](./replace-first-text-occurrence-aspose-pdf-net/) +تعرّف على كيفية استبدال أول نص في ملف PDF باستخدام Aspose.PDF .NET. يغطي هذا الدليل الإعداد، وأمثلة التعليمات البرمجية، والتطبيقات العملية. -### [تغيير حجم محتويات PDF باستخدام Aspose.PDF لـ .NET](./resize-pdf-contents-aspose-pdf-dotnet/) +### [تغيير حجم محتويات PDF باستخدام Aspose.PDF .NET](./resize-pdf-contents-aspose-pdf-dotnet/) برنامج تعليمي لبرمجة Aspose.PDF Net -### [تدوير صفحات PDF واسترداد الأبعاد باستخدام Aspose.PDF لـ .NET](./rotate-pdf-pages-dimensions-aspose-dotnet/) -تعلّم كيفية تدوير صفحات PDF بكفاءة واسترجاع أبعادها باستخدام Aspose.PDF لـ .NET. حسّن مهاراتك في التعامل مع المستندات مع هذا الدليل الشامل. +### [تدوير صفحات PDF واسترداد الأبعاد باستخدام Aspose.PDF .NET](./rotate-pdf-pages-dimensions-aspose-dotnet/) +تعلّم كيفية تدوير صفحات PDF بكفاءة واسترجاع أبعادها باستخدام Aspose.PDF .NET. حسّن مهاراتك في التعامل مع المستندات مع هذا الدليل الشامل. ### [تدوير صفحات PDF باستخدام Aspose.PDF في .NET: دليل المطور](./rotate-pdf-pages-aspose-pdf-dotnet/) -تعرّف على كيفية تدوير صفحات PDF باستخدام Aspose.PDF لـ .NET. يتناول هذا الدليل تدوير صفحات محددة بالدرجات، ويتضمن أمثلة برمجية لمعالجة المستندات بكفاءة. +تعرّف على كيفية تدوير صفحات PDF باستخدام Aspose.PDF .NET. يتناول هذا الدليل تدوير صفحات محددة بالدرجات، ويتضمن أمثلة برمجية لمعالجة المستندات بكفاءة. ### [فصل صفحات PDF من صفحة محددة باستخدام .NET Streams و Aspose.PDF](./split-pdf-pages-with-net-streams-aspose-pdf/) تعرف على كيفية تقسيم ملفات PDF بكفاءة من صفحة معينة باستخدام تدفقات .NET مع Aspose.PDF، مما يعزز إدارة المستندات في تطبيقاتك. ### [تقسيم صفحات PDF إلى ملفات فردية باستخدام Aspose.PDF .NET (برنامج تعليمي C#)](./split-pdf-pages-aspose-net-csharp/) -تعرّف على كيفية تقسيم ملف PDF إلى صفحات منفصلة باستخدام Aspose.PDF لـ .NET وC#. يغطي هذا الدليل الإعداد والتنفيذ والتطبيقات العملية. +تعرّف على كيفية تقسيم ملف PDF إلى صفحات منفصلة باستخدام Aspose.PDF .NET وC#. يغطي هذا الدليل الإعداد والتنفيذ والتطبيقات العملية. -### [تقسيم صفحات PDF إلى ملفات منفصلة باستخدام Aspose.PDF لـ .NET: دليل شامل](./aspose-pdf-split-pdf-pages-net/) -تعرّف على كيفية تقسيم صفحات PDF إلى ملفات منفصلة باستخدام Aspose.PDF لـ .NET. يغطي هذا الدليل الشامل نصائح الإعداد والتنفيذ والتحسين. +### [تقسيم صفحات PDF إلى ملفات منفصلة باستخدام Aspose.PDF .NET: دليل شامل](./aspose-pdf-split-pdf-pages-net/) +تعرّف على كيفية تقسيم صفحات PDF إلى ملفات منفصلة باستخدام Aspose.PDF .NET. يغطي هذا الدليل الشامل نصائح الإعداد والتنفيذ والتحسين. ### [تقسيم وإنشاء ملفات PDF باستخدام Aspose.PDF .NET | دليل معالجة المستندات](./split-create-pdf-aspose-pdf-net/) -تعلّم كيفية تقسيم ملفات PDF متعددة الصفحات وإنشاء ملفات PDF جديدة باستخدام Aspose.PDF لـ .NET. اتبع هذا الدليل الشامل مع أمثلة برمجية. +تعلّم كيفية تقسيم ملفات PDF متعددة الصفحات وإنشاء ملفات PDF جديدة باستخدام Aspose.PDF .NET. اتبع هذا الدليل الشامل مع أمثلة برمجية. ### [الدليل الشامل لمعالجة ملفات PDF باستخدام Aspose.PDF .NET: تحميل وحفظ واستبدال النص بكفاءة](./master-pdf-manipulation-aspose-pdf-net/) -تعلّم كيفية إتقان معالجة ملفات PDF باستخدام Aspose.PDF لـ .NET. يغطي هذا الدليل تحميل النصوص وحفظها واستبدالها في ملفات PDF، وهو مثالي للمطورين الباحثين عن الكفاءة. +تعلّم كيفية إتقان معالجة ملفات PDF باستخدام Aspose.PDF .NET. يغطي هذا الدليل تحميل النصوص وحفظها واستبدالها في ملفات PDF، وهو مثالي للمطورين الباحثين عن الكفاءة. + +### [حفظ ملف PDF محدث – تحرير موارد PDF باستخدام Aspose.Pdf](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) ## موارد إضافية diff --git a/pdf/arabic/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/arabic/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..9b59d4e42f --- /dev/null +++ b/pdf/arabic/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-07-23 +description: احفظ ملف PDF المحدث باستخدام Aspose.Pdf في C#. تعلم كيفية تعديل موارد + PDF مثل ExtGState وإنشاء ملف جديد في بضع خطوات فقط. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: ar +lastmod: 2026-07-23 +og_description: احفظ ملف PDF المحدث باستخدام Aspose.Pdf في C#. يوضح هذا الدرس كيفية + تعديل موارد PDF، إضافة حالة رسومية، وإنتاج ملف جديد. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: حفظ ملف PDF المحدث – تعديل موارد PDF باستخدام Aspose.Pdf (دليل C#) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: حفظ ملف PDF المحدث – تحرير موارد PDF باستخدام Aspose.Pdf +url: /ar/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# حفظ PDF محدث – تعديل موارد PDF باستخدام Aspose.Pdf + +هل تساءلت يومًا كيف **تحفظ PDF محدث** بعد تعديل كائناته منخفضة المستوى؟ ربما تحتاج إلى تغيير الشفافية، أو أوضاع المزج، أو معلمات رسومية أخرى دون إعادة إنشاء المستند بالكامل. باختصار، تريد **تعديل موارد PDF** مباشرة. يشرح هذا الدليل ذلك بالضبط، باستخدام Aspose.Pdf لـ .NET. + +سنبدأ بتحميل PDF موجود، نتعمق في قاموس الموارد الخاص به، نضيف حالة رسومية جديدة، وأخيرًا **نحفظ PDF المحدث**. في النهاية ستحصل على مقتطف C# يمكنك إدراجه في أي مشروع—بدون تبعيات غامضة، مجرد كود نقي. + +## ما ستتعلمه + +- كيفية فتح PDF باستخدام Aspose.Pdf وتحديد قاموس موارد الصفحة الأولى. +- الخطوات لـ **تعديل موارد PDF** مثل قاموس `ExtGState`. +- إنشاء وإدراج حالة رسومية مخصصة (`GS0`) تتحكم في شفافية الخط/الملء ووضع المزج. +- كيفية **حفظ PDF المحدث** إلى ملف جديد، مع الحفاظ على كل المحتوى الأصلي. + +**المتطلبات المسبقة**: .NET 6+ (أو .NET Framework 4.6+)، رخصة أو نسخة تجريبية من Aspose.Pdf، ومعرفة أساسية بـ C#. إذا لم تتعامل من قبل مع PDF على مستوى القاموس، لا تقلق—هذا الدليل يشرح “السبب” وراء كل استدعاء. + +--- + +![Diagram of PDF resource editing](image.png){.align-center alt="مخطط يوضح كيفية تعديل موارد PDF ثم حفظ PDF محدث"} + +## حفظ PDF محدث – نظرة عامة على سير العمل الكامل + +قبل أن ننتقل إلى الكود، لنوضح التدفق عالي المستوى: + +1. **تحميل** ملف PDF المصدر. +2. **الحصول** على الصفحة الأولى وقاموس `Resources` الخاص بها. +3. **التنقل** إلى القاموس الفرعي `ExtGState` حيث تعيش حالات الرسومات. +4. **إنشاء** `CosPdfDictionary` جديد يصف حالتنا الرسومية المخصصة. +5. **إدراج** هذا القاموس مرة أخرى في `ExtGState` تحت مفتاح فريد (`GS0`). +6. **حفظ** المستند المعدل كملف جديد. + +هذا كل شيء—ست خطوات صغيرة، كل واحدة منها في بضع أسطر من C#. جاهز؟ هيا نبدأ. + +## الخطوة 1: تحميل مستند PDF + +فتح ملف هو أبسط جزء. فئة `Document` في Aspose.Pdf تقبل مسارًا أو تدفقًا، لذا يمكنك توجيهها إلى أي PDF موجود. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **لماذا نستخدم كتلة `using`؟** +> فهي تضمن تحرير مقبض الملف بمجرد الانتهاء، مما يمنع مشاكل القفل عندما نحاول لاحقًا **حفظ PDF المحدث**. + +## الخطوة 2: تعديل موارد PDF – الوصول إلى قاموس ExtGState + +كل صفحة في PDF لديها *قاموس موارد* يجمع الخطوط، الصور، وحالات الرسومات. لتغيير الشفافية أو وضع المزج نحتاج إلى إدخال `ExtGState`. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **نصيحة احترافية:** ليست كل ملفات PDF تحتوي على إدخال `ExtGState` بشكل افتراضي. يضمن الشرط أعلاه أننا لا نرمي استثناء `KeyNotFoundException` ولا يزال يسمح لنا **بتعديل موارد PDF** بأمان. + +## الخطوة 3: إنشاء قاموس حالة رسومية جديد + +حالة الرسومات (`GS`) هي أساسًا مجموعة من أزواج المفتاح‑القيمة التي يستشيرها مُعالج PDF قبل الرسم. هنا سنحدد شفافية الخط (`CA`)، شفافية الملء (`ca`)، ووضع المزج (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **لماذا هذه المفاتيح؟** +> - `CA` يتحكم في شفافية **الخط**، ويؤثر على الخطوط والحدود. +> - `ca` يتحكم في شفافية **الملء**, ويؤثر على الأشكال وملء النصوص. +> - `BM` يحدد وضع المزج؛ “Normal” هو الأكثر شيوعًا لكن هناك بدائل مثل “Multiply” للتأثيرات الإبداعية. + +## الخطوة 4: إدراج حالة الرسومات الجديدة في ExtGState + +الآن بعد أن أصبح لدينا قاموس جاهز، نضيفه ببساطة تحت اسم جديد (`GS0`). يجب أن يكون الاسم فريدًا داخل مجموعة `ExtGState` للصفحة. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +إذا احتجت لاحقًا إلى الإشارة إلى هذه الحالة من تدفقات المحتوى، ستستخدم `/GS0` في عمليات PDF مثل `gs`. لغرض هذا الدرس، مجرد إضافتها يكفي لتوضيح **تعديل موارد PDF**. + +## الخطوة 5: التحقق (اختياري) وحفظ PDF المحدث + +في هذه المرحلة تغير الهيكل الداخلي للـ PDF، لكن المظهر البصري لن يختلف حتى تقوم فعليًا بالإشارة إلى `GS0`. مع ذلك، يمكننا **حفظ PDF المحدث** وتفقد شجرة الكائنات باستخدام عارض PDF أو أداة مثل `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **ما المتوقع:** +> - `output.pdf` سيكون نسخة مطابقة بايت‑ل‑بايت من `input.pdf` مع إضافة إدخال `ExtGState` الجديد. +> - فتح الملف في محرر نصوص (أو باستخدام أداة فحص PDF) سيظهر كائنًا جديدًا مثل: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> داخل قاموس `ExtGState`، المفتاح هو `/GS0`. + +إذا أردت رؤية التأثير عمليًا، أضف تدفق محتوى بسيط يستخدم حالة الرسومات الجديدة: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +تشغيل المقتطف الاختياري سيعطيك مستطيلًا شفافًا بنسبة 50 %، مؤكدًا أن حالة الرسومات تعمل كما هو متوقع. + +--- + +## أسئلة شائعة وحالات حافة + +**س: ماذا لو كان PDF يحتوي بالفعل على إدخال `GS0`؟** +ج: طريقة `Add` ستستبدل المفتاح الموجود. لتجنب التصادمات، أنشئ اسمًا فريدًا (مثل `GS1`، `GS_custom`) أو تحقق أولًا بـ `extGState.ContainsKey("GS0")`. + +**س: هل يمكنني تعديل أنواع موارد أخرى، مثل الخطوط أو XObjects؟** +ج: بالتأكيد. يعمل `DictionaryEditor` مع أي مفتاح مورد من المستوى الأعلى (`Font`, `XObject`, `ColorSpace`, إلخ). فقط استبدل `"ExtGState"` باسم القاموس المطلوب. + +**س: هل يعمل هذا النهج مع ملفات PDF مشفرة؟** +ج: إذا كان PDF محميًا بكلمة مرور، يجب توفير كلمة المرور عند إنشاء كائن `Document`: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +بعد فك التشفير يمكنك تعديل الموارد بنفس الطريقة. + +**س: هل سيزداد حجم الملف بشكل ملحوظ؟** +ج: إضافة قاموس صغير كهذا عادةً ما يضيف بضع مئات من البايتات فقط. إذا أضفت XObjects كبيرة أو دمجت صورًا، توقع زيادة أكبر. + +--- + +## الخلاصة + +أنت الآن تعرف كيف **تحفظ PDF محدث** بعد **تعديل موارد PDF** مباشرة باستخدام Aspose.Pdf. العملية تتلخص في تحميل المستند، تحديد قاموس `ExtGState`، إنشاء حالة رسومية جديدة، إدراجها، وأخيرًا حفظ النتيجة. من هنا يمكنك تجربة تعديل أنواع موارد أخرى، ربط حالات رسومية متعددة، أو بناء طريقة مساعدة لإجراء تعديلات جماعية. + +الخطوات التالية؟ جرّب تغيير وضع المزج إلى `"Multiply"` أو `"Screen"` ولاحظ كيف تتصرف الكائنات المتداخلة. أو استكشف تعديل قاموس `Font` لتضمين خطوط مخصصة في الوقت الفعلي. مواصفات PDF غنية، وAspose.Pdf يمنحك + +## ما الذي يجب أن تتعلمه بعد ذلك؟ + +الدروس التالية تغطي مواضيع ذات صلة وثيقة تبني على التقنيات الموضحة في هذا الدليل. كل مورد يتضمن أمثلة شاملة مع شروحات خطوة بخطوة لمساعدتك على إتقان ميزات API إضافية واستكشاف نهج تنفيذ بديلة في مشاريعك. + +- [Aspose Pdf Net Open Modify Save Pdfs](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [How to Extract & Save Specific PDF Pages Using Aspose.PDF for .NET - A Comprehensive Guide](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [How to Add File Attachment Annotations in PDFs Using Aspose.PDF for .NET | Step-by-Step Guide](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/chinese/net/document-manipulation/_index.md b/pdf/chinese/net/document-manipulation/_index.md index fed7186bc5..79d2ac34bf 100644 --- a/pdf/chinese/net/document-manipulation/_index.md +++ b/pdf/chinese/net/document-manipulation/_index.md @@ -311,6 +311,9 @@ Aspose.PDF Net 代码教程 ### [使用 Aspose.PDF .NET 进行 PDF 操作的终极指南:高效加载、保存和替换文本](./master-pdf-manipulation-aspose-pdf-net/) 学习如何使用 Aspose.PDF for .NET 掌握 PDF 操作。本指南涵盖 PDF 中的文本加载、保存和替换,非常适合追求效率的开发人员。 +### [保存已更新的 PDF – 使用 Aspose.Pdf 编辑 PDF 资源](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +了解如何使用 Aspose.Pdf 在 .NET 中保存已编辑的 PDF 并管理相关资源。 + ## 其他资源 - [Aspose.PDF 用于网络文档](https://docs.aspose.com/pdf/net/) diff --git a/pdf/chinese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/chinese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..edb8fa91e7 --- /dev/null +++ b/pdf/chinese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,261 @@ +--- +category: general +date: 2026-07-23 +description: 使用 Aspose.Pdf 在 C# 中保存更新的 PDF。了解如何编辑 PDF 资源(如 ExtGState),并仅需几步即可生成新文件。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: zh +lastmod: 2026-07-23 +og_description: 使用 Aspose.Pdf 在 C# 中保存更新的 PDF。本教程展示了如何编辑 PDF 资源、添加图形状态并输出全新的文件。 +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: 保存已更新的 PDF – 使用 Aspose.Pdf 编辑 PDF 资源(C# 指南) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: 保存已更新的 PDF – 使用 Aspose.Pdf 编辑 PDF 资源 +url: /zh/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 保存更新的 PDF – 使用 Aspose.Pdf 编辑 PDF 资源 + +是否曾想过在修改 PDF 的底层对象后 **保存更新的 PDF**?也许你需要更改不透明度、混合模式或其他图形参数,而不必重新创建整个文档。简而言之,你想要直接 **编辑 PDF 资源**。本指南将手把手教你如何使用 Aspose.Pdf for .NET 完成此操作。 + +我们将从加载已有的 PDF 开始,深入其资源字典,注入一个新的图形状态,最后 **保存更新的 PDF**。阅读完本教程后,你将拥有一段可以直接放入任意项目的 C# 示例代码——无需神秘的依赖,仅仅是纯代码。 + +## 你将学到 + +- 如何使用 Aspose.Pdf 打开 PDF 并定位第一页的资源字典。 +- 编辑 `ExtGState` 字典等 **PDF 资源** 的步骤。 +- 创建并插入自定义图形状态 (`GS0`),以控制描边/填充不透明度和混合模式。 +- 如何 **保存更新的 PDF** 为新文件,保留所有原始内容。 + +**先决条件**:.NET 6+(或 .NET Framework 4.6+)、Aspose.Pdf 的许可证或评估版,以及对 C# 的基本了解。如果你从未在字典层面操作过 PDF,也无需担心——本教程会解释每一步背后的 “为什么”。 + +--- + +![编辑 PDF 资源的示意图](image.png){.align-center alt="展示如何编辑 PDF 资源并保存更新的 PDF 的示意图"} + +## 保存更新的 PDF – 完整工作流概览 + +在进入代码之前,先梳理一下高层流程: + +1. **加载** 源 PDF。 +2. **获取** 第一本页及其 `Resources` 字典。 +3. **定位** 存放图形状态的 `ExtGState` 子字典。 +4. **创建** 描述我们自定义图形状态的 `CosPdfDictionary`。 +5. **将** 该字典以唯一键 (`GS0`) 插入 `ExtGState`。 +6. **保存** 修改后的文档为新文件。 + +就这么简单——六个小步骤,每个步骤只需几行 C#。准备好了吗?开始吧。 + +## 步骤 1:加载 PDF 文档 + +打开文件是最简单的部分。Aspose.Pdf 的 `Document` 类接受路径或流,因此你可以指向任意已有的 PDF。 + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **为什么使用 `using` 块?** +> 它确保文件句柄在我们完成后立即释放,防止在随后 **保存更新的 PDF** 时出现锁定问题。 + +## 步骤 2:编辑 PDF 资源 – 访问 ExtGState 字典 + +每个 PDF 页面都有一个 *资源字典*,用于组织字体、图像和图形状态。要更改不透明度或混合模式,需要操作 `ExtGState` 条目。 + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **专业提示:** 并非所有 PDF 默认都包含 `ExtGState` 条目。上面的条件块可防止抛出 `KeyNotFoundException`,并且仍然能够安全地 **编辑 PDF 资源**。 + +## 步骤 3:创建新的图形状态字典 + +图形状态 (`GS`) 本质上是一组键‑值对,PDF 渲染器在绘制前会查询这些信息。这里我们将定义描边不透明度 (`CA`)、填充不透明度 (`ca`) 和混合模式 (`BM`)。 + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **为什么使用这些键?** +> - `CA` 控制 **描边** 不透明度,影响线条和边框。 +> - `ca` 控制 **填充** 不透明度,影响形状和文字填充。 +> - `BM` 选择混合模式;“Normal” 是最常用的,亦可使用 “Multiply”等创意效果。 + +## 步骤 4:将新图形状态插入 ExtGState + +现在我们已经准备好字典,只需将其以新名称 (`GS0`) 添加进去。该名称在页面的 `ExtGState` 集合中必须唯一。 + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +如果以后需要在内容流中引用此状态,只需在 PDF 操作符如 `gs` 中使用 `/GS0`。本教程仅演示 **编辑 PDF 资源**,因此只需添加即可。 + +## 步骤 5:验证(可选)并保存更新的 PDF + +此时 PDF 的内部结构已经改变,但在实际引用 `GS0` 之前,视觉效果不会有差异。我们仍然可以 **保存更新的 PDF**,并使用 PDF 查看器或 `pdfcpu` 等工具检查对象树。 + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **预期结果:** +> - `output.pdf` 将是 `input.pdf` 的逐字节拷贝,并额外包含新的 `ExtGState` 条目。 +> - 用文本编辑器打开(或使用 PDF 检查工具)会看到类似如下的新对象: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> 位于 `ExtGState` 字典下,键为 `/GS0`。 + +如果想看到实际效果,可添加一个使用新图形状态的简单内容流: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +运行可选代码片段后,你会得到一个 50 % 透明的矩形,验证图形状态已生效。 + +--- + +## 常见问题与边缘情况 + +**Q: 如果 PDF 已经有 `GS0` 条目怎么办?** +A: `Add` 方法会覆盖已有键。为避免冲突,可生成唯一名称(例如 `GS1`、`GS_custom`),或先检查 `extGState.ContainsKey("GS0")`。 + +**Q: 能否编辑其他资源类型,如字体或 XObject?** +A: 完全可以。`DictionaryEditor` 适用于任何顶层资源键(`Font`、`XObject`、`ColorSpace` 等)。只需将 `"ExtGState"` 替换为目标字典名称。 + +**Q: 这种方法能用于加密的 PDF 吗?** +A: 若 PDF 受密码保护,构造 `Document` 对象时必须提供密码: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +解密后即可像前面一样编辑资源。 + +**Q: 文件大小会显著增加吗?** +A: 添加如此小的字典通常只会增加几百字节。若加入大型 XObject 或嵌入图像,则会有更明显的增长。 + +--- + +## 结论 + +现在,你已经掌握了在使用 Aspose.Pdf 直接 **编辑 PDF 资源** 后 **保存更新的 PDF** 的完整流程。整个过程归结为:加载文档、定位 `ExtGState` 字典、构造新图形状态、插入并持久化结果。接下来,你可以尝试编辑其他资源类型、链式使用多个图形状态,或编写可批量修改的帮助方法。 + +后续建议?尝试将混合模式改为 `"Multiply"` 或 `"Screen"`,观察重叠对象的表现。或者探索编辑 `Font` 字典,以在运行时嵌入自定义字体。PDF 规范非常丰富,Aspose.Pdf 为你提供了强大的操作能力。 + +## 接下来该学习什么? + +以下教程与本指南紧密相关,帮助你进一步掌握相关技术。每篇资源都包含完整可运行的代码示例和逐步解释,助你在项目中灵活运用更多 API 功能或探索替代实现方案。 + +- [Aspose Pdf Net Open Modify Save Pdfs](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [How to Extract & Save Specific PDF Pages Using Aspose.PDF for .NET - A Comprehensive Guide](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [How to Add File Attachment Annotations in PDFs Using Aspose.PDF for .NET | Step-by-Step Guide](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/czech/net/document-manipulation/_index.md b/pdf/czech/net/document-manipulation/_index.md index 609447a6d4..1f96197852 100644 --- a/pdf/czech/net/document-manipulation/_index.md +++ b/pdf/czech/net/document-manipulation/_index.md @@ -311,6 +311,9 @@ Naučte se, jak rozdělovat vícestránkové PDF soubory a vytvářet nové PDF ### [Ultimátní průvodce manipulací s PDF pomocí Aspose.PDF .NET: Efektivní načítání, ukládání a nahrazování textu](./master-pdf-manipulation-aspose-pdf-net/) Naučte se, jak zvládnout manipulaci s PDF pomocí Aspose.PDF pro .NET. Tato příručka se zabývá načítáním, ukládáním a nahrazováním textu v PDF souborech, což je ideální pro vývojáře, kteří hledají efektivitu. +### [Uložení aktualizovaného PDF – úprava PDF zdrojů pomocí Aspose.PDF](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Naučte se, jak uložit změny v PDF a upravit jeho zdroje pomocí Aspose.PDF. + ## Další zdroje - [Aspose.PDF pro síťovou dokumentaci](https://docs.aspose.com/pdf/net/) diff --git a/pdf/czech/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/czech/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..4a595b6bcb --- /dev/null +++ b/pdf/czech/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,264 @@ +--- +category: general +date: 2026-07-23 +description: Uložte aktualizovaný PDF pomocí Aspose.Pdf v C#. Naučte se upravovat + PDF zdroje, jako je ExtGState, a vytvořit nový soubor během několika kroků. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: cs +lastmod: 2026-07-23 +og_description: Uložte aktualizovaný PDF pomocí Aspose.Pdf v C#. Tento tutoriál ukazuje, + jak upravit zdroje PDF, přidat grafický stav a vytvořit nový soubor. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Uložte aktualizovaný PDF – upravte PDF zdroje pomocí Aspose.Pdf (průvodce + C#) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Uložit aktualizovaný PDF – Upravit PDF zdroje pomocí Aspose.Pdf +url: /cs/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Uložte aktualizovaný PDF – Úprava PDF zdrojů pomocí Aspose.Pdf + +Už jste se někdy zamýšleli, jak **uložit aktualizovaný PDF** po úpravě jeho nízkoúrovňových objektů? Možná potřebujete změnit neprůhlednost, režimy prolnutí nebo jiné grafické parametry, aniž byste museli znovu vytvářet celý dokument. Jinými slovy, chcete **přímo upravit PDF zdroje**. Tento průvodce vás provede právě tím, pomocí Aspose.Pdf pro .NET. + +Začneme načtením existujícího PDF, ponoříme se do jeho slovníku zdrojů, vložíme nový grafický stav a nakonec **uložíme aktualizovaný PDF**. Na konci budete mít funkční úryvek C#, který můžete vložit do libovolného projektu – žádné tajemné závislosti, jen čistý kód. + +## Co se naučíte + +- Jak otevřít PDF pomocí Aspose.Pdf a najít slovník zdrojů první stránky. +- Kroky k **úpravě PDF zdrojů** jako je slovník `ExtGState`. +- Vytvoření a vložení vlastního grafického stavu (`GS0`), který řídí neprůhlednost tahů/výplní a režim prolnutí. +- Jak **uložit aktualizovaný PDF** do nového souboru, přičemž zachová veškerý původní obsah. + +**Požadavky**: .NET 6+ (nebo .NET Framework 4.6+), licence nebo evaluační kopie Aspose.Pdf a základní znalost C#. Pokud jste se ještě nedotkli PDF na úrovni slovníku, nebojte se – tento tutoriál vysvětluje „proč“ za každým voláním. + +--- + +![Diagram of PDF resource editing](image.png){.align-center alt="Diagram showing how to edit PDF resources and then save updated PDF"} + +## Uložte aktualizovaný PDF – Přehled celého pracovního postupu + +Než se pustíme do kódu, shrňme si vysokou úroveň postupu: + +1. **Načíst** zdrojové PDF. +2. **Získat** první stránku a její slovník `Resources`. +3. **Přejít** do podslovníku `ExtGState`, kde žijí grafické stavy. +4. **Vytvořit** nový `CosPdfDictionary`, který popisuje náš vlastní grafický stav. +5. **Vložit** tento slovník zpět do `ExtGState` pod jedinečný klíč (`GS0`). +6. **Uložit** upravený dokument jako nový soubor. + +A to je vše – šest drobných kroků, každý zabalený do několika řádků C#. Připravení? Jdeme na to. + +## Krok 1: Načtení PDF dokumentu + +Otevření souboru je nejjednodušší část. Třída `Document` z Aspose.Pdf přijímá cestu nebo stream, takže můžete ukázat na libovolný existující PDF. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Proč blok `using`?** +> Zaručuje, že souborový handle je uvolněn hned po dokončení, čímž se předejde zamykacím problémům při následném **uložení aktualizovaného PDF**. + +## Krok 2: Úprava PDF zdrojů – Přístup ke slovníku ExtGState + +Každá stránka v PDF má *slovník zdrojů*, který seskupuje písma, obrázky a grafické stavy. Pro změnu neprůhlednosti nebo režimu prolnutí potřebujeme položku `ExtGState`. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Tip:** Ne všechny PDF obsahují položku `ExtGState` ve výchozím nastavení. Podmíněný blok výše zajišťuje, že nedojde k `KeyNotFoundException`, a přesto nám umožní **bezpečně upravit PDF zdroje**. + +## Krok 3: Vytvoření nového slovníku grafického stavu + +Grafický stav (`GS`) je v podstatě sada klíč‑hodnota párů, které PDF renderer používá před vykreslením. Zde definujeme neprůhlednost tahu (`CA`), neprůhlednost výplně (`ca`) a režim prolnutí (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Proč tyto klíče?** +> - `CA` řídí **neprůhlednost tahu**, ovlivňuje čáry a okraje. +> - `ca` řídí **neprůhlednost výplně**, ovlivňuje tvary a výplně textu. +> - `BM` vybírá režim prolnutí; „Normal“ je nejčastější, ale existují i alternativy jako „Multiply“ pro kreativní efekty. + +## Krok 4: Vložení nového grafického stavu do ExtGState + +Jakmile máme připravený slovník, jednoduše jej přidáme pod nový název (`GS0`). Název musí být jedinečný v rámci kolekce `ExtGState` stránky. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Pokud později budete chtít tento stav odkazovat z obsahových toků, použijete `/GS0` v PDF operátorech jako `gs`. Pro účely tohoto tutoriálu stačí jen jeho přidání, aby se demonstrovala **úprava PDF zdrojů**. + +## Krok 5: Ověření (volitelné) a uložení aktualizovaného PDF + +V tuto chvíli se vnitřní struktura PDF změnila, ale vizuální výstup se liší až po skutečném odkazu na `GS0`. Přesto můžeme **uložit aktualizovaný PDF** a prozkoumat strom objektů pomocí PDF prohlížeče nebo nástroje jako `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **Co očekávat:** +> - `output.pdf` bude bajt‑po‑bájtu kopií `input.pdf` s přidanou položkou `ExtGState`. +> - Otevřením souboru v textovém editoru (nebo pomocí inspekčního nástroje) uvidíte nový objekt jako: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> pod slovníkem `ExtGState`, klíčovaný jako `/GS0`. + +Chcete‑li vidět efekt v praxi, přidejte jednoduchý obsahový tok, který použije nový grafický stav: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Spuštěním volitelného úryvku získáte 50 % průhledný obdélník, což potvrdí, že grafický stav funguje podle očekávání. + +--- + +## Často kladené otázky a okrajové případy + +**Q: Co když PDF už obsahuje položku `GS0`?** +A: Metoda `Add` přepíše existující klíč. Pro zabránění kolizím vygenerujte jedinečný název (např. `GS1`, `GS_custom`) nebo nejprve zkontrolujte `extGState.ContainsKey("GS0")`. + +**Q: Můžu upravit i jiné typy zdrojů, jako písma nebo XObjecty?** +A: Rozhodně. `DictionaryEditor` funguje pro jakýkoli vrcholový klíč zdrojů (`Font`, `XObject`, `ColorSpace` atd.). Stačí nahradit `"ExtGState"` požadovaným názvem slovníku. + +**Q: Funguje tento přístup i s šifrovanými PDF?** +A: Pokud je PDF chráněno heslem, musíte heslo předat při konstrukci objektu `Document`: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Po dešifrování můžete zdroje upravovat stejným způsobem. + +**Q: Zvýší se velikost souboru výrazně?** +A: Přidání malého slovníku obvykle přidá jen několik stovek bajtů. Pokud přidáte velké XObjecty nebo vložíte obrázky, očekávejte větší nárůst. + +--- + +## Závěr + +Nyní víte, jak **uložit aktualizovaný PDF** po **přímé úpravě PDF zdrojů** pomocí Aspose.Pdf. Proces se snižuje na načtení dokumentu, nalezení slovníku `ExtGState`, vytvoření nového grafického stavu, jeho vložení a nakonec uložení výsledku. Odtud můžete experimentovat s dalšími typy zdrojů, řetězit více grafických stavů nebo vytvořit znovupoužitelnou pomocnou metodu pro hromadné úpravy. + +Další kroky? Zkuste změnit režim prolnutí na `"Multiply"` nebo `"Screen"` a podívejte se, jak se chovají překrývající se objekty. Nebo prozkoumejte úpravu slovníku `Font` pro dynamické vložení vlastních písem. Specifikace PDF je bohatá a Aspose.Pdf vám dává moc. + +## 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 vlastních projektech. + +- [Aspose Pdf Net Otevřít Upravit Uložit PDF](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [Jak extrahovat a uložit konkrétní stránky PDF pomocí Aspose.PDF pro .NET – Kompletní průvodce](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [Jak přidat anotace příloh souborů do PDF pomocí Aspose.PDF pro .NET | Krok za krokem](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/dutch/net/document-manipulation/_index.md b/pdf/dutch/net/document-manipulation/_index.md index cd05fdffaf..42c9f960de 100644 --- a/pdf/dutch/net/document-manipulation/_index.md +++ b/pdf/dutch/net/document-manipulation/_index.md @@ -311,6 +311,9 @@ Leer hoe u PDF's met meerdere pagina's kunt splitsen en nieuwe PDF-bestanden kun ### [Ultieme gids voor PDF-manipulatie met Aspose.PDF .NET: tekst efficiënt laden, opslaan en vervangen](./master-pdf-manipulation-aspose-pdf-net/) Leer hoe je PDF-bewerking onder de knie krijgt met Aspose.PDF voor .NET. Deze handleiding behandelt het laden, opslaan en vervangen van tekst in PDF's, ideaal voor ontwikkelaars die op zoek zijn naar efficiëntie. +### [Bijgewerkte PDF opslaan – PDF-bronnen bewerken met Aspose.Pdf](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Leer hoe u een bewerkte PDF opslaat en PDF-bronnen bijwerkt met Aspose.Pdf in .NET. + ## Aanvullende bronnen - [Aspose.PDF voor Netdocumentatie](https://docs.aspose.com/pdf/net/) diff --git a/pdf/dutch/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/dutch/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..7e3701a90b --- /dev/null +++ b/pdf/dutch/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,265 @@ +--- +category: general +date: 2026-07-23 +description: Sla de bijgewerkte PDF op met Aspose.Pdf in C#. Leer hoe je PDF‑resources + zoals ExtGState kunt bewerken en in slechts een paar stappen een nieuw bestand kunt + maken. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: nl +lastmod: 2026-07-23 +og_description: Sla de bijgewerkte PDF op met Aspose.Pdf in C#. Deze tutorial laat + zien hoe je PDF‑resources bewerkt, een graphics state toevoegt en een nieuw bestand + genereert. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Bijgewerkte PDF opslaan – PDF‑bronnen bewerken met Aspose.Pdf (C#‑gids) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Bijgewerkte PDF opslaan – PDF‑bronnen bewerken met Aspose.Pdf +url: /nl/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Bijgewerkte PDF opslaan – PDF‑bronnen bewerken met Aspose.Pdf + +Heb je je ooit afgevraagd hoe je een **bijgewerkte PDF** kunt **opslaan** nadat je de low‑level objecten hebt aangepast? Misschien moet je de opacity, blend modes of andere grafische parameters wijzigen zonder het hele document opnieuw te maken. Kortom, je wilt de **PDF‑bronnen** direct **bewerken**. Deze gids leidt je stap voor stap door dat proces, met behulp van Aspose.Pdf voor .NET. + +We beginnen met het laden van een bestaande PDF, duiken in de resource‑dictionary, voegen een nieuwe graphics state toe, en slaan tenslotte de **bijgewerkte PDF** op. Aan het einde heb je een werkende C#‑snippet die je in elk project kunt gebruiken—geen mysterieuze afhankelijkheden, alleen pure code. + +## Wat je zult leren + +- Hoe je een PDF opent met Aspose.Pdf en de resource‑dictionary van de eerste pagina vindt. +- De stappen om **PDF‑bronnen** te **bewerken**, zoals de `ExtGState`‑dictionary. +- Een aangepaste graphics state (`GS0`) maken en invoegen die de lijn‑/vullings‑opacity en blend‑mode regelt. +- Hoe je de **bijgewerkte PDF** opslaat naar een nieuw bestand, waarbij alle originele inhoud behouden blijft. + +**Voorvereisten**: .NET 6+ (of .NET Framework 4.6+), een licentie of evaluatie‑kopie van Aspose.Pdf, en een basiskennis van C#. Als je nog nooit een PDF op dictionary‑niveau hebt aangeraakt, maak je geen zorgen—deze tutorial legt het “waarom” achter elke aanroep uit. + +--- + +![Diagram van PDF‑resourcebewerking](image.png){.align-center alt="Diagram dat laat zien hoe PDF‑bronnen te bewerken en vervolgens de bijgewerkte PDF op te slaan"} + +## Bijgewerkte PDF opslaan – Overzicht van volledige workflow + +Voordat we in de code duiken, laten we de hoog‑niveau stroom schetsen: + +1. **Laad** de bron‑PDF. +2. **Pak** de eerste pagina en de `Resources`‑dictionary. +3. **Navigeer** naar de `ExtGState`‑sub‑dictionary waar graphics states zich bevinden. +4. **Maak** een nieuwe `CosPdfDictionary` die onze aangepaste graphics state beschrijft. +5. **Voeg** die dictionary terug in `ExtGState` onder een unieke sleutel (`GS0`). +6. **Sla** het gewijzigde document op als een nieuw bestand. + +Dat is alles—zes kleine stappen, elk ingekapseld in een paar regels C#. Klaar? Laten we beginnen. + +## Stap 1: PDF‑document laden + +Een bestand openen is het eenvoudigste deel. De `Document`‑klasse van Aspose.Pdf accepteert een pad of een stream, zodat je elk bestaand PDF‑bestand kunt aanwijzen. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Waarom een `using`‑block?** +> Het garandeert dat de bestands‑handle wordt vrijgegeven zodra we klaar zijn, waardoor lock‑problemen worden voorkomen wanneer we later proberen de **bijgewerkte PDF** **op te slaan**. + +## Stap 2: PDF‑bronnen bewerken – Toegang tot de ExtGState‑dictionary + +Elke pagina in een PDF heeft een *resource‑dictionary* die lettertypen, afbeeldingen en graphics states groepeert. Om de opacity of blend‑mode te wijzigen hebben we de `ExtGState`‑entry nodig. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Pro‑tip:** Niet alle PDF’s bevatten standaard een `ExtGState`‑entry. Het bovenstaande voorwaardelijke blok zorgt ervoor dat we geen `KeyNotFoundException` krijgen en laat ons toch veilig **PDF‑bronnen** **bewerken**. + +## Stap 3: Een nieuwe graphics‑state‑dictionary maken + +Een graphics state (`GS`) is in wezen een set sleutel‑waarde‑paren die de PDF‑renderer raadpleegt vóór het tekenen. Hier definiëren we de lijn‑opacity (`CA`), vullings‑opacity (`ca`) en blend‑mode (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Waarom deze sleutels?** +> - `CA` regelt de **lijn**‑opacity, wat invloed heeft op lijnen en randen. +> - `ca` regelt de **vulling**‑opacity, wat invloed heeft op vormen en tekstvullingen. +> - `BM` selecteert een blend‑mode; “Normal” is het meest gebruikelijk, maar alternatieven zoals “Multiply” bestaan voor creatieve effecten. + +## Stap 4: De nieuwe graphics‑state invoegen in ExtGState + +Nu we een kant‑en‑klaar dictionary hebben, voegen we het eenvoudig toe onder een nieuwe naam (`GS0`). De naam moet uniek zijn binnen de `ExtGState`‑collectie van de pagina. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Als je later deze state wilt refereren vanuit content‑streams, gebruik je `/GS0` in PDF‑operators zoals `gs`. Voor het doel van deze tutorial volstaat het alleen toevoegen om **PDF‑bronnen te bewerken** te demonstreren. + +## Stap 5: Verifiëren (optioneel) en de bijgewerkte PDF opslaan + +Op dit punt is de interne structuur van de PDF gewijzigd, maar de visuele output zal niet verschillen totdat je daadwerkelijk `GS0` referereert. Toch kunnen we de **bijgewerkte PDF** **opslaan** en de objectboom inspecteren met een PDF‑viewer of een tool zoals `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **Wat je kunt verwachten:** +> - `output.pdf` zal een byte‑voor‑byte kopie zijn van `input.pdf` plus de nieuwe `ExtGState`‑entry. +> - Het openen van het bestand in een teksteditor (of met een PDF‑inspectietool) zal een nieuw object tonen zoals: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> onder de `ExtGState`‑dictionary, met de sleutel `/GS0`. + +Als je het effect in actie wilt zien, voeg dan een eenvoudige content‑stream toe die de nieuwe graphics state gebruikt: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Het uitvoeren van de optionele snippet geeft je een 50 % transparante rechthoek, wat bevestigt dat de graphics state werkt zoals bedoeld. + +--- + +## Veelgestelde vragen & randgevallen + +**Q: Wat als de PDF al een `GS0`‑entry heeft?** +A: De `Add`‑methode zal de bestaande sleutel overschrijven. Om botsingen te vermijden, genereer je een unieke naam (bijv. `GS1`, `GS_custom`) of controleer je eerst `extGState.ContainsKey("GS0")`. + +**Q: Kan ik andere resource‑types bewerken, zoals lettertypen of XObjects?** +A: Zeker. De `DictionaryEditor` werkt voor elke top‑level resource‑key (`Font`, `XObject`, `ColorSpace`, enz.). Vervang gewoon `"ExtGState"` door de gewenste dictionary‑naam. + +**Q: Werkt deze aanpak met versleutelde PDF’s?** +A: Als de PDF met een wachtwoord is beveiligd, moet je het wachtwoord opgeven bij het aanmaken van het `Document`‑object: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Na ontcijfering kun je de resources op exact dezelfde manier bewerken. + +**Q: Zal de bestandsgrootte merkbaar toenemen?** +A: Het toevoegen van een klein dictionary zoals dit voegt doorgaans slechts enkele honderden bytes toe. Als je grote XObjects toevoegt of afbeeldingen embedt, kun je een grotere toename verwachten. + +--- + +## Conclusie + +Je weet nu hoe je **bijgewerkte PDF**‑bestanden kunt **opslaan** nadat je direct **PDF‑bronnen** hebt **bewerkt** met Aspose.Pdf. Het proces bestaat uit het laden van het document, het vinden van de `ExtGState`‑dictionary, het maken van een nieuwe graphics state, deze invoegen, en tenslotte het resultaat opslaan. Vanaf hier kun je experimenteren met andere resource‑types, meerdere graphics states koppelen, of een herbruikbare hulpfunctie bouwen voor bulk‑modificaties. + +Volgende stappen? Probeer de blend‑mode te wijzigen naar "Multiply" of "Screen" en kijk hoe overlappende objecten zich gedragen. Of verken het bewerken van de `Font`‑dictionary om aangepaste lettertypen on‑the‑fly te embedden. De PDF‑specificatie is rijk, en Aspose.Pdf geeft je + +## 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. + +- [Aspose Pdf .NET Openen, Modificeren, Opslaan van PDF's](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [Hoe specifieke PDF-pagina's extraheren en opslaan met Aspose.PDF voor .NET – Een uitgebreide gids](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [Hoe bestandsbijlage‑annotaties toe te voegen in PDF's met Aspose.PDF voor .NET | Stapsgewijze gids](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/english/net/document-manipulation/_index.md b/pdf/english/net/document-manipulation/_index.md index 9be42439d4..e1233002a7 100644 --- a/pdf/english/net/document-manipulation/_index.md +++ b/pdf/english/net/document-manipulation/_index.md @@ -216,7 +216,7 @@ Learn how to insert pages into a PDF using Aspose.PDF for .NET. This step-by-ste Learn how to insert pages into a PDF using Aspose.PDF for .NET with this step-by-step guide. Streamline your document workflow efficiently. ### [Insert an Empty Page in PDF using Aspose.PDF .NET: A Comprehensive Guide](./aspose-pdf-net-insert-empty-page/) -Learn how to insert empty pages into PDF documents with ease using Aspose.PDF for .NET. Follow this step-by-step guide to enhance your document manipulation skills. +Learn how to insert empty pages into PDF documents with ease using Aspose.PDF .NET. Follow this step-by-step guide to enhance your document manipulation skills. ### [Master Aspose.PDF .NET's MakeNUp Method for Efficient PDF Layouts](./aspose-pdf-net-make-nup-method-pdf-layout/) Learn how to efficiently rearrange multiple PDF pages into new layouts using Aspose.PDF .NET's MakeNUp method. Ideal for newsletters, brochures, and reports. @@ -311,6 +311,9 @@ Learn how to split multi-page PDFs and create new PDF files using Aspose.PDF for ### [Ultimate Guide to PDF Manipulation with Aspose.PDF .NET: Load, Save & Replace Text Efficiently](./master-pdf-manipulation-aspose-pdf-net/) Learn how to master PDF manipulation using Aspose.PDF for .NET. This guide covers loading, saving, and replacing text in PDFs, ideal for developers seeking efficiency. +### [Save Updated PDF – Edit PDF Resources with Aspose.Pdf](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Learn how to save changes to a PDF after editing its resources using Aspose.PDF for .NET. + ## Additional Resources - [Aspose.PDF for Net Documentation](https://docs.aspose.com/pdf/net/) @@ -325,4 +328,4 @@ Learn how to master PDF manipulation using Aspose.PDF for .NET. This guide cover {{< /blocks/products/pf/main-wrap-class >}} -{{< blocks/products/products-backtop-button >}} +{{< blocks/products/products-backtop-button >}} \ No newline at end of file diff --git a/pdf/english/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/english/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..a7cd34ee10 --- /dev/null +++ b/pdf/english/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,265 @@ +--- +category: general +date: 2026-07-23 +description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: en +lastmod: 2026-07-23 +og_description: Save updated PDF with Aspose.Pdf in C#. This tutorial shows how to + edit PDF resources, add a graphics state, and output a fresh file. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Save Updated PDF – Edit PDF Resources with Aspose.Pdf (C# Guide) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Save Updated PDF – Edit PDF Resources with Aspose.Pdf +url: /net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Save Updated PDF – Edit PDF Resources with Aspose.Pdf + +Ever wondered how to **save updated PDF** after tweaking its low‑level objects? Maybe you need to change opacity, blend modes, or other graphics parameters without re‑creating the whole document. In short, you want to **edit PDF resources** directly. This guide walks you through exactly that, using Aspose.Pdf for .NET. + +We'll start by loading an existing PDF, dive into its resource dictionary, inject a new graphics state, and finally **save the updated PDF**. By the end you’ll have a working C# snippet you can drop into any project—no mystery dependencies, just pure code. + +## What You’ll Learn + +- How to open a PDF with Aspose.Pdf and locate the first page’s resource dictionary. +- The steps to **edit PDF resources** like the `ExtGState` dictionary. +- Creating and inserting a custom graphics state (`GS0`) that controls stroke/fill opacity and blend mode. +- How to **save the updated PDF** to a new file, preserving all original content. + +**Prerequisites**: .NET 6+ (or .NET Framework 4.6+), a license or evaluation copy of Aspose.Pdf, and a basic familiarity with C#. If you’ve never touched a PDF at the dictionary level, don’t worry—this tutorial explains the “why” behind each call. + +--- + +![Diagram of PDF resource editing](image.png){.align-center alt="Diagram showing how to edit PDF resources and then save updated PDF"} + +## Save Updated PDF – Full Workflow Overview + +Before we jump into code, let’s outline the high‑level flow: + +1. **Load** the source PDF. +2. **Grab** the first page and its `Resources` dictionary. +3. **Navigate** to the `ExtGState` sub‑dictionary where graphics states live. +4. **Create** a new `CosPdfDictionary` describing our custom graphics state. +5. **Insert** that dictionary back into `ExtGState` under a unique key (`GS0`). +6. **Save** the modified document as a new file. + +That’s it—six tiny steps, each encapsulated in a few lines of C#. Ready? Let’s roll. + +## Step 1: Load the PDF Document + +Opening a file is the simplest part. Aspose.Pdf’s `Document` class takes a path or a stream, so you can point it at any existing PDF. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Why a `using` block?** +> It guarantees the file handle is released as soon as we finish, preventing lock‑issues when we later attempt to **save the updated PDF**. + +## Step 2: Edit PDF Resources – Access the ExtGState Dictionary + +Every page in a PDF has a *resource dictionary* that groups fonts, images, and graphics states. To change opacity or blend mode we need the `ExtGState` entry. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Pro tip:** Not all PDFs contain an `ExtGState` entry by default. The conditional block above ensures we don’t throw a `KeyNotFoundException` and still lets us **edit PDF resources** safely. + +## Step 3: Create a New Graphics State Dictionary + +A graphics state (`GS`) is essentially a set of key‑value pairs that the PDF renderer consults before drawing. Here we’ll define stroke opacity (`CA`), fill opacity (`ca`), and blend mode (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Why these keys?** +> - `CA` controls the **stroke** opacity, affecting lines and borders. +> - `ca` controls the **fill** opacity, influencing shapes and text fills. +> - `BM` selects a blend mode; “Normal” is the most common but alternatives like “Multiply” exist for creative effects. + +## Step 4: Insert the New Graphics State into ExtGState + +Now that we have a ready‑made dictionary, we simply add it under a new name (`GS0`). The name must be unique within the page’s `ExtGState` collection. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +If you later need to reference this state from content streams, you’ll use `/GS0` in PDF operators like `gs`. For the purpose of this tutorial, just adding it is enough to demonstrate **editing PDF resources**. + +## Step 5: Verify (Optional) and Save the Updated PDF + +At this point the PDF’s internal structure has changed, but the visual output won’t differ until you actually reference `GS0`. Still, we can **save the updated PDF** and inspect the object tree with a PDF viewer or a tool like `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **What to expect:** +> - `output.pdf` will be a byte‑for‑byte copy of `input.pdf` plus the new `ExtGState` entry. +> - Opening the file in a text editor (or using a PDF inspection tool) will reveal a new object like: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> under the `ExtGState` dictionary, keyed as `/GS0`. + +If you want to see the effect in action, add a simple content stream that uses the new graphics state: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Running the optional snippet will give you a 50 % transparent rectangle, confirming that the graphics state works as intended. + +--- + +## Common Questions & Edge Cases + +**Q: What if the PDF already has a `GS0` entry?** +A: The `Add` method will overwrite the existing key. To avoid collisions, generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` first. + +**Q: Can I edit other resource types, like fonts or XObjects?** +A: Absolutely. The `DictionaryEditor` works for any top‑level resource key (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the desired dictionary name. + +**Q: Does this approach work with encrypted PDFs?** +A: If the PDF is password‑protected, you must supply the password when constructing the `Document` object: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +After decryption you can edit resources exactly the same way. + +**Q: Will the file size increase noticeably?** +A: Adding a small dictionary like this typically adds only a few hundred bytes. If you add large XObjects or embed images, expect a bigger jump. + +--- + +## Conclusion + +You now know how to **save updated PDF** files after directly **edit PDF resources** with Aspose.Pdf. The process boils down to loading the document, locating the `ExtGState` dictionary, crafting a new graphics state, inserting it, and finally persisting the result. From here you can experiment with other resource types, chain multiple graphics states, or build a reusable helper method for bulk modifications. + +Next steps? Try swapping the blend mode to `"Multiply"` or `"Screen"` and see how overlapping objects behave. Or explore editing the `Font` dictionary to embed custom fonts on the fly. The PDF spec is rich, and Aspose.Pdf gives you + + +## 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. + +- [Aspose Pdf Net Open Modify Save Pdfs](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [How to Extract & Save Specific PDF Pages Using Aspose.PDF for .NET - A Comprehensive Guide](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [How to Add File Attachment Annotations in PDFs Using Aspose.PDF for .NET | Step-by-Step Guide](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/english/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/og-image.png b/pdf/english/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..c83ea3d74c2dcb1c17ca4ec156ba1854a25fef04 GIT binary patch literal 49060 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 PnKMdqYR?K~Ui<$KqP*e( literal 0 HcmV?d00001 diff --git a/pdf/french/net/document-manipulation/_index.md b/pdf/french/net/document-manipulation/_index.md index b8b18870c3..abc82c35a2 100644 --- a/pdf/french/net/document-manipulation/_index.md +++ b/pdf/french/net/document-manipulation/_index.md @@ -306,11 +306,14 @@ Apprenez à diviser un fichier PDF en pages individuelles avec Aspose.PDF pour . Apprenez à diviser des pages PDF en fichiers distincts avec Aspose.PDF pour .NET. Ce guide complet couvre la configuration, la mise en œuvre et l'optimisation. ### [Diviser et créer des fichiers PDF avec Aspose.PDF .NET | Guide de manipulation de documents](./split-create-pdf-aspose-pdf-net/) -Apprenez à fractionner des PDF multipages et à créer de nouveaux fichiers PDF avec Aspose.PDF pour .NET. Suivez ce guide complet avec des exemples de code. +Apprenez à fractionner des PDF multipages et à créer de nouveaux fichiers PDF avec Aspose.PDF .NET. Suivez ce guide complet avec des exemples de code. ### [Guide ultime de manipulation de PDF avec Aspose.PDF .NET : charger, enregistrer et remplacer du texte efficacement](./master-pdf-manipulation-aspose-pdf-net/) Apprenez à maîtriser la manipulation des PDF avec Aspose.PDF pour .NET. Ce guide couvre le chargement, l'enregistrement et le remplacement de texte dans les PDF, idéal pour les développeurs en quête d'efficacité. +### [Enregistrer le PDF mis à jour – Modifier les ressources PDF avec Aspose.PDF](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Apprenez à enregistrer un PDF modifié après avoir édité ses ressources avec Aspose.PDF pour .NET. + ## Ressources supplémentaires - [Aspose.PDF pour la documentation réseau](https://docs.aspose.com/pdf/net/) diff --git a/pdf/french/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/french/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..29eed92fb1 --- /dev/null +++ b/pdf/french/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,262 @@ +--- +category: general +date: 2026-07-23 +description: Enregistrez le PDF mis à jour avec Aspose.Pdf en C#. Apprenez à modifier + les ressources PDF comme ExtGState et à créer un nouveau fichier en quelques étapes + seulement. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: fr +lastmod: 2026-07-23 +og_description: Enregistrez le PDF mis à jour avec Aspose.Pdf en C#. Ce tutoriel montre + comment modifier les ressources PDF, ajouter un état graphique et générer un nouveau + fichier. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Enregistrer le PDF mis à jour – Modifier les ressources PDF avec Aspose.Pdf + (Guide C#) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Enregistrer le PDF mis à jour – Modifier les ressources PDF avec Aspose.Pdf +url: /fr/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Enregistrer le PDF mis à jour – Modifier les ressources PDF avec Aspose.Pdf + +Vous êtes‑vous déjà demandé comment **enregistrer le PDF mis à jour** après avoir ajusté ses objets de bas niveau ? Peut‑être devez‑vous changer l’opacité, les modes de fusion ou d’autres paramètres graphiques sans recréer le document entier. En bref, vous voulez **modifier directement les ressources PDF**. Ce guide vous montre exactement comment faire, en utilisant Aspose.Pdf pour .NET. + +Nous commencerons par charger un PDF existant, plonger dans son dictionnaire de ressources, injecter un nouvel état graphique, puis **enregistrer le PDF mis à jour**. À la fin, vous disposerez d’un extrait C# fonctionnel que vous pourrez intégrer à n’importe quel projet — sans dépendances mystérieuses, juste du code pur. + +## Ce que vous apprendrez + +- Comment ouvrir un PDF avec Aspose.Pdf et localiser le dictionnaire de ressources de la première page. +- Les étapes pour **modifier les ressources PDF** comme le dictionnaire `ExtGState`. +- Créer et insérer un état graphique personnalisé (`GS0`) qui contrôle l’opacité du trait/remplissage et le mode de fusion. +- Comment **enregistrer le PDF mis à jour** dans un nouveau fichier, en préservant tout le contenu original. + +**Prérequis** : .NET 6+ (ou .NET Framework 4.6+), une licence ou une copie d’évaluation d’Aspose.Pdf, et une connaissance de base du C#. Si vous n’avez jamais touché à un PDF au niveau du dictionnaire, ne vous inquiétez pas — ce tutoriel explique le « pourquoi » de chaque appel. + +![Diagramme de la modification des ressources PDF](image.png){.align-center alt="Diagramme montrant comment modifier les ressources PDF puis enregistrer le PDF mis à jour"} + +## Enregistrer le PDF mis à jour – Vue d’ensemble du flux de travail complet + +Avant de plonger dans le code, décrivons le flux de haut niveau : + +1. **Charger** le PDF source. +2. **Récupérer** la première page et son dictionnaire `Resources`. +3. **Naviguer** vers le sous‑dictionnaire `ExtGState` où résident les états graphiques. +4. **Créer** un nouveau `CosPdfDictionary` décrivant notre état graphique personnalisé. +5. **Insérer** ce dictionnaire dans `ExtGState` sous une clé unique (`GS0`). +6. **Enregistrer** le document modifié dans un nouveau fichier. + +C’est tout — six petites étapes, chacune encapsulée en quelques lignes de C#. Prêt ? C’est parti. + +## Étape 1 : Charger le document PDF + +Ouvrir un fichier est la partie la plus simple. La classe `Document` d’Aspose.Pdf accepte un chemin ou un flux, vous pouvez donc la pointer vers n’importe quel PDF existant. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Pourquoi un bloc `using` ?** +> Il garantit que le handle du fichier est libéré dès que nous avons fini, évitant les problèmes de verrouillage lorsque nous essayons plus tard de **enregistrer le PDF mis à jour**. + +## Étape 2 : Modifier les ressources PDF – Accéder au dictionnaire ExtGState + +Chaque page d’un PDF possède un *dictionnaire de ressources* qui regroupe polices, images et états graphiques. Pour changer l’opacité ou le mode de fusion, nous avons besoin de l’entrée `ExtGState`. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Astuce pro :** Tous les PDF ne contiennent pas d’entrée `ExtGState` par défaut. Le bloc conditionnel ci‑dessus empêche de lever une `KeyNotFoundException` et nous permet tout de même de **modifier les ressources PDF** en toute sécurité. + +## Étape 3 : Créer un nouveau dictionnaire d’état graphique + +Un état graphique (`GS`) est essentiellement un ensemble de paires clé‑valeur que le moteur PDF consulte avant de dessiner. Ici, nous définirons l’opacité du trait (`CA`), l’opacité du remplissage (`ca`) et le mode de fusion (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Pourquoi ces clés ?** +> - `CA` contrôle l’opacité du **trait**, affectant les lignes et bordures. +> - `ca` contrôle l’opacité du **remplissage**, influençant les formes et le remplissage du texte. +> - `BM` sélectionne un mode de fusion ; « Normal » est le plus courant, mais des alternatives comme « Multiply » existent pour des effets créatifs. + +## Étape 4 : Insérer le nouvel état graphique dans ExtGState + +Maintenant que nous disposons d’un dictionnaire prêt à l’emploi, nous l’ajoutons simplement sous un nouveau nom (`GS0`). Le nom doit être unique au sein de la collection `ExtGState` de la page. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Si vous devez plus tard référencer cet état depuis les flux de contenu, vous utiliserez `/GS0` dans les opérateurs PDF comme `gs`. Pour les besoins de ce tutoriel, le simple ajout suffit à démontrer **la modification des ressources PDF**. + +## Étape 5 : Vérifier (facultatif) et enregistrer le PDF mis à jour + +À ce stade, la structure interne du PDF a changé, mais le rendu visuel ne différera pas tant que vous ne référencerez pas réellement `GS0`. Nous pouvons néanmoins **enregistrer le PDF mis à jour** et inspecter l’arbre d’objets avec un visualiseur PDF ou un outil comme `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **À quoi s’attendre :** +> - `output.pdf` sera une copie octet‑pour‑octet de `input.pdf` avec l’entrée `ExtGState` supplémentaire. +> - L’ouverture du fichier dans un éditeur texte (ou avec un outil d’inspection PDF) révélera un nouvel objet tel que : +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> sous le dictionnaire `ExtGState`, avec la clé `/GS0`. + +Si vous voulez voir l’effet en action, ajoutez un flux de contenu simple qui utilise le nouvel état graphique : + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +L’exécution du fragment optionnel produira un rectangle à 50 % de transparence, confirmant que l’état graphique fonctionne comme prévu. + +--- + +## Questions fréquentes et cas particuliers + +**Q : Que se passe‑t‑il si le PDF possède déjà une entrée `GS0` ?** +R : La méthode `Add` écrasera la clé existante. Pour éviter les collisions, générez un nom unique (par ex. `GS1`, `GS_custom`) ou vérifiez d’abord `extGState.ContainsKey("GS0")`. + +**Q : Puis‑je modifier d’autres types de ressources, comme les polices ou les XObjects ?** +R : Absolument. Le `DictionaryEditor` fonctionne pour n’importe quelle clé de ressource de niveau supérieur (`Font`, `XObject`, `ColorSpace`, etc.). Il suffit de remplacer `"ExtGState"` par le nom du dictionnaire souhaité. + +**Q : Cette approche fonctionne‑t‑elle avec des PDF chiffrés ?** +R : Si le PDF est protégé par mot de passe, vous devez fournir le mot de passe lors de la construction de l’objet `Document` : +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Après déchiffrement, vous pouvez modifier les ressources exactement de la même manière. + +**Q : La taille du fichier augmentera‑t‑elle de façon notable ?** +R : L’ajout d’un petit dictionnaire comme celui‑ci ajoute généralement quelques centaines d’octets seulement. Si vous ajoutez de gros XObjects ou intégrez des images, attendez‑vous à une augmentation plus importante. + +## Conclusion + +Vous savez maintenant comment **enregistrer des PDF mis à jour** après avoir **modifié directement les ressources PDF** avec Aspose.Pdf. Le processus se résume à charger le document, localiser le dictionnaire `ExtGState`, créer un nouvel état graphique, l’insérer, puis persister le résultat. À partir d’ici, vous pouvez expérimenter avec d’autres types de ressources, chaîner plusieurs états graphiques, ou créer une méthode d’aide réutilisable pour des modifications en masse. + +Prochaines étapes ? Essayez de remplacer le mode de fusion par « Multiply » ou « Screen » et observez le comportement des objets qui se chevauchent. Ou explorez la modification du dictionnaire `Font` pour incorporer des polices personnalisées à la volée. La spécification PDF est riche, et Aspose.Pdf vous donne + +## 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 API supplémentaires et à explorer des approches d’implémentation alternatives dans vos propres projets. + +- [Aspose Pdf Net Open Modify Save Pdfs](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [How to Extract & Save Specific PDF Pages Using Aspose.PDF for .NET - A Comprehensive Guide](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [How to Add File Attachment Annotations in PDFs Using Aspose.PDF for .NET | Step-by-Step Guide](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/german/net/document-manipulation/_index.md b/pdf/german/net/document-manipulation/_index.md index 688642e8f8..be589f4d73 100644 --- a/pdf/german/net/document-manipulation/_index.md +++ b/pdf/german/net/document-manipulation/_index.md @@ -101,7 +101,7 @@ Erfahren Sie in diesem ausführlichen C#-Tutorial, wie Sie mit Aspose.PDF für . ### [So fügen Sie mit Aspose.PDF für .NET Kopfzeilen zu PDFs hinzu: Eine umfassende Anleitung](./add-header-pdf-aspose-dotnet-guide/) Erfahren Sie, wie Sie mit Aspose.PDF für .NET nahtlos Kopfzeilen, einschließlich Text und Bilder, zu Ihren PDF-Dokumenten hinzufügen. Perfekt für die Verbesserung des Dokumenten-Brandings. -### [So fügen Sie mit Aspose.PDF für .NET Kopfzeilen zu PDFs hinzu: Eine umfassende Anleitung](./add-headers-aspose-pdf-dotnet-guide/) +### [So fügen Sie mit Aspose.PDF für .NET Kopfzeilen zu PDFs hinzufügen: Eine umfassende Anleitung](./add-headers-aspose-pdf-dotnet-guide/) Erfahren Sie, wie Sie mit Aspose.PDF für .NET nahtlos Textkopfzeilen zu Ihren PDF-Dateien hinzufügen und so die Lesbarkeit und Organisation der Dokumente verbessern. ### [So fügen Sie mit Aspose.PDF für .NET ein Linienobjekt in PDF ein: Eine Schritt-für-Schritt-Anleitung](./add-line-aspose-pdf-dotnet-tutorial/) @@ -311,6 +311,9 @@ Erfahren Sie, wie Sie mehrseitige PDFs mit Aspose.PDF für .NET aufteilen und ne ### [Ultimativer Leitfaden zur PDF-Manipulation mit Aspose.PDF .NET: Text effizient laden, speichern und ersetzen](./master-pdf-manipulation-aspose-pdf-net/) Erfahren Sie, wie Sie PDFs mit Aspose.PDF für .NET bearbeiten. Diese Anleitung behandelt das Laden, Speichern und Ersetzen von Text in PDFs – ideal für Entwickler, die Wert auf Effizienz legen. +### [Aktualisiertes PDF speichern – PDF-Ressourcen mit Aspose.Pdf bearbeiten](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Erfahren Sie, wie Sie ein geändertes PDF speichern und PDF-Ressourcen mit Aspose.Pdf effizient bearbeiten. + ## Weitere Ressourcen - [Aspose.PDF für Net-Dokumentation](https://docs.aspose.com/pdf/net/) diff --git a/pdf/german/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/german/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..d5ac07aa5c --- /dev/null +++ b/pdf/german/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,260 @@ +--- +category: general +date: 2026-07-23 +description: Speichern Sie das aktualisierte PDF mit Aspose.Pdf in C#. Erfahren Sie, + wie Sie PDF‑Ressourcen wie ExtGState bearbeiten und in nur wenigen Schritten eine + neue Datei erstellen. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: de +lastmod: 2026-07-23 +og_description: Speichern Sie aktualisierte PDFs mit Aspose.Pdf in C#. Dieses Tutorial + zeigt, wie man PDF‑Ressourcen bearbeitet, einen Grafikzustand hinzufügt und eine + neue Datei ausgibt. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Aktualisiertes PDF speichern – PDF‑Ressourcen bearbeiten mit Aspose.Pdf + (C#‑Leitfaden) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Aktualisiertes PDF speichern – PDF‑Ressourcen mit Aspose.Pdf bearbeiten +url: /de/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Aktualisiertes PDF speichern – PDF‑Ressourcen mit Aspose.Pdf bearbeiten + +Haben Sie sich jemals gefragt, wie man ein **aktualisiertes PDF** speichert, nachdem man seine Low‑Level‑Objekte angepasst hat? Vielleicht müssen Sie die Opazität, Blend‑Modi oder andere Grafik‑Parameter ändern, ohne das gesamte Dokument neu zu erstellen. Kurz gesagt, Sie möchten **PDF‑Ressourcen** direkt **bearbeiten**. Dieser Leitfaden führt Sie genau durch diesen Vorgang, mit Aspose.Pdf für .NET. + +Wir beginnen damit, ein vorhandenes PDF zu laden, tauchen in sein Ressourcen‑Verzeichnis ein, fügen einen neuen Grafik‑Zustand ein und speichern schließlich **das aktualisierte PDF**. Am Ende haben Sie ein funktionierendes C#‑Snippet, das Sie in jedes Projekt einbinden können – ohne mysteriöse Abhängigkeiten, nur reiner Code. + +## Was Sie lernen werden + +- Wie man ein PDF mit Aspose.Pdf öffnet und das Ressourcen‑Verzeichnis der ersten Seite findet. +- Die Schritte, um **PDF‑Ressourcen** wie das `ExtGState`‑Dictionary zu **bearbeiten**. +- Erstellen und Einfügen eines benutzerdefinierten Grafik‑Zustands (`GS0`), der Strich‑/Füll‑Opazität und Blend‑Modus steuert. +- Wie man **das aktualisierte PDF** in einer neuen Datei **speichert**, wobei der gesamte Originalinhalt erhalten bleibt. + +**Voraussetzungen**: .NET 6+ (oder .NET Framework 4.6+), eine Lizenz oder Evaluierungskopie von Aspose.Pdf und Grundkenntnisse in C#. Wenn Sie noch nie ein PDF auf Dictionary‑Ebene berührt haben, keine Sorge – dieses Tutorial erklärt das „Warum“ hinter jedem Aufruf. + +![Diagram of PDF resource editing](image.png){.align-center alt="Diagramm, das zeigt, wie PDF‑Ressourcen bearbeitet und anschließend das aktualisierte PDF gespeichert werden"} + +## Aktualisiertes PDF speichern – Überblick über den gesamten Workflow + +Bevor wir zum Code springen, skizzieren wir den groben Ablauf: + +1. **Laden** der Quell‑PDF. +2. **Abrufen** der ersten Seite und ihres `Resources`‑Dictionaries. +3. **Navigieren** zum `ExtGState`‑Unter‑Dictionary, in dem Grafik‑Zustände gespeichert sind. +4. **Erstellen** eines neuen `CosPdfDictionary`, das unseren benutzerdefinierten Grafik‑Zustand beschreibt. +5. **Einfügen** dieses Dictionaries zurück in `ExtGState` unter einem eindeutigen Schlüssel (`GS0`). +6. **Speichern** des modifizierten Dokuments als neue Datei. + +Das war's – sechs kleine Schritte, jeweils in ein paar Zeilen C# gekapselt. Bereit? Los geht's. + +## Schritt 1: PDF‑Dokument laden + +Das Öffnen einer Datei ist der einfachste Teil. Die `Document`‑Klasse von Aspose.Pdf akzeptiert einen Pfad oder einen Stream, sodass Sie sie auf jede vorhandene PDF‑Datei zeigen können. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Warum ein `using`‑Block?** +> Er stellt sicher, dass das Dateihandle sofort freigegeben wird, sobald wir fertig sind, und verhindert Sperr‑Probleme, wenn wir später versuchen, **das aktualisierte PDF** zu **speichern**. + +## Schritt 2: PDF‑Ressourcen bearbeiten – Zugriff auf das ExtGState‑Dictionary + +Jede Seite in einem PDF besitzt ein *Ressourcen‑Dictionary*, das Schriften, Bilder und Grafik‑Zustände gruppiert. Um Opazität oder Blend‑Modus zu ändern, benötigen wir den `ExtGState`‑Eintrag. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Pro‑Tipp:** Nicht alle PDFs enthalten standardmäßig einen `ExtGState`‑Eintrag. Der obige bedingte Block verhindert, dass eine `KeyNotFoundException` ausgelöst wird, und ermöglicht dennoch ein sicheres **Bearbeiten von PDF‑Ressourcen**. + +## Schritt 3: Ein neues Grafik‑Zustands‑Dictionary erstellen + +Ein Grafik‑Zustand (`GS`) ist im Wesentlichen ein Satz von Schlüssel‑Wert‑Paaren, die der PDF‑Renderer vor dem Zeichnen konsultiert. Hier definieren wir die Strich‑Opazität (`CA`), die Füll‑Opazität (`ca`) und den Blend‑Modus (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Warum diese Schlüssel?** +> - `CA` steuert die **Strich**‑Opazität und wirkt sich auf Linien und Rahmen aus. +> - `ca` steuert die **Füll**‑Opazität und beeinflusst Formen und Textfüllungen. +> - `BM` wählt einen Blend‑Modus; „Normal“ ist am gebräuchlichsten, aber Alternativen wie „Multiply“ stehen für kreative Effekte zur Verfügung. + +## Schritt 4: Den neuen Grafik‑Zustand in ExtGState einfügen + +Jetzt, wo wir ein fertiges Dictionary haben, fügen wir es einfach unter einem neuen Namen (`GS0`) hinzu. Der Name muss innerhalb der `ExtGState`‑Sammlung der Seite eindeutig sein. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Wenn Sie später diesen Zustand aus Inhalts‑Streams referenzieren möchten, verwenden Sie `/GS0` in PDF‑Operatoren wie `gs`. Für den Zweck dieses Tutorials reicht das reine Hinzufügen aus, um **PDF‑Ressourcen zu bearbeiten** zu demonstrieren. + +## Schritt 5: Optional prüfen und das aktualisierte PDF speichern + +An diesem Punkt hat sich die interne Struktur des PDFs geändert, aber die visuelle Ausgabe unterscheidet sich erst, wenn Sie tatsächlich `GS0` referenzieren. Trotzdem können wir **das aktualisierte PDF** speichern und den Objekt‑Baum mit einem PDF‑Viewer oder einem Tool wie `pdfcpu` inspizieren. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **Was Sie erwarten können:** +> - `output.pdf` ist eine byte‑für‑byte Kopie von `input.pdf` plus dem neuen `ExtGState`‑Eintrag. +> - Öffnet man die Datei in einem Text‑Editor (oder nutzt ein PDF‑Inspektionstool), erscheint ein neues Objekt wie: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> unter dem `ExtGState`‑Dictionary, mit dem Schlüssel `/GS0`. + +Wenn Sie den Effekt in Aktion sehen möchten, fügen Sie einen einfachen Inhalts‑Stream hinzu, der den neuen Grafik‑Zustand verwendet: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Das Ausführen des optionalen Snippets erzeugt ein 50 % transparentes Rechteck und bestätigt, dass der Grafik‑Zustand wie beabsichtigt funktioniert. + +## Häufige Fragen & Sonderfälle + +**Q: Was passiert, wenn das PDF bereits einen `GS0`‑Eintrag hat?** +A: Die `Add`‑Methode überschreibt den bestehenden Schlüssel. Um Kollisionen zu vermeiden, erzeugen Sie einen eindeutigen Namen (z. B. `GS1`, `GS_custom`) oder prüfen Sie zuerst `extGState.ContainsKey("GS0")`. + +**Q: Kann ich andere Ressourcentypen bearbeiten, z. B. Schriften oder XObjects?** +A: Absolut. Der `DictionaryEditor` funktioniert für jeden obersten Ressourcenschlüssel (`Font`, `XObject`, `ColorSpace` usw.). Ersetzen Sie einfach `"ExtGState"` durch den gewünschten Dictionary‑Namen. + +**Q: Funktioniert dieser Ansatz bei verschlüsselten PDFs?** +A: Wenn das PDF passwortgeschützt ist, müssen Sie das Passwort beim Erzeugen des `Document`‑Objekts übergeben: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Nach der Entschlüsselung können Sie Ressourcen exakt auf dieselbe Weise bearbeiten. + +**Q: Wird die Dateigröße merklich zunehmen?** +A: Das Hinzufügen eines kleinen Dictionaries erhöht typischerweise nur ein paar hundert Bytes. Wenn Sie große XObjects einbinden oder Bilder einbetten, sollten Sie mit einem größeren Anstieg rechnen. + +## Fazit + +Sie wissen jetzt, wie man **aktualisierte PDF**‑Dateien speichert, nachdem man **PDF‑Ressourcen** direkt mit Aspose.Pdf bearbeitet hat. Der Prozess reduziert sich auf das Laden des Dokuments, das Auffinden des `ExtGState`‑Dictionaries, das Erstellen eines neuen Grafik‑Zustands, das Einfügen und schließlich das Persistieren des Ergebnisses. Von hier aus können Sie mit anderen Ressourcentypen experimentieren, mehrere Grafik‑Zustände verketten oder eine wiederverwendbare Hilfsmethode für Massen‑Modifikationen erstellen. + +Nächste Schritte? Versuchen Sie, den Blend‑Modus zu `"Multiply"` oder `"Screen"` zu ändern und beobachten Sie, wie überlappende Objekte reagieren. Oder erkunden Sie das Bearbeiten des `Font`‑Dictionaries, um benutzerdefinierte Schriften on‑the‑fly einzubetten. Die PDF‑Spezifikation ist umfangreich, und Aspose.Pdf gibt Ihnen + +## 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. + +- [Aspose Pdf Net Open Modify Save Pdfs](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [How to Extract & Save Specific PDF Pages Using Aspose.PDF for .NET - A Comprehensive Guide](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [How to Add File Attachment Annotations in PDFs Using Aspose.PDF for .NET | Step-by-Step Guide](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/greek/net/document-manipulation/_index.md b/pdf/greek/net/document-manipulation/_index.md index 00e2be81e4..1de48d7dc8 100644 --- a/pdf/greek/net/document-manipulation/_index.md +++ b/pdf/greek/net/document-manipulation/_index.md @@ -140,7 +140,7 @@ ### [Πώς να συνενώσετε PDF με το Aspose.PDF για .NET: Ένας πλήρης οδηγός](./concatenate-pdfs-aspose-pdf-dotnet-guide/) Μάθετε πώς να συγχωνεύετε πολλά αρχεία PDF χρησιμοποιώντας το Aspose.PDF για .NET. Αυτός ο ολοκληρωμένος οδηγός καλύπτει την εγκατάσταση, την υλοποίηση και τις πρακτικές εφαρμογές. -### [Πώς να συνενώσετε PDF με κενές σελίδες χρησιμοποιώντας το Aspose.PDF για .NET: Ένας πλήρης οδηγός](./concatenate-pdfs-blank-pages-aspose-pdf-net/) +### [Πώς να συνενώσετε PDF με κεντές σελίδες χρησιμοποιώντας το Aspose.PDF για .NET: Ένας πλήρης οδηγός](./concatenate-pdfs-blank-pages-aspose-pdf-net/) Μάθετε πώς να συγχωνεύετε αρχεία PDF και να προσθέτετε κενές σελίδες χρησιμοποιώντας το Aspose.PDF για .NET. Βελτιστοποιήστε αποτελεσματικά τη ροή εργασίας διαχείρισης εγγράφων. ### [Πώς να συνενώσετε και να εισαγάγετε κενές σελίδες σε PDF χρησιμοποιώντας .NET και Aspose.PDF](./master-net-pdf-manipulation-concatenate-insert-blank-pages-asposepdf/) @@ -195,7 +195,7 @@ Μάθετε πώς να διαχωρίζετε αποτελεσματικά σελίδες PDF σε μεμονωμένα αρχεία χρησιμοποιώντας το Aspose.PDF για .NET με αυτόν τον ολοκληρωμένο οδηγό. Βελτιώστε τις δεξιότητές σας στον χειρισμό εγγράφων σήμερα. ### [Πώς να διαχωρίσετε σελίδες PDF χρησιμοποιώντας το Aspose.PDF για .NET: Ένας πλήρης οδηγός](./split-pdf-pages-aspose-pdf-net/) -Μάθετε πώς να διαχωρίζετε συγκεκριμένες σελίδες από ένα PDF σε ξεχωριστά αρχεία χρησιμοποιώντας το Aspose.PDF για .NET. Αυτός ο οδηγός καλύπτει τον χειρισμό και τη ρύθμιση ροής. +Μάθετε πώς να διαχωρίζετε σελίδες PDF χρησιμοποιώντας το Aspose.PDF για .NET με αυτόν τον ολοκληρωμένο οδηγό. Κατακτήστε τον χειρισμό εγγράφων σε C# και βελτιστοποιήστε τη ροή εργασίας σας. ### [Πώς να διαχωρίσετε σελίδες PDF χρησιμοποιώντας το Aspose.PDF για .NET: Οδηγός βήμα προς βήμα](./split-pdf-pages-aspose-pdf-net-guide/) Μάθετε πώς να διαχωρίζετε σελίδες PDF χρησιμοποιώντας το Aspose.PDF για .NET με αυτόν τον ολοκληρωμένο οδηγό. Κατακτήστε τον χειρισμό εγγράφων σε C# και βελτιστοποιήστε τη ροή εργασίας σας. @@ -311,6 +311,9 @@ ### [Ο απόλυτος οδηγός για χειρισμό PDF με το Aspose.PDF .NET: Φόρτωση, αποθήκευση και αντικατάσταση κειμένου αποτελεσματικά](./master-pdf-manipulation-aspose-pdf-net/) Μάθετε πώς να εξοικειωθείτε με τον χειρισμό PDF χρησιμοποιώντας το Aspose.PDF για .NET. Αυτός ο οδηγός καλύπτει τη φόρτωση, την αποθήκευση και την αντικατάσταση κειμένου σε PDF, ιδανικός για προγραμματιστές που αναζητούν αποτελεσματικότητα. +### [Αποθήκευση ενημερωμένου PDF – Επεξεργασία πόρων PDF με το Aspose.Pdf](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Μάθετε πώς να αποθηκεύετε το ενημερωμένο PDF μετά την επεξεργασία πόρων PDF χρησιμοποιώντας το Aspose.PDF για .NET. + ## Πρόσθετοι Πόροι - [Aspose.PDF για τεκμηρίωση δικτύου](https://docs.aspose.com/pdf/net/) diff --git a/pdf/greek/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/greek/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..9b89f69f86 --- /dev/null +++ b/pdf/greek/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,260 @@ +--- +category: general +date: 2026-07-23 +description: Αποθηκεύστε το ενημερωμένο PDF χρησιμοποιώντας το Aspose.Pdf σε C#. Μάθετε + πώς να επεξεργάζεστε πόρους PDF όπως το ExtGState και να δημιουργείτε ένα νέο αρχείο + σε λίγα μόνο βήματα. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: el +lastmod: 2026-07-23 +og_description: Αποθήκευση ενημερωμένου PDF με Aspose.Pdf σε C#. Αυτό το σεμινάριο + δείχνει πώς να επεξεργαστείτε τους πόρους του PDF, να προσθέσετε κατάσταση γραφικών + και να δημιουργήσετε ένα νέο αρχείο. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Αποθήκευση Ενημερωμένου PDF – Επεξεργασία Πόρων PDF με το Aspose.Pdf (Οδηγός + C#) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Αποθήκευση ενημερωμένου PDF – Επεξεργασία πόρων PDF με το Aspose.Pdf +url: /el/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Αποθήκευση Ενημερωμένου PDF – Επεξεργασία Πόρων PDF με Aspose.Pdf + +Έχετε αναρωτηθεί ποτέ πώς να **αποθηκεύσετε ένα ενημερωμένο PDF** μετά την τροποποίηση των χαμηλού επιπέδου αντικειμένων του; Ίσως χρειαστεί να αλλάξετε τη διαφάνεια, τις λειτουργίες ανάμειξης ή άλλες παραμέτρους γραφικών χωρίς να δημιουργήσετε ξανά ολόκληρο το έγγραφο. Συνοπτικά, θέλετε να **επεξεργαστείτε απευθείας τους πόρους PDF**. Αυτός ο οδηγός σας καθοδηγεί βήμα προς βήμα, χρησιμοποιώντας το Aspose.Pdf για .NET. + +Θα ξεκινήσουμε φορτώνοντας ένα υπάρχον PDF, θα εμβαθύνουμε στο λεξικό πόρων του, θα ενσωματώσουμε μια νέα κατάσταση γραφικών και τελικά θα **αποθηκεύσουμε το ενημερωμένο PDF**. Στο τέλος θα έχετε ένα λειτουργικό απόσπασμα C# που μπορείτε να ενσωματώσετε σε οποιοδήποτε έργο—χωρίς μυστικές εξαρτήσεις, μόνο καθαρός κώδικας. + +## Τι Θα Μάθετε + +- Πώς να ανοίξετε ένα PDF με Aspose.Pdf και να εντοπίσετε το λεξικό πόρων της πρώτης σελίδας. +- Τα βήματα για **επεξεργασία πόρων PDF** όπως το λεξικό `ExtGState`. +- Δημιουργία και εισαγωγή μιας προσαρμοσμένης κατάστασης γραφικών (`GS0`) που ελέγχει τη διαφάνεια γραμμής/γέμισης και τη λειτουργία ανάμειξης. +- Πώς να **αποθηκεύσετε το ενημερωμένο PDF** σε νέο αρχείο, διατηρώντας όλο το αρχικό περιεχόμενο. + +**Προαπαιτούμενα**: .NET 6+ (ή .NET Framework 4.6+), άδεια ή έκδοση αξιολόγησης του Aspose.Pdf, και βασική εξοικείωση με C#. Αν δεν έχετε ποτέ αγγίξει ένα PDF σε επίπεδο λεξικού, μην ανησυχείτε—αυτός ο οδηγός εξηγεί το «γιατί» πίσω από κάθε κλήση. + +![Diagram of PDF resource editing](image.png){.align-center alt="Διάγραμμα που δείχνει πώς να επεξεργαστείτε πόρους PDF και στη συνέχεια να αποθηκεύσετε το ενημερωμένο PDF"} + +## Αποθήκευση Ενημερωμένου PDF – Πλήρης Επισκόπηση Ροής Εργασίας + +Πριν βουτήξουμε στον κώδικα, ας περιγράψουμε την υψηλού επιπέδου ροή: + +1. **Load** το πηγαίο PDF. +2. **Grab** την πρώτη σελίδα και το λεξικό `Resources` της. +3. **Navigate** στο υπο‑λεξικό `ExtGState` όπου ζουν οι καταστάσεις γραφικών. +4. **Create** ένα νέο `CosPdfDictionary` που περιγράφει την προσαρμοσμένη κατάσταση γραφικών μας. +5. **Insert** αυτό το λεξικό πίσω στο `ExtGState` κάτω από ένα μοναδικό κλειδί (`GS0`). +6. **Save** το τροποποιημένο έγγραφο ως νέο αρχείο. + +Αυτό είναι—έξι μικρά βήματα, καθένα ενσωματωμένο σε λίγες γραμμές C#. Έτοιμοι; Πάμε. + +## Βήμα 1: Φόρτωση του Εγγράφου PDF + +Το άνοιγμα ενός αρχείου είναι το πιο απλό μέρος. Η κλάση `Document` του Aspose.Pdf δέχεται διαδρομή ή ροή, ώστε να μπορείτε να την κατευθύνετε σε οποιοδήποτε υπάρχον PDF. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Γιατί ένα μπλοκ `using`;** +> Εγγυάται ότι το χειριστήριο του αρχείου απελευθερώνεται αμέσως μόλις τελειώσουμε, αποτρέποντας προβλήματα κλειδώματος όταν αργότερα προσπαθήσουμε να **αποθηκεύσουμε το ενημερωμένο PDF**. + +## Βήμα 2: Επεξεργασία Πόρων PDF – Πρόσβαση στο Λεξικό ExtGState + +Κάθε σελίδα σε ένα PDF έχει ένα *λεξικό πόρων* που ομαδοποιεί γραμματοσειρές, εικόνες και καταστάσεις γραφικών. Για να αλλάξουμε τη διαφάνεια ή τη λειτουργία ανάμειξης χρειαζόμαστε την καταχώρηση `ExtGState`. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Pro tip:** Δεν περιέχουν όλα τα PDF εξ ορισμού μια καταχώρηση `ExtGState`. Το παραπάνω μπλοκ ελέγχου εξασφαλίζει ότι δεν θα ρίξουμε `KeyNotFoundException` και μας επιτρέπει να **επεξεργαστούμε πόρους PDF** με ασφάλεια. + +## Βήμα 3: Δημιουργία Νέου Λεξικού Κατάστασης Γραφικών + +Μια κατάσταση γραφικών (`GS`) είναι ουσιαστικά ένα σύνολο ζευγών κλειδιού‑τιμής που ο PDF renderer συμβουλεύεται πριν σχεδιάσει. Εδώ θα ορίσουμε τη διαφάνεια γραμμής (`CA`), τη διαφάνεια γέμισης (`ca`) και τη λειτουργία ανάμειξης (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Γιατί αυτά τα κλειδιά;** +> - `CA` ελέγχει τη **διαφάνεια γραμμής**, επηρεάζοντας γραμμές και περιθώρια. +> - `ca` ελέγχει τη **διαφάνεια γέμισης**, επηρεάζοντας σχήματα και γέμισμα κειμένου. +> - `BM` επιλέγει μια λειτουργία ανάμειξης· το “Normal” είναι το πιο κοινό, αλλά υπάρχουν εναλλακτικές όπως το “Multiply” για δημιουργικά εφέ. + +## Βήμα 4: Εισαγωγή της Νέας Κατάστασης Γραφικών στο ExtGState + +Τώρα που έχουμε ένα έτοιμο λεξικό, το προσθέτουμε απλώς κάτω από ένα νέο όνομα (`GS0`). Το όνομα πρέπει να είναι μοναδικό μέσα στη συλλογή `ExtGState` της σελίδας. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Αν αργότερα χρειαστεί να αναφερθείτε σε αυτήν την κατάσταση από ροές περιεχομένου, θα χρησιμοποιήσετε `/GS0` σε PDF operators όπως `gs`. Για τους σκοπούς αυτού του οδηγού, η προσθήκη είναι αρκετή για να δείξει **επεξεργασία πόρων PDF**. + +## Βήμα 5: Επαλήθευση (Προαιρετικό) και Αποθήκευση του Ενημερωμένου PDF + +Σε αυτό το σημείο η εσωτερική δομή του PDF έχει αλλάξει, αλλά η οπτική έξοδος δεν θα διαφέρει μέχρι να αναφερθείτε πραγματικά στο `GS0`. Παρόλα αυτά, μπορούμε να **αποθηκεύσουμε το ενημερωμένο PDF** και να εξετάσουμε το δέντρο αντικειμένων με έναν προβολέα PDF ή ένα εργαλείο όπως το `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **Τι να περιμένετε:** +> - Το `output.pdf` θα είναι ένα αντίγραφο byte‑for‑byte του `input.pdf` συν την νέα καταχώρηση `ExtGState`. +> - Ανοίγοντας το αρχείο σε έναν επεξεργαστή κειμένου (ή χρησιμοποιώντας εργαλείο επιθεώρησης PDF) θα δείτε ένα νέο αντικείμενο όπως: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> κάτω από το λεξικό `ExtGState`, με κλειδί `/GS0`. + +Αν θέλετε να δείτε το αποτέλεσμα σε δράση, προσθέστε μια απλή ροή περιεχομένου που χρησιμοποιεί τη νέα κατάσταση γραφικών: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Η εκτέλεση του προαιρετικού αποσπάσματος θα δημιουργήσει ένα ορθογώνιο με 50 % διαφάνεια, επιβεβαιώνοντας ότι η κατάσταση γραφικών λειτουργεί όπως προβλέπεται. + +## Συχνές Ερωτήσεις & Ακραίες Περιπτώσεις + +**Q: Τι γίνεται αν το PDF έχει ήδη μια καταχώρηση `GS0`;** +A: Η μέθοδος `Add` θα αντικαταστήσει το υπάρχον κλειδί. Για να αποφύγετε συγκρούσεις, δημιουργήστε ένα μοναδικό όνομα (π.χ., `GS1`, `GS_custom`) ή ελέγξτε πρώτα `extGState.ContainsKey("GS0")`. + +**Q: Μπορώ να επεξεργαστώ άλλους τύπους πόρων, όπως γραμματοσειρές ή XObjects;** +A: Απόλυτα. Η `DictionaryEditor` λειτουργεί για οποιοδήποτε κορυφαίο κλειδί πόρων (`Font`, `XObject`, `ColorSpace`, κ.λπ.). Απλώς αντικαταστήστε το `"ExtGState"` με το επιθυμητό όνομα λεξικού. + +**Q: Λειτουργεί αυτή η προσέγγιση με κρυπτογραφημένα PDF;** +A: Αν το PDF είναι προστατευμένο με κωδικό, πρέπει να παρέχετε τον κωδικό κατά τη δημιουργία του αντικειμένου `Document`: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Μετά την αποκρυπτογράφηση μπορείτε να επεξεργαστείτε τους πόρους ακριβώς με τον ίδιο τρόπο. + +**Q: Θα αυξηθεί αισθητά το μέγεθος του αρχείου;** +A: Η προσθήκη ενός μικρού λεξικού όπως αυτό προσθέτει συνήθως μόνο μερικές εκατοντάδες bytes. Αν προσθέσετε μεγάλα XObjects ή ενσωματώσετε εικόνες, περιμένετε μεγαλύτερη αύξηση. + +## Συμπέρασμα + +Τώρα ξέρετε πώς να **αποθηκεύσετε ενημερωμένα PDF** αρχεία μετά από άμεση **επεξεργασία πόρων PDF** με το Aspose.Pdf. Η διαδικασία περιορίζεται στη φόρτωση του εγγράφου, τον εντοπισμό του λεξικού `ExtGState`, τη δημιουργία μιας νέας κατάστασης γραφικών, την εισαγωγή της και, τέλος, την αποθήκευση του αποτελέσματος. Από εδώ μπορείτε να πειραματιστείτε με άλλους τύπους πόρων, να αλυσίδετε πολλαπλές καταστάσεις γραφικών ή να δημιουργήσετε μια επαναχρησιμοποιήσιμη βοηθητική μέθοδο για μαζικές τροποποιήσεις. + +Επόμενα βήματα; Δοκιμάστε να αλλάξετε τη λειτουργία ανάμειξης σε `"Multiply"` ή `"Screen"` και δείτε πώς συμπεριφέρονται τα επικαλυπτόμενα αντικείμενα. Ή εξερευνήστε την επεξεργασία του λεξικού `Font` για ενσωμάτωση προσαρμοσμένων γραμματοσειρών επί τόπου. Η προδιαγραφή PDF είναι πλούσια, και το Aspose.Pdf σας δίνει + +## Τι Θα Πρέπει Να Μάθετε Στη Σύντομη Μελλοντική + +Τα παρακάτω tutorials καλύπτουν στενά συναφή θέματα που επεκτείνουν τις τεχνικές που παρουσιάστηκαν σε αυτόν τον οδηγό. Κάθε πόρος περιλαμβάνει πλήρη λειτουργικά παραδείγματα κώδικα με βήμα‑βήμα εξηγήσεις για να σας βοηθήσουν να κυριαρχήσετε πρόσθετες δυνατότητες του API και να εξερευνήσετε εναλλακτικές προσεγγίσεις υλοποίησης στα δικά σας έργα. + +- [Aspose Pdf Net Άνοιγμα Τροποποίηση Αποθήκευση PDF](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [Πώς να Εξάγετε & Αποθηκεύσετε Συγκεκριμένες Σελίδες PDF Χρησιμοποιώντας Aspose.PDF για .NET - Ένας Πλήρης Οδηγός](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [Πώς να Προσθέσετε Σχόλια Συνημμένων Αρχείων σε PDF Χρησιμοποιώντας Aspose.PDF για .NET | Οδηγός Βήμα-Βήμα](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/hindi/net/document-manipulation/_index.md b/pdf/hindi/net/document-manipulation/_index.md index ce35c6768f..0556340ce3 100644 --- a/pdf/hindi/net/document-manipulation/_index.md +++ b/pdf/hindi/net/document-manipulation/_index.md @@ -195,13 +195,13 @@ Aspose.PDF नेट के लिए एक कोड ट्यूटोरि इस व्यापक गाइड के साथ .NET के लिए Aspose.PDF का उपयोग करके PDF पृष्ठों को कुशलतापूर्वक अलग-अलग फ़ाइलों में विभाजित करना सीखें। आज ही अपने दस्तावेज़ हेरफेर कौशल को बढ़ाएँ। ### [.NET के लिए Aspose.PDF का उपयोग करके PDF पृष्ठों को कैसे विभाजित करें: एक व्यापक गाइड](./split-pdf-pages-aspose-pdf-net/) -जानें कि .NET के लिए Aspose.PDF का उपयोग करके PDF से विशिष्ट पृष्ठों को अलग-अलग फ़ाइलों में कैसे विभाजित किया जाए। यह गाइड स्ट्रीम हैंडलिंग और सेटअप को कवर करती है। +जानें कि .NET के लिए Aspose.PDF का उपयोग करके PDF से विशिष्ट पृष्ठों को अलग-अलग फ़ाइलों में कैसे विभाजित किया जाए। यह गाइड स्ट्रीम हैंडलिंग और सेटअप को कवर करता है। ### [.NET के लिए Aspose.PDF का उपयोग करके PDF पृष्ठों को कैसे विभाजित करें: एक चरण-दर-चरण मार्गदर्शिका](./split-pdf-pages-aspose-pdf-net-guide/) इस व्यापक गाइड के साथ .NET के लिए Aspose.PDF का उपयोग करके PDF पृष्ठों को विभाजित करना सीखें। C# में दस्तावेज़ हेरफेर में महारत हासिल करें और अपने वर्कफ़्लो को अनुकूलित करें। -### [.NET के लिए Aspose.PDF का उपयोग करके PDF से रिक्त स्थान कैसे काटें: एक व्यापक मार्गदर्शिका](./trim-white-space-aspose-pdf-net/) -जानें कि .NET के लिए Aspose.PDF का उपयोग करके PDF दस्तावेज़ों से सफ़ेद स्थान को कुशलतापूर्वक कैसे ट्रिम किया जाए। यह गाइड सेटअप, तकनीक और अनुकूलन युक्तियों को कवर करती है। +### [.NET के लिए Aspose.PDF का उपयोग करके PDF से रिक्त स्थान कैसे काटें: एक व्यापक गाइड](./trim-white-space-aspose-pdf-net/) +जानें कि .NET के लिए Aspose.PDF का उपयोग करके PDF दस्तावेज़ों से सफ़ेद स्थान को कुशलतापूर्वक कैसे ट्रिम किया जाए। यह गाइड सेटअप, तकनीक और अनुकूलन युक्तियों को कवर करता है। ### [.NET के लिए Aspose.PDF का उपयोग करके PDF फ़ाइलों में लिंक कैसे अपडेट करें: एक व्यापक गाइड](./update-links-pdfs-aspose-pdf-dotnet/) .NET के लिए Aspose.PDF का उपयोग करके PDF फ़ाइलों में लिंक को प्रोग्रामेटिक रूप से अपडेट करना सीखें। इस चरण-दर-चरण मार्गदर्शिका के साथ लिंक अपडेट को कुशलतापूर्वक स्वचालित करें। @@ -303,13 +303,15 @@ Aspose.PDF नेट के लिए एक कोड ट्यूटोरि .NET और C# के लिए Aspose.PDF का उपयोग करके PDF फ़ाइल को अलग-अलग पृष्ठों में विभाजित करना सीखें। यह मार्गदर्शिका सेटअप, कार्यान्वयन और व्यावहारिक अनुप्रयोगों को कवर करती है। ### [.NET के लिए Aspose.PDF के साथ PDF पृष्ठों को अलग-अलग फ़ाइलों में विभाजित करें: एक व्यापक गाइड](./aspose-pdf-split-pdf-pages-net/) -जानें कि .NET के लिए Aspose.PDF का उपयोग करके PDF पृष्ठों को अलग-अलग फ़ाइलों में कैसे विभाजित किया जाए। यह व्यापक गाइड सेटअप, कार्यान्वयन और अनुकूलन युक्तियों को कवर करती है। +जानें कि .NET के लिए Aspose.PDF का उपयोग करके PDF पृष्ठों को अलग-अलग फ़ाइलों में कैसे विभाजित किया जाए। यह व्यापक गाइड सेटअप, कार्यान्वयन और अनुकूलन युक्तियों को कवर करता है। ### [Aspose.PDF .NET का उपयोग करके PDF फ़ाइलें विभाजित करें और बनाएँ | दस्तावेज़ हेरफेर गाइड](./split-create-pdf-aspose-pdf-net/) .NET के लिए Aspose.PDF का उपयोग करके मल्टी-पेज PDF को विभाजित करने और नई PDF फ़ाइलें बनाने का तरीका जानें। कोड उदाहरणों के साथ इस व्यापक गाइड का पालन करें। ### [Aspose.PDF .NET के साथ PDF मैनिपुलेशन के लिए अंतिम गाइड: टेक्स्ट को कुशलतापूर्वक लोड, सेव और रिप्लेस करें](./master-pdf-manipulation-aspose-pdf-net/) -.NET के लिए Aspose.PDF का उपयोग करके PDF में हेरफेर करने का तरीका जानें। यह गाइड PDF में टेक्स्ट लोड करने, सहेजने और बदलने के बारे में बताती है, जो दक्षता चाहने वाले डेवलपर्स के लिए आदर्श है। + +### [अपडेटेड PDF सहेजें – Aspose.Pdf के साथ PDF संसाधनों को संपादित करें](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Aspose.Pdf के साथ PDF को संपादित करने के बाद अपडेटेड फ़ाइल को सुरक्षित रूप से सहेजने की प्रक्रिया सीखें। ## अतिरिक्त संसाधन diff --git a/pdf/hindi/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/hindi/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..62fa75acb2 --- /dev/null +++ b/pdf/hindi/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-07-23 +description: Aspose.Pdf का उपयोग करके C# में अपडेटेड PDF सहेजें। सीखें कि कैसे ExtGState + जैसी PDF संसाधनों को संपादित करें और कुछ ही चरणों में नई फ़ाइल बनाएं। +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: hi +lastmod: 2026-07-23 +og_description: Aspose.Pdf का उपयोग करके C# में अपडेटेड PDF को सहेजें। यह ट्यूटोरियल + दिखाता है कि PDF संसाधनों को कैसे संपादित करें, ग्राफ़िक्स स्टेट जोड़ें, और नई फ़ाइल + आउटपुट करें। +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: अपडेटेड PDF सहेजें – Aspose.Pdf के साथ PDF संसाधनों को संपादित करें (C# + गाइड) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: अपडेटेड PDF सहेजें – Aspose.Pdf के साथ PDF संसाधनों को संपादित करें +url: /hi/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# अपडेटेड PDF सहेजें – Aspose.Pdf के साथ PDF संसाधनों को संपादित करें + +क्या आपने कभी सोचा है कि लो‑लेवल ऑब्जेक्ट्स को ट्यून करने के बाद **save updated PDF** कैसे सहेजें? शायद आपको अपारदर्शिता, ब्लेंड मोड, या अन्य ग्राफ़िक्स पैरामीटर बदलने की जरूरत है बिना पूरे दस्तावेज़ को फिर से बनाए। संक्षेप में, आप सीधे **edit PDF resources** करना चाहते हैं। यह गाइड आपको ठीक वही दिखाएगा, Aspose.Pdf for .NET का उपयोग करके। + +हम एक मौजूदा PDF लोड करके, उसकी रिसोर्स डिक्शनरी में डुबकी लगाकर, एक नया ग्राफ़िक्स स्टेट इंजेक्ट करेंगे, और अंत में **save the updated PDF** करेंगे। अंत तक आपके पास एक काम करने वाला C# स्निपेट होगा जिसे आप किसी भी प्रोजेक्ट में डाल सकते हैं—कोई रहस्यमयी डिपेंडेंसी नहीं, सिर्फ शुद्ध कोड। + +## आप क्या सीखेंगे + +- Aspose.Pdf के साथ PDF खोलना और पहले पेज की रिसोर्स डिक्शनरी ढूँढना। +- `ExtGState` डिक्शनरी जैसी **edit PDF resources** करने के चरण। +- एक कस्टम ग्राफ़िक्स स्टेट (`GS0`) बनाना और इन्सर्ट करना जो स्ट्रोक/फिल अपारदर्शिता और ब्लेंड मोड को नियंत्रित करता है। +- **save the updated PDF** को नई फ़ाइल में सहेजना, सभी मूल सामग्री को संरक्षित रखते हुए। + +**Prerequisites**: .NET 6+ (या .NET Framework 4.6+), Aspose.Pdf की लाइसेंस या इवैल्यूएशन कॉपी, और C# की बुनियादी समझ। यदि आपने कभी डिक्शनरी लेवल पर PDF को नहीं छुआ है, तो चिंता न करें—यह ट्यूटोरियल प्रत्येक कॉल के “क्यों” को समझाता है। + +--- + +![Diagram of PDF resource editing](image.png){.align-center alt="PDF संसाधनों को संपादित करने और फिर अपडेटेड PDF सहेजने का आरेख"} + +## अपडेटेड PDF सहेजें – पूर्ण कार्यप्रवाह अवलोकन + +कोड में कूदने से पहले, चलिए हाई‑लेवल फ्लो को रेखांकित करते हैं: + +1. **Load** the source PDF. +2. **Grab** the first page and its `Resources` dictionary. +3. **Navigate** to the `ExtGState` sub‑dictionary where graphics states live. +4. **Create** a new `CosPdfDictionary` describing our custom graphics state. +5. **Insert** that dictionary back into `ExtGState` under a unique key (`GS0`). +6. **Save** the modified document as a new file. + +बस इतना ही—छह छोटे‑छोटे कदम, प्रत्येक कुछ ही लाइनों के C# में समेटे हुए। तैयार? चलिए शुरू करते हैं। + +## Step 1: Load the PDF Document + +फ़ाइल खोलना सबसे सरल भाग है। Aspose.Pdf का `Document` क्लास पाथ या स्ट्रीम लेता है, इसलिए आप इसे किसी भी मौजूदा PDF की ओर इशारा कर सकते हैं। + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Why a `using` block?** +> It guarantees the file handle is released as soon as we finish, preventing lock‑issues when we later attempt to **save the updated PDF**. + +## Step 2: Edit PDF Resources – Access the ExtGState Dictionary + +PDF के हर पेज में एक *resource dictionary* होता है जो फ़ॉन्ट, इमेज और ग्राफ़िक्स स्टेट्स को समूहित करता है। अपारदर्शिता या ब्लेंड मोड बदलने के लिए हमें `ExtGState` एंट्री चाहिए। + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Pro tip:** Not all PDFs contain an `ExtGState` entry by default. The conditional block above ensures we don’t throw a `KeyNotFoundException` and still lets us **edit PDF resources** safely. + +## Step 3: Create a New Graphics State Dictionary + +एक ग्राफ़िक्स स्टेट (`GS`) मूलतः की‑वैल्यू पेयर्स का सेट होता है जिसे PDF रेंडरर ड्रॉ करने से पहले देखता है। यहाँ हम स्ट्रोक अपारदर्शिता (`CA`), फ़िल अपारदर्शिता (`ca`) और ब्लेंड मोड (`BM`) को परिभाषित करेंगे। + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Why these keys?** +> - `CA` controls the **stroke** opacity, affecting lines and borders. +> - `ca` controls the **fill** opacity, influencing shapes and text fills. +> - `BM` selects a blend mode; “Normal” is the most common but alternatives like “Multiply” exist for creative effects. + +## Step 4: Insert the New Graphics State into ExtGState + +अब जब हमारे पास तैयार‑डिक्शनरी है, हम इसे बस एक नए नाम (`GS0`) के तहत जोड़ देते हैं। नाम पेज के `ExtGState` कलेक्शन में यूनिक होना चाहिए। + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +यदि बाद में आपको इस स्टेट को कंटेंट स्ट्रीम से रेफ़र करना पड़े, तो आप PDF ऑपरेटर जैसे `gs` में `/GS0` का उपयोग करेंगे। इस ट्यूटोरियल के उद्देश्य के लिए, इसे जोड़ना ही **editing PDF resources** को दर्शाने के लिए पर्याप्त है। + +## Step 5: Verify (Optional) and Save the Updated PDF + +इस चरण पर PDF की आंतरिक संरचना बदल गई है, लेकिन विज़ुअल आउटपुट तब तक नहीं बदलेगा जब तक आप वास्तव में `GS0` को रेफ़र नहीं करते। फिर भी, हम **save the updated PDF** कर सकते हैं और PDF व्यूअर या `pdfcpu` जैसे टूल से ऑब्जेक्ट ट्री को inspect कर सकते हैं। + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **What to expect:** +> - `output.pdf` will be a byte‑for‑byte copy of `input.pdf` plus the new `ExtGState` entry. +> - Opening the file in a text editor (or using a PDF inspection tool) will reveal a new object like: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> under the `ExtGState` dictionary, keyed as `/GS0`. + +यदि आप प्रभाव को वास्तविकता में देखना चाहते हैं, तो एक सरल कंटेंट स्ट्रीम जोड़ें जो नए ग्राफ़िक्स स्टेट का उपयोग करता हो: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +वैकल्पिक स्निपेट चलाने से आपको 50 % ट्रांसपेरेंट रेक्टैंगल मिलेगा, जिससे पुष्टि होगी कि ग्राफ़िक्स स्टेट इच्छित रूप से काम कर रहा है। + +--- + +## सामान्य प्रश्न एवं किनारे के मामलों + +**Q: क्या होगा अगर PDF में पहले से ही `GS0` एंट्री मौजूद है?** +A: `Add` मेथड मौजूदा की को ओवरराइट कर देगा। टकराव से बचने के लिए यूनिक नाम जेनरेट करें (जैसे `GS1`, `GS_custom`) या पहले `extGState.ContainsKey("GS0")` चेक करें। + +**Q: क्या मैं फ़ॉन्ट या XObjects जैसी अन्य रिसोर्स टाइप्स को भी एडिट कर सकता हूँ?** +A: बिल्कुल। `DictionaryEditor` किसी भी टॉप‑लेवल रिसोर्स की (`Font`, `XObject`, `ColorSpace`, आदि) के लिए काम करता है। बस `"ExtGState"` को इच्छित डिक्शनरी नाम से बदल दें। + +**Q: क्या यह तरीका एन्क्रिप्टेड PDFs के साथ काम करता है?** +A: यदि PDF पासवर्ड‑प्रोटेक्टेड है, तो `Document` ऑब्जेक्ट बनाते समय पासवर्ड प्रदान करना होगा: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +डिक्रिप्शन के बाद आप रिसोर्सेज को बिल्कुल वही तरीका से एडिट कर सकते हैं। + +**Q: क्या फ़ाइल का आकार उल्लेखनीय रूप से बढ़ेगा?** +A: इस तरह का छोटा डिक्शनरी जोड़ने से आमतौर पर केवल कुछ सौ बाइट्स बढ़ते हैं। यदि आप बड़े XObjects या इमेजेज एम्बेड करते हैं, तो आकार में बड़ा इजाफा देख सकते हैं। + +## निष्कर्ष + +अब आप जानते हैं कि Aspose.Pdf के साथ सीधे **edit PDF resources** करने के बाद **save updated PDF** फ़ाइलें कैसे बनायीँ। प्रक्रिया मूल रूप से डॉक्यूमेंट लोड करना, `ExtGState` डिक्शनरी ढूँढना, नया ग्राफ़िक्स स्टेट बनाना, उसे इन्सर्ट करना, और अंत में परिणाम को सहेजना है। अब आप अन्य रिसोर्स टाइप्स के साथ प्रयोग कर सकते हैं, कई ग्राफ़िक्स स्टेट्स को चेन कर सकते हैं, या बल्क मॉडिफिकेशन के लिए रियूज़ेबल हेल्पर मेथड बना सकते हैं। + +अगला कदम? ब्लेंड मोड को `"Multiply"` या `"Screen"` में बदलें और देखें कि ओवरलैपिंग ऑब्जेक्ट्स कैसे व्यवहार करते हैं। या `Font` डिक्शनरी को एडिट करके ऑन‑द‑फ़्लाई कस्टम फ़ॉन्ट एम्बेड करने की कोशिश करें। PDF स्पेसिफिकेशन बहुत समृद्ध है, और Aspose.Pdf आपको + +## आपको आगे क्या सीखना चाहिए? + +निम्नलिखित ट्यूटोरियल्स इस गाइड में दिखाए गए तकनीकों पर आधारित निकटतम विषयों को कवर करते हैं। प्रत्येक संसाधन में पूर्ण कार्यशील कोड उदाहरण और चरण‑दर‑चरण व्याख्याएँ शामिल हैं, जो आपको अतिरिक्त API फीचर्स में महारत हासिल करने और अपने प्रोजेक्ट्स में वैकल्पिक इम्प्लीमेंटेशन अप्रोचेज़ को एक्सप्लोर करने में मदद करेंगे। + +- [Aspose Pdf Net Open Modify Save Pdfs](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [How to Extract & Save Specific PDF Pages Using Aspose.PDF for .NET - A Comprehensive Guide](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [How to Add File Attachment Annotations in PDFs Using Aspose.PDF for .NET | Step-by-Step Guide](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/hongkong/net/document-manipulation/_index.md b/pdf/hongkong/net/document-manipulation/_index.md index a58dce7482..a1219a81f6 100644 --- a/pdf/hongkong/net/document-manipulation/_index.md +++ b/pdf/hongkong/net/document-manipulation/_index.md @@ -17,7 +17,7 @@ ## 可用教程 -### [使用 Aspose.PDF for .NET 為 PDF 新增日期和時間戳](./aspose-pdf-net-date-time-stamps-annotations/) +### [使用 Aspose.PDF for .NET 為 PDF 新增日期和時間戳記註解](./aspose-pdf-net-date-time-stamps-annotations/) 了解如何使用 Aspose.PDF for .NET 有效率地將日期和時間戳記或註解新增至 PDF 文件中。透過這些簡單易行的步驟來增強文件管理。 ### [使用 Aspose.PDF for .NET 為 PDF 新增頁尾](./add-footer-pdf-aspose-dotnet/) @@ -309,7 +309,8 @@ Aspose.PDF Net 程式碼教學 了解如何使用 Aspose.PDF for .NET 分割多頁 PDF 並建立新的 PDF 檔案。遵循本指南並提供程式碼範例。 ### [使用 Aspose.PDF .NET 進行 PDF 操作的終極指南:高效能載入、儲存和取代文本](./master-pdf-manipulation-aspose-pdf-net/) -了解如何使用 Aspose.PDF for .NET 掌握 PDF 操作。本指南涵蓋了 PDF 中的文字載入、保存和替換,非常適合追求效率的開發人員。 + +### [儲存已更新的 PDF – 使用 Aspose.Pdf 編輯 PDF 資源](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) ## 其他資源 diff --git a/pdf/hongkong/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/hongkong/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..b817115b09 --- /dev/null +++ b/pdf/hongkong/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,257 @@ +--- +category: general +date: 2026-07-23 +description: 使用 Aspose.Pdf 於 C# 儲存已更新的 PDF。學習如何編輯 PDF 資源(如 ExtGState),只需幾個步驟即可產生新檔案。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: zh-hant +lastmod: 2026-07-23 +og_description: 使用 Aspose.Pdf 於 C# 中儲存已更新的 PDF。本教學示範如何編輯 PDF 資源、加入圖形狀態,並輸出全新檔案。 +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: 儲存已更新的 PDF – 使用 Aspose.Pdf 編輯 PDF 資源(C# 指南) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: 儲存已更新的 PDF – 使用 Aspose.Pdf 編輯 PDF 資源 +url: /zh-hant/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 儲存已更新的 PDF – 使用 Aspose.Pdf 編輯 PDF 資源 + +有沒有想過在調整 PDF 的低階物件後,如何 **儲存已更新的 PDF**?也許你需要更改不透明度、混合模式或其他圖形參數,而不必重新建立整個文件。簡而言之,你想要直接 **編輯 PDF 資源**。本指南將一步步說明如何使用 Aspose.Pdf for .NET 完成此操作。 + +我們將從載入現有的 PDF 開始,深入其資源字典,注入新的圖形狀態,最後 **儲存已更新的 PDF**。完成後,你將得到一段可直接放入任何專案的 C# 範例程式碼——沒有神祕的相依性,只有純粹的程式碼。 + +## 你將學會 + +- 如何使用 Aspose.Pdf 開啟 PDF 並定位第一頁的資源字典。 +- 編輯 PDF 資源(例如 `ExtGState` 字典)的步驟。 +- 建立並插入自訂圖形狀態 (`GS0`),以控制筆畫/填充不透明度及混合模式。 +- 如何 **儲存已更新的 PDF** 為新檔案,保留所有原始內容。 + +**先決條件**:.NET 6+(或 .NET Framework 4.6+)、Aspose.Pdf 的授權或評估版,以及對 C# 的基本熟悉度。如果你從未在字典層級操作過 PDF,也不用擔心——本教學會說明每個呼叫背後的「原因」。 + +--- + +![PDF 資源編輯圖示](image.png){.align-center alt="顯示如何編輯 PDF 資源並儲存已更新 PDF 的圖示"} + +## 儲存已更新的 PDF – 完整工作流程概覽 + +在進入程式碼之前,先概述一下高層次的流程: + +1. **Load** 原始 PDF。 +2. **Grab** 第一頁及其 `Resources` 字典。 +3. **Navigate** 前往包含圖形狀態的 `ExtGState` 子字典。 +4. **Create** 一個描述自訂圖形狀態的 `CosPdfDictionary`。 +5. **Insert** 將該字典以唯一鍵 (`GS0`) 插回 `ExtGState`。 +6. **Save** 將修改後的文件儲存為新檔案。 + +就是這樣——六個簡單步驟,每個步驟只需幾行 C# 程式碼。準備好了嗎?讓我們開始吧。 + +## 步驟 1:載入 PDF 文件 + +開啟檔案是最簡單的部分。Aspose.Pdf 的 `Document` 類別接受路徑或串流,因此你可以指向任何現有的 PDF。 + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **為什麼使用 `using` 區塊?** +> 它保證在完成後立即釋放檔案句柄,避免在稍後嘗試 **儲存已更新的 PDF** 時發生鎖定問題。 + +## 步驟 2:編輯 PDF 資源 – 存取 ExtGState 字典 + +PDF 的每一頁都有一個 *資源字典*,用來彙總字型、影像與圖形狀態。若要更改不透明度或混合模式,我們需要 `ExtGState` 條目。 + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **專業提示:** 並非所有 PDF 預設都有 `ExtGState` 條目。上面的條件區塊確保我們不會拋出 `KeyNotFoundException`,同時仍能安全地 **編輯 PDF 資源**。 + +## 步驟 3:建立新的圖形狀態字典 + +圖形狀態 (`GS`) 本質上是一組鍵值對,PDF 渲染器在繪製前會參考它們。這裡我們將定義筆畫不透明度 (`CA`)、填充不透明度 (`ca`) 與混合模式 (`BM`)。 + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **為什麼使用這些鍵?** +> - `CA` 控制 **筆畫** 不透明度,影響線條與邊框。 +> - `ca` 控制 **填充** 不透明度,影響形狀與文字填充。 +> - `BM` 選擇混合模式;「Normal」最常見,但像「Multiply」等替代模式可用於創意效果。 + +## 步驟 4:將新圖形狀態插入 ExtGState + +現在我們已有現成的字典,只需以新名稱 (`GS0`) 加入即可。此名稱在該頁的 `ExtGState` 集合中必須唯一。 + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +如果之後需要在內容串流中引用此狀態,你會在 PDF 操作符(如 `gs`)中使用 `/GS0`。本教學僅示範 **編輯 PDF 資源**,只要加入即可。 + +## 步驟 5:驗證(可選)並儲存已更新的 PDF + +此時 PDF 的內部結構已變更,但視覺輸出不會有差異,除非你真的引用 `GS0`。不過,我們仍可 **儲存已更新的 PDF**,並使用 PDF 檢視器或 `pdfcpu` 等工具檢查物件樹。 + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **預期結果:** +> - `output.pdf` 將是 `input.pdf` 的逐位元拷貝,外加新的 `ExtGState` 條目。 +> - 使用文字編輯器開啟檔案(或使用 PDF 檢查工具)會看到類似以下的新物件: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> 位於 `ExtGState` 字典下,鍵名為 `/GS0`。 + +如果想實際看到效果,加入一段使用新圖形狀態的簡單內容串流: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +執行可選的程式碼片段會產生一個 50 % 透明的矩形,證實圖形狀態如預期運作。 + +## 常見問題與邊緣情況 + +**Q: 如果 PDF 已經有 `GS0` 條目呢?** +A: `Add` 方法會覆寫現有的鍵。為避免衝突,可產生唯一名稱(例如 `GS1`、`GS_custom`),或先檢查 `extGState.ContainsKey("GS0")`。 + +**Q: 我可以編輯其他資源類型,例如字型或 XObject 嗎?** +A: 當然可以。`DictionaryEditor` 可用於任何頂層資源鍵(`Font`、`XObject`、`ColorSpace` 等)。只需將 `"ExtGState"` 替換為目標字典名稱。 + +**Q: 這種做法能用於加密的 PDF 嗎?** +A: 若 PDF 受密碼保護,必須在建立 `Document` 物件時提供密碼: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +解密後即可以完全相同的方式編輯資源。 + +**Q: 檔案大小會明顯增加嗎?** +A: 加入這樣的小字典通常只會增加幾百位元組。如果加入大型 XObject 或嵌入影像,則會有較大的增幅。 + +## 結論 + +現在你已了解如何使用 Aspose.Pdf 直接 **編輯 PDF 資源** 後 **儲存已更新的 PDF**。整個流程就是載入文件、定位 `ExtGState` 字典、建立新圖形狀態、插入它,最後將結果寫入檔案。接下來,你可以嘗試其他資源類型、串接多個圖形狀態,或建立可重複使用的輔助方法以批次修改。 + +接下來的步驟?嘗試將混合模式改為 `"Multiply"` 或 `"Screen"`,觀察重疊物件的表現。或探索編輯 `Font` 字典,即時嵌入自訂字型。PDF 規格相當豐富,而 Aspose.Pdf 為你提供 + +## 接下來該學什麼? + +以下教學涵蓋與本指南技術密切相關的主題。每個資源皆提供完整可運作的程式碼範例與逐步說明,協助你精通更多 API 功能,並在自己的專案中探索替代實作方式。 + +- [Aspose Pdf .NET 開啟、修改與儲存 PDF](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [使用 Aspose.PDF for .NET 提取與儲存特定 PDF 頁面 - 完整指南](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [使用 Aspose.PDF for .NET 在 PDF 中新增檔案附件註解 | 步驟說明指南](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/hungarian/net/document-manipulation/_index.md b/pdf/hungarian/net/document-manipulation/_index.md index 00006f12f5..77fad5255b 100644 --- a/pdf/hungarian/net/document-manipulation/_index.md +++ b/pdf/hungarian/net/document-manipulation/_index.md @@ -240,7 +240,7 @@ Ismerje meg, hogyan kezelheti programozottan a PDF-eket .NET-ben az Aspose.PDF h Ismerje meg, hogyan automatizálhatja a PDF-feladatokat az Aspose.PDF for .NET használatával, beleértve a fájlok összefűzését, oldalak hozzáadását, szövegbélyegzők beszúrását és hivatkozások létrehozását. ### [PDF-manipuláció mestere az Aspose.PDF .NET segítségével: Dokumentumok egyszerű betöltése és módosítása](./mastering-pdf-manipulation-aspose-dotnet/) -Tanuld meg, hogyan töltheted be, navigálhatsz és módosíthatod a PDF dokumentumokat a hatékony Aspose.PDF .NET könyvtár segítségével. Fejleszd alkalmazásaid még ma! +Tanuld meg, hogyan töltheted be, navigálhatsz és módosíthatsz PDF dokumentumokat a hatékony Aspose.PDF .NET könyvtár segítségével. Fejleszd alkalmazásaid még ma! ### [PDF-manipuláció mestere az Aspose.PDF .NET segítségével: Betöltési, keresési és jegyzetelési útmutató](./aspose-pdf-dotnet-mastering-pdfs-manipulation-guide/) Tanuld meg elsajátítani a PDF-manipulációt az Aspose.PDF for .NET segítségével. Ez az útmutató a dokumentumok betöltését, a szövegkeresést és az olyan megjegyzések alkalmazását ismerteti, mint az áthúzás. @@ -311,6 +311,9 @@ Tanuld meg, hogyan oszthatsz fel többoldalas PDF fájlokat és hogyan hozhatsz ### [Végső útmutató a PDF-manipulációhoz az Aspose.PDF .NET segítségével: Szöveg hatékony betöltése, mentése és cseréje](./master-pdf-manipulation-aspose-pdf-net/) Tanuld meg, hogyan mesterien manipulálhatod a PDF-eket az Aspose.PDF for .NET segítségével. Ez az útmutató a PDF-ekben lévő szöveg betöltését, mentését és cseréjét ismerteti, ideális a hatékonyságra törekvő fejlesztők számára. +### [Frissített PDF mentése – PDF erőforrások szerkesztése az Aspose.PDF segítségével](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Tanulja meg, hogyan mentheted el a módosított PDF-et és szerkesztheted a PDF erőforrásokat az Aspose.PDF .NET könyvtárral. + ## További források - [Aspose.PDF a hálózati dokumentációhoz](https://docs.aspose.com/pdf/net/) diff --git a/pdf/hungarian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/hungarian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..726b2b5a66 --- /dev/null +++ b/pdf/hungarian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,260 @@ +--- +category: general +date: 2026-07-23 +description: Mentse a frissített PDF-et az Aspose.Pdf használatával C#-ban. Tanulja + meg, hogyan szerkesztheti a PDF erőforrásokat, például az ExtGState-et, és néhány + lépésben készíthet új fájlt. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: hu +lastmod: 2026-07-23 +og_description: Mentse a frissített PDF-et az Aspose.Pdf segítségével C#-ban. Ez az + útmutató bemutatja, hogyan szerkeszthető a PDF erőforrások, hogyan adhatunk hozzá + grafikus állapotot, és hogyan hozhatunk létre egy új fájlt. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Frissített PDF mentése – PDF erőforrások szerkesztése az Aspose.Pdf segítségével + (C# útmutató) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Frissített PDF mentése – PDF erőforrások szerkesztése az Aspose.Pdf segítségével +url: /hu/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Frissített PDF mentése – PDF erőforrások szerkesztése az Aspose.Pdf segítségével + +Gondolkodtál már azon, hogyan **mentheted a frissített PDF‑et** miután módosítottad az alacsony szintű objektumait? Lehet, hogy az átlátszóságot, keverési módokat vagy más grafikai paramétereket kell megváltoztatnod anélkül, hogy újra létrehoznád az egész dokumentumot. Röviden, közvetlenül **PDF erőforrásokat** szeretnél szerkeszteni. Ez az útmutató pontosan ezt mutatja be, az Aspose.Pdf for .NET használatával. + +Először betöltünk egy meglévő PDF‑et, belemerülünk a resource dictionary‑jébe, beillesztünk egy új graphics state‑et, majd végül **mentjük a frissített PDF‑et**. A végére egy működő C# kódrészletet kapsz, amelyet bármely projektbe beilleszthetsz – nincsenek rejtett függőségek, csak tiszta kód. + +## Mit fogsz megtanulni + +- Hogyan nyissunk meg egy PDF‑et az Aspose.Pdf‑vel, és találjuk meg az első oldal erőforrás‑szótárát. +- A lépések a **PDF erőforrások** szerkesztéséhez, például az `ExtGState` szótár. +- Egy egyedi grafikai állapot (`GS0`) létrehozása és beszúrása, amely szabályozza a vonal/kifűtés átlátszóságát és a keverési módot. +- Hogyan **menthetjük a frissített PDF‑et** egy új fájlba, megőrizve az összes eredeti tartalmat. + +**Előfeltételek**: .NET 6+ (vagy .NET Framework 4.6+), egy licenc vagy értékelő verzió az Aspose.Pdf‑ből, valamint alapvető C# ismeretek. Ha még sosem nyúltál PDF‑hez a szótár szintjén, ne aggódj – ez az útmutató elmagyarázza minden hívás „miértjét”. + +![PDF erőforrás szerkesztés diagramja](image.png){.align-center alt="Diagram, amely bemutatja a PDF erőforrások szerkesztését, majd a frissített PDF mentését"} + +## Frissített PDF mentése – Teljes munkafolyamat áttekintése + +Mielőtt a kódba ugrunk, vázoljuk fel a magas szintű folyamatot: + +1. **Töltsd be** a forrás PDF‑et. +2. **Szerezd meg** az első oldalt és annak `Resources` szótárát. +3. **Navigálj** az `ExtGState` al‑szótárba, ahol a grafikai állapotok találhatók. +4. **Hozz létre** egy új `CosPdfDictionary`‑t, amely leírja az egyedi grafikai állapotunkat. +5. **Illeszd be** ezt a szótárat vissza az `ExtGState`‑be egy egyedi kulcs alatt (`GS0`). +6. **Mentsd el** a módosított dokumentumot egy új fájlba. + +Ennyi – hat apró lépés, mindegyik néhány C# sorba sűrítve. Készen állsz? Kezdjünk is. + +## 1. lépés: PDF dokumentum betöltése + +A fájl megnyitása a legegyszerűbb rész. Az Aspose.Pdf `Document` osztályja útvonalat vagy stream‑et fogad, így bármely meglévő PDF‑re mutathatsz. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Miért `using` blokk?** +> Biztosítja, hogy a fájlkezelő azonnal felszabadul, amint befejezzük, elkerülve a zárolási problémákat, amikor később **menteni szeretnénk a frissített PDF‑et**. + +## 2. lépés: PDF erőforrások szerkesztése – Az ExtGState szótár elérése + +Minden PDF‑oldalnak van egy *resource dictionary*‑je, amely a betűtípusokat, képeket és grafikai állapotokat csoportosítja. Az átlátszóság vagy keverési mód megváltoztatásához szükségünk van az `ExtGState` bejegyzésre. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Pro tipp:** Nem minden PDF tartalmaz alapértelmezés szerint `ExtGState` bejegyzést. A fenti feltételes blokk biztosítja, hogy ne dobjunk `KeyNotFoundException`‑t, és mégis biztonságosan **szerkeszthessük a PDF erőforrásokat**. + +## 3. lépés: Új grafikai állapot szótár létrehozása + +Egy graphics state (`GS`) lényegében kulcs‑érték párok halmaza, amelyet a PDF renderelő a rajzolás előtt lekérdez. Itt definiáljuk a vonal átlátszóságát (`CA`), a kitöltés átlátszóságát (`ca`) és a keverési módot (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Miért ezek a kulcsok?** +> - `CA` szabályozza a **vonal** átlátszóságát, befolyásolva a vonalakat és szegélyeket. +> - `ca` szabályozza a **kitöltés** átlátszóságát, hatással a formákra és szövegek kitöltésére. +> - `BM` választ egy keverési módot; a „Normal” a leggyakoribb, de például a „Multiply” kreatív hatásokhoz is használható. + +## 4. lépés: Az új grafikai állapot beszúrása az ExtGState-be + +Most, hogy megvan a kész szótár, egyszerűen hozzáadjuk egy új név (`GS0`) alatt. A névnek egyedinek kell lennie az oldal `ExtGState` gyűjteményén belül. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Ha később tartalmi stream‑ekből szeretnéd hivatkozni ezt az állapotot, a `/GS0` szintaxist használod a PDF operátorokban, például `gs`. Ennek a tutorialnak a célja, hogy csak a **PDF erőforrások szerkesztését** demonstrálja, ezért a hozzáadás önmagában elegendő. + +## 5. lépés: Ellenőrzés (opcionális) és a frissített PDF mentése + +Ekkor már megváltozott a PDF belső struktúrája, de a vizuális kimenet csak akkor változik, ha ténylegesen hivatkozol a `GS0`‑ra. Ennek ellenére **menthetjük a frissített PDF‑et**, és megtekinthetjük az objektumfát egy PDF‑nézővel vagy a `pdfcpu`‑val. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **Mit várhatsz?** +> - `output.pdf` egy byte‑ról‑byte‑ra másolata lesz az `input.pdf`‑nek, plusz az új `ExtGState` bejegyzés. +> - A fájl szövegszerkesztőben (vagy PDF‑ellenőrző eszközzel) megjelenik egy új objektum, például: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> az `ExtGState` szótár alatt, `/GS0` kulccsal. + +Ha látni szeretnéd a hatást, adj hozzá egy egyszerű tartalmi stream‑et, amely az új grafikai állapotot használja: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Az opcionális kódrészlet futtatása egy 50 % átlátszó téglalapot eredményez, ezzel megerősítve, hogy a grafikai állapot a várt módon működik. + +## Gyakori kérdések és széljegyek + +**Q: Mi van, ha a PDF már tartalmaz egy `GS0` bejegyzést?** +A: Az `Add` metódus felülírja a meglévő kulcsot. Az ütközések elkerülése érdekében generálj egyedi nevet (pl. `GS1`, `GS_custom`), vagy előbb ellenőrizd az `extGState.ContainsKey("GS0")` feltételt. + +**Q: Szerkeszthetek más erőforrás típusokat is, például betűtípusokat vagy XObject‑eket?** +Igen. A `DictionaryEditor` bármely felső‑szintű erőforrás kulcshoz működik (`Font`, `XObject`, `ColorSpace` stb.). Csak cseréld le a `"ExtGState"`‑t a kívánt szótár nevére. + +**Q: Működik ez a módszer titkosított PDF‑ekkel is?** +Ha a PDF jelszóval védett, a `Document` objektum létrehozásakor meg kell adni a jelszót: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +A feloldás után ugyanúgy szerkesztheted az erőforrásokat. + +**Q: Jelentősen megnő a fájlméret?** +Egy ilyen kis szótár hozzáadása általában csak néhány száz byte‑ot növeli a méretet. Nagy XObject‑ek vagy beágyazott képek esetén nagyobb ugrásra számíthatsz. + +## Következtetés + +Most már tudod, hogyan **menthetsz frissített PDF‑fájlokat** közvetlenül **PDF erőforrások szerkesztésével** az Aspose.Pdf‑vel. A folyamat lényegében a dokumentum betöltése, az `ExtGState` szótár megtalálása, egy új grafikai állapot létrehozása, annak beszúrása, majd a végeredmény mentése. Innen már kísérletezhetsz más erőforrás típusokkal, láncolhatsz több grafikai állapotot, vagy építhetsz újrahasználható segédfüggvényt tömeges módosításokhoz. + +Következő lépések? Próbáld ki a keverési mód cseréjét „Multiply” vagy „Screen” értékre, és figyeld meg, hogyan viselkednek az átfedő objektumok. Vagy nézd meg a `Font` szótár szerkesztését, hogy futás közben egyedi betűtípusokat ágyazhass be. A PDF specifikáció gazdag, és az Aspose.Pdf mindenhez megadja a lehetőséget. + +## Mit érdemes legközelebb megtanulni? + +Az alábbi tutorialok szorosan kapcsolódó témákat fednek le, amelyek a jelen útmutatóban bemutatott technikákra épülnek. Minden forrás komplett, 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 a saját projektjeidben. + +- [Aspose Pdf .NET megnyitás, módosítás, PDF mentése](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [Hogyan vonjunk ki és mentsünk el specifikus PDF oldalakat az Aspose.PDF for .NET használatával – Átfogó útmutató](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [Hogyan adjunk hozzá fájlcsatolás-annotációkat PDF-ekhez az Aspose.PDF for .NET használatával | Lépésről‑lépésre útmutató](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/indonesian/net/document-manipulation/_index.md b/pdf/indonesian/net/document-manipulation/_index.md index f8af05fce5..619d49574d 100644 --- a/pdf/indonesian/net/document-manipulation/_index.md +++ b/pdf/indonesian/net/document-manipulation/_index.md @@ -306,11 +306,14 @@ Pelajari cara membagi file PDF menjadi beberapa halaman menggunakan Aspose.PDF u Pelajari cara membagi halaman PDF menjadi beberapa file terpisah menggunakan Aspose.PDF untuk .NET. Panduan lengkap ini mencakup kiat penyiapan, penerapan, dan pengoptimalan. ### [Membagi dan Membuat File PDF Menggunakan Aspose.PDF .NET | Panduan Manipulasi Dokumen](./split-create-pdf-aspose-pdf-net/) -Pelajari cara membagi PDF multi-halaman dan membuat file PDF baru menggunakan Aspose.PDF untuk .NET. Ikuti panduan lengkap ini dengan contoh kode. +Pelajari cara membagi PDF multi-halaman dan membuat file PDF baru menggunakan Aspose.PDF .NET. Ikuti panduan lengkap ini dengan contoh kode. ### [Panduan Lengkap untuk Manipulasi PDF dengan Aspose.PDF .NET: Memuat, Menyimpan & Mengganti Teks Secara Efisien](./master-pdf-manipulation-aspose-pdf-net/) Pelajari cara menguasai manipulasi PDF menggunakan Aspose.PDF untuk .NET. Panduan ini mencakup pemuatan, penyimpanan, dan penggantian teks dalam PDF, ideal bagi pengembang yang menginginkan efisiensi. +### [Simpan PDF yang Diperbarui – Edit Sumber Daya PDF dengan Aspose.Pdf](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Pelajari cara menyimpan PDF yang telah diperbarui setelah mengedit sumber daya PDF menggunakan Aspose.Pdf. + ## Sumber Daya Tambahan - [Dokumentasi Aspose.PDF untuk Net](https://docs.aspose.com/pdf/net/) diff --git a/pdf/indonesian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/indonesian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..7277975270 --- /dev/null +++ b/pdf/indonesian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,264 @@ +--- +category: general +date: 2026-07-23 +description: Simpan PDF yang diperbarui menggunakan Aspose.Pdf di C#. Pelajari cara + mengedit sumber daya PDF seperti ExtGState dan menghasilkan file baru dalam beberapa + langkah saja. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: id +lastmod: 2026-07-23 +og_description: Simpan PDF yang diperbarui dengan Aspose.Pdf di C#. Tutorial ini menunjukkan + cara mengedit sumber daya PDF, menambahkan keadaan grafis, dan menghasilkan file + baru. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Simpan PDF yang Diperbarui – Edit Sumber Daya PDF dengan Aspose.Pdf (Panduan + C#) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Simpan PDF yang Diperbarui – Edit Sumber Daya PDF dengan Aspose.Pdf +url: /id/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Simpan PDF yang Diperbarui – Edit Sumber Daya PDF dengan Aspose.Pdf + +Pernah bertanya-tanya bagaimana cara **menyimpan PDF yang diperbarui** setelah mengubah objek‑objek tingkat‑rendahnya? Mungkin Anda perlu mengubah opacity, blend mode, atau parameter grafis lainnya tanpa harus membuat ulang seluruh dokumen. Singkatnya, Anda ingin **mengedit sumber daya PDF** secara langsung. Panduan ini akan memandu Anda langkah demi langkah, menggunakan Aspose.Pdf untuk .NET. + +Kami akan mulai dengan memuat PDF yang ada, menyelami kamus sumber dayanya, menyuntikkan state grafis baru, dan akhirnya **menyimpan PDF yang diperbarui**. Pada akhir tutorial Anda akan memiliki potongan kode C# yang dapat langsung digunakan dalam proyek apa pun—tanpa ketergantungan misterius, hanya kode murni. + +## Apa yang Akan Anda Pelajari + +- Cara membuka PDF dengan Aspose.Pdf dan menemukan kamus sumber daya halaman pertama. +- Langkah‑langkah untuk **mengedit sumber daya PDF** seperti kamus `ExtGState`. +- Membuat dan menyisipkan state grafis khusus (`GS0`) yang mengontrol opacity garis/pengisian dan blend mode. +- Cara **menyimpan PDF yang diperbarui** ke file baru, sambil mempertahankan semua konten asli. + +**Prasyarat**: .NET 6+ (atau .NET Framework 4.6+), lisensi atau salinan evaluasi Aspose.Pdf, dan pemahaman dasar tentang C#. Jika Anda belum pernah menyentuh PDF pada level kamus, jangan khawatir—tutorial ini menjelaskan “mengapa” di balik setiap pemanggilan. + +--- + +![Diagram of PDF resource editing](image.png){.align-center alt="Diagram yang menunjukkan cara mengedit sumber daya PDF dan kemudian menyimpan PDF yang diperbarui"} + +## Simpan PDF yang Diperbarui – Ikhtisar Alur Kerja Lengkap + +Sebelum kita masuk ke kode, mari kita rangkum alur tingkat‑tinggi: + +1. **Load** PDF sumber. +2. **Grab** halaman pertama dan kamus `Resources`‑nya. +3. **Navigate** ke sub‑kamus `ExtGState` tempat state grafis berada. +4. **Create** `CosPdfDictionary` baru yang mendeskripsikan state grafis khusus kami. +5. **Insert** kamus tersebut kembali ke `ExtGState` dengan kunci unik (`GS0`). +6. **Save** dokumen yang dimodifikasi sebagai file baru. + +Itu saja—enam langkah kecil, masing‑masing dibungkus dalam beberapa baris C#. Siap? Ayo mulai. + +## Langkah 1: Muat Dokumen PDF + +Membuka file adalah bagian paling sederhana. Kelas `Document` milik Aspose.Pdf menerima path atau stream, sehingga Anda dapat menunjuk ke PDF apa pun yang sudah ada. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Mengapa blok `using`?** +> Ini menjamin handle file dilepaskan segera setelah selesai, mencegah masalah penguncian ketika kita kemudian mencoba **menyimpan PDF yang diperbarui**. + +## Langkah 2: Edit Sumber Daya PDF – Akses Kamus ExtGState + +Setiap halaman dalam PDF memiliki *kamus sumber daya* yang mengelompokkan font, gambar, dan state grafis. Untuk mengubah opacity atau blend mode kita memerlukan entri `ExtGState`. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Pro tip:** Tidak semua PDF berisi entri `ExtGState` secara default. Blok kondisional di atas memastikan kita tidak melempar `KeyNotFoundException` dan tetap memungkinkan kita **mengedit sumber daya PDF** dengan aman. + +## Langkah 3: Buat Kamus State Grafis Baru + +State grafis (`GS`) pada dasarnya adalah sekumpulan pasangan kunci‑nilai yang dirujuk renderer PDF sebelum menggambar. Di sini kita akan mendefinisikan opacity garis (`CA`), opacity isi (`ca`), dan blend mode (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Mengapa kunci‑kunci ini?** +> - `CA` mengontrol opacity **stroke**, memengaruhi garis dan batas. +> - `ca` mengontrol opacity **fill**, memengaruhi bentuk dan isi teks. +> - `BM` memilih blend mode; “Normal” adalah yang paling umum tetapi alternatif seperti “Multiply” ada untuk efek kreatif. + +## Langkah 4: Sisipkan State Grafis Baru ke dalam ExtGState + +Sekarang kita memiliki kamus siap pakai, kita cukup menambahkannya dengan nama baru (`GS0`). Nama tersebut harus unik dalam koleksi `ExtGState` halaman. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Jika nanti Anda perlu merujuk state ini dari aliran konten, Anda akan menggunakan `/GS0` dalam operator PDF seperti `gs`. Untuk tujuan tutorial ini, cukup menambahkannya sudah cukup untuk mendemonstrasikan **mengedit sumber daya PDF**. + +## Langkah 5: Verifikasi (Opsional) dan Simpan PDF yang Diperbarui + +Pada titik ini struktur internal PDF telah berubah, tetapi output visual tidak akan berbeda sampai Anda benar‑benar merujuk `GS0`. Namun, kita tetap dapat **menyimpan PDF yang diperbarui** dan memeriksa pohon objek dengan penampil PDF atau alat seperti `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **Apa yang diharapkan:** +> - `output.pdf` akan menjadi salinan byte‑per‑byte dari `input.pdf` ditambah entri `ExtGState` baru. +> - Membuka file di editor teks (atau menggunakan alat inspeksi PDF) akan menampilkan objek baru seperti: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> di dalam kamus `ExtGState`, dengan kunci `/GS0`. + +Jika Anda ingin melihat efeknya secara langsung, tambahkan aliran konten sederhana yang menggunakan state grafis baru: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Menjalankan potongan kode opsional akan menghasilkan persegi panjang 50 % transparan, mengonfirmasi bahwa state grafis berfungsi sebagaimana mestinya. + +--- + +## Pertanyaan Umum & Kasus Tepi + +**Q: What if the PDF already has a `GS0` entry?** +A: Metode `Add` akan menimpa kunci yang ada. Untuk menghindari tabrakan, buat nama unik (misalnya `GS1`, `GS_custom`) atau periksa `extGState.ContainsKey("GS0")` terlebih dahulu. + +**Q: Can I edit other resource types, like fonts or XObjects?** +A: Tentu saja. `DictionaryEditor` berfungsi untuk kunci sumber daya tingkat atas mana pun (`Font`, `XObject`, `ColorSpace`, dll.). Cukup ganti `"ExtGState"` dengan nama kamus yang diinginkan. + +**Q: Does this approach work with encrypted PDFs?** +A: Jika PDF dilindungi kata sandi, Anda harus menyediakan kata sandi saat membuat objek `Document`: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Setelah dekripsi Anda dapat mengedit sumber daya dengan cara yang sama persis. + +**Q: Will the file size increase noticeably?** +A: Menambahkan kamus kecil seperti ini biasanya hanya menambah beberapa ratus byte. Jika Anda menambahkan XObject besar atau menyematkan gambar, harapkan peningkatan yang lebih besar. + +## Kesimpulan + +Anda kini tahu cara **menyimpan file PDF yang diperbarui** setelah langsung **mengedit sumber daya PDF** dengan Aspose.Pdf. Prosesnya menyederhanakan menjadi memuat dokumen, menemukan kamus `ExtGState`, membuat state grafis baru, menyisipkannya, dan akhirnya menyimpan hasilnya. Dari sini Anda dapat bereksperimen dengan tipe sumber daya lain, menggabungkan beberapa state grafis, atau membuat metode bantu yang dapat digunakan kembali untuk modifikasi massal. + +Langkah selanjutnya? Coba ganti blend mode menjadi `"Multiply"` atau `"Screen"` dan lihat bagaimana objek yang tumpang tindih berperilaku. Atau jelajahi mengedit kamus `Font` untuk menyematkan font khusus secara langsung. Spesifikasi PDF sangat kaya, dan Aspose.Pdf memberi Anda + +## Apa yang Harus Anda Pelajari Selanjutnya? + +Tutorial berikut mencakup topik yang terkait erat dan 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. + +- [Aspose Pdf .NET Buka Modifikasi Simpan PDF](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [Cara Mengekstrak & Menyimpan Halaman PDF Tertentu Menggunakan Aspose.PDF untuk .NET - Panduan Komprehensif](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [Cara Menambahkan Anotasi Lampiran File di PDF Menggunakan Aspose.PDF untuk .NET | Panduan Langkah demi Langkah](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/italian/net/document-manipulation/_index.md b/pdf/italian/net/document-manipulation/_index.md index ab686be1cb..7eb81a6a91 100644 --- a/pdf/italian/net/document-manipulation/_index.md +++ b/pdf/italian/net/document-manipulation/_index.md @@ -311,6 +311,9 @@ Scopri come dividere PDF multipagina e creare nuovi file PDF utilizzando Aspose. ### [Guida definitiva alla manipolazione di PDF con Aspose.PDF .NET: carica, salva e sostituisci il testo in modo efficiente](./master-pdf-manipulation-aspose-pdf-net/) Scopri come padroneggiare la manipolazione dei PDF utilizzando Aspose.PDF per .NET. Questa guida illustra come caricare, salvare e sostituire il testo nei PDF, ideale per gli sviluppatori che cercano efficienza. +### [Salva PDF aggiornato – Modifica le risorse PDF con Aspose.Pdf](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Scopri come salvare un PDF aggiornato dopo aver modificato le risorse PDF utilizzando Aspose.Pdf per .NET. + ## Risorse aggiuntive - [Aspose.PDF per la documentazione di rete](https://docs.aspose.com/pdf/net/) diff --git a/pdf/italian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/italian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..037da56c02 --- /dev/null +++ b/pdf/italian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,258 @@ +--- +category: general +date: 2026-07-23 +description: Salva il PDF aggiornato usando Aspose.Pdf in C#. Scopri come modificare + le risorse PDF come ExtGState e creare un nuovo file in pochi passaggi. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: it +lastmod: 2026-07-23 +og_description: Salva PDF aggiornato con Aspose.Pdf in C#. Questo tutorial mostra + come modificare le risorse PDF, aggiungere uno stato grafico e generare un nuovo + file. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Salva PDF aggiornato – Modifica le risorse PDF con Aspose.Pdf (Guida C#) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Salva PDF aggiornato – Modifica risorse PDF con Aspose.Pdf +url: /it/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Salva PDF Aggiornato – Modifica le Risorse PDF con Aspose.Pdf + +Ti sei mai chiesto come **salvare PDF aggiornato** dopo aver modificato i suoi oggetti di basso livello? Forse devi cambiare l'opacità, i blend mode o altri parametri grafici senza ricreare l'intero documento. In breve, vuoi **modificare le risorse PDF** direttamente. Questa guida ti mostra esattamente come fare, usando Aspose.Pdf per .NET. + +Inizieremo caricando un PDF esistente, esplorando il suo dizionario delle risorse, inserendo un nuovo stato grafico e infine **salvando il PDF aggiornato**. Alla fine avrai uno snippet C# funzionante da inserire in qualsiasi progetto—senza dipendenze misteriose, solo codice puro. + +## Cosa Imparerai + +- Come aprire un PDF con Aspose.Pdf e individuare il dizionario delle risorse della prima pagina. +- I passaggi per **modificare le risorse PDF** come il dizionario `ExtGState`. +- Creare e inserire uno stato grafico personalizzato (`GS0`) che controlla l'opacità del tratto/pieno e il blend mode. +- Come **salvare il PDF aggiornato** in un nuovo file, preservando tutto il contenuto originale. + +**Prerequisiti**: .NET 6+ (o .NET Framework 4.6+), una licenza o una copia di valutazione di Aspose.Pdf, e una conoscenza di base di C#. Se non hai mai toccato un PDF a livello di dizionario, non preoccuparti—questo tutorial spiega il “perché” di ogni chiamata. + +![Diagramma che mostra come modificare le risorse PDF e poi salvare il PDF aggiornato](image.png){.align-center alt="Diagramma che mostra come modificare le risorse PDF e poi salvare il PDF aggiornato"} + +## Salva PDF Aggiornato – Panoramica del Flusso di Lavoro Completo + +Prima di tuffarci nel codice, delineiamo il flusso ad alto livello: + +1. **Carica** il PDF di origine. +2. **Recupera** la prima pagina e il suo dizionario `Resources`. +3. **Naviga** al sotto-dizionario `ExtGState` dove vivono gli stati grafici. +4. **Crea** un nuovo `CosPdfDictionary` che descrive il nostro stato grafico personalizzato. +5. **Inserisci** quel dizionario nuovamente in `ExtGState` sotto una chiave unica (`GS0`). +6. **Salva** il documento modificato come un nuovo file. + +È tutto—sei piccoli passaggi, ciascuno racchiuso in poche righe di C#. Pronto? Andiamo. + +## Passo 1: Carica il Documento PDF + +Aprire un file è la parte più semplice. La classe `Document` di Aspose.Pdf accetta un percorso o uno stream, così puoi puntarla a qualsiasi PDF esistente. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Perché un blocco `using`?** +> Garantisce che il handle del file venga rilasciato non appena terminiamo, prevenendo problemi di blocco quando più tardi tentiamo di **salvare il PDF aggiornato**. + +## Passo 2: Modifica le Risorse PDF – Accedi al Dizionario ExtGState + +Ogni pagina in un PDF ha un *dizionario delle risorse* che raggruppa font, immagini e stati grafici. Per cambiare l'opacità o il blend mode abbiamo bisogno della voce `ExtGState`. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Consiglio professionale:** Non tutti i PDF contengono una voce `ExtGState` di default. Il blocco condizionale sopra garantisce che non venga lanciata una `KeyNotFoundException` e ci permette comunque di **modificare le risorse PDF** in modo sicuro. + +## Passo 3: Crea un Nuovo Dizionario di Stato Grafico + +Uno stato grafico (`GS`) è essenzialmente un insieme di coppie chiave‑valore che il renderer PDF consulta prima di disegnare. Qui definiremo l'opacità del tratto (`CA`), l'opacità del riempimento (`ca`) e il blend mode (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Perché queste chiavi?** +> - `CA` controlla l'opacità del **tratto**, influenzando linee e bordi. +> - `ca` controlla l'opacità del **riempimento**, influenzando forme e riempimenti di testo. +> - `BM` seleziona un blend mode; “Normal” è il più comune ma esistono alternative come “Multiply” per effetti creativi. + +## Passo 4: Inserisci il Nuovo Stato Grafico in ExtGState + +Ora che abbiamo un dizionario pronto, lo aggiungiamo semplicemente sotto un nuovo nome (`GS0`). Il nome deve essere unico all'interno della collezione `ExtGState` della pagina. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Se più tardi avrai bisogno di fare riferimento a questo stato dai flussi di contenuto, utilizzerai `/GS0` negli operatori PDF come `gs`. Per lo scopo di questo tutorial, aggiungerlo è sufficiente per dimostrare **la modifica delle risorse PDF**. + +## Passo 5: Verifica (Opzionale) e Salva il PDF Aggiornato + +A questo punto la struttura interna del PDF è cambiata, ma l'output visivo non differirà finché non farai effettivamente riferimento a `GS0`. Tuttavia, possiamo **salvare il PDF aggiornato** e ispezionare l'albero degli oggetti con un visualizzatore PDF o uno strumento come `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **Cosa aspettarsi:** +> - `output.pdf` sarà una copia byte‑per‑byte di `input.pdf` più la nuova voce `ExtGState`. +> - Aprire il file in un editor di testo (o usando uno strumento di ispezione PDF) rivelerà un nuovo oggetto simile a: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> sotto il dizionario `ExtGState`, indicizzato come `/GS0`. + +Se vuoi vedere l'effetto in azione, aggiungi un semplice flusso di contenuto che utilizza il nuovo stato grafico: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Eseguire lo snippet opzionale ti darà un rettangolo al 50 % trasparente, confermando che lo stato grafico funziona come previsto. + +## Domande Frequenti & Casi Limite + +**Q: E se il PDF ha già una voce `GS0`?** +A: Il metodo `Add` sovrascriverà la chiave esistente. Per evitare collisioni, genera un nome unico (ad esempio `GS1`, `GS_custom`) o controlla prima `extGState.ContainsKey("GS0")`. + +**Q: Posso modificare altri tipi di risorse, come font o XObject?** +A: Assolutamente. Il `DictionaryEditor` funziona per qualsiasi chiave di risorsa di livello superiore (`Font`, `XObject`, `ColorSpace`, ecc.). Basta sostituire `"ExtGState"` con il nome del dizionario desiderato. + +**Q: Questo approccio funziona con PDF criptati?** +A: Se il PDF è protetto da password, devi fornire la password quando costruisci l'oggetto `Document`: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Dopo la decrittazione puoi modificare le risorse esattamente allo stesso modo. + +**Q: La dimensione del file aumenterà in modo evidente?** +A: Aggiungere un piccolo dizionario come questo tipicamente aggiunge solo qualche centinaio di byte. Se aggiungi XObject di grandi dimensioni o incorpori immagini, aspettati un aumento più consistente. + +## Conclusione + +Ora sai come **salvare file PDF aggiornati** dopo aver **modificato direttamente le risorse PDF** con Aspose.Pdf. Il processo si riduce a caricare il documento, individuare il dizionario `ExtGState`, creare un nuovo stato grafico, inserirlo e infine persistere il risultato. Da qui puoi sperimentare con altri tipi di risorse, concatenare più stati grafici o costruire un metodo helper riutilizzabile per modifiche in blocco. + +Prossimi passi? Prova a cambiare il blend mode in `"Multiply"` o `"Screen"` e osserva come si comportano gli oggetti sovrapposti. Oppure esplora la modifica del dizionario `Font` per incorporare font personalizzati al volo. La specifica PDF è ricca, e Aspose.Pdf ti offre + +## 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. + +- [Aspose Pdf Net Apri Modifica Salva Pdf](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [Come Estrarre & Salvare Pagine PDF Specifiche Usando Aspose.PDF per .NET - Guida Completa](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [Come Aggiungere Annotazioni di Allegato File nei PDF Usando Aspose.PDF per .NET | Guida Passo‑Passo](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/japanese/net/document-manipulation/_index.md b/pdf/japanese/net/document-manipulation/_index.md index efaa98a3c7..a4345aa8b0 100644 --- a/pdf/japanese/net/document-manipulation/_index.md +++ b/pdf/japanese/net/document-manipulation/_index.md @@ -261,7 +261,7 @@ Aspose.PDF Net のコードチュートリアル Aspose.PDF for .NET を使用して、表や画像を使った動的なPDFヘッダーを作成する方法を学びましょう。ドキュメントのデザインを簡単に強化できます。 ### [Aspose.PDF for .NET で PDF 連結をマスターする: 総合ガイド](./mastering-pdf-concatenation-aspose-net-guide/) -Aspose.PDF for .NET を使用して複数の PDF ファイルをシームレスに連結する方法を学びましょう。このガイドでは、セットアップ、連結、破損したファイルの処理について説明します。 +Aspose.PDF for .NET を使用して�数の PDF ファイルをシームレスに連結する方法を学びましょう。このガイドでは、セットアップ、連結、破損したファイルの処理について説明します。 ### [PDF 管理をマスターする: Aspose.PDF .NET による効率的なページ方向、色、空白検出](./aspose-pdf-net-page-orientation-color-blank-detection/) Aspose.PDF for .NET を使用して、ページの向きを変更したり、白色を検出したり、空白ページを識別したりすることで、PDF ドキュメントを効率的に管理する方法を学習します。 @@ -311,6 +311,9 @@ Aspose.PDF for .NET を使用して、複数ページのPDFを分割し、新し ### [Aspose.PDF .NET による PDF 操作の究極ガイド: テキストを効率的に読み込み、保存し、置換する](./master-pdf-manipulation-aspose-pdf-net/) Aspose.PDF for .NET を使って PDF 操作をマスターする方法を学びましょう。このガイドでは、PDF 内のテキストの読み込み、保存、置換について解説しており、効率性を重視する開発者に最適です。 +### [更新された PDF を保存 – Aspose.Pdf で PDF リソースを編集する](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Aspose.PDF を使用して、編集した PDF リソースを保存し、最新の PDF ファイルを生成する方法を学びます。 + ## 追加リソース - [Aspose.PDF for Net ドキュメント](https://docs.aspose.com/pdf/net/) diff --git a/pdf/japanese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/japanese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..fb0e810837 --- /dev/null +++ b/pdf/japanese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,258 @@ +--- +category: general +date: 2026-07-23 +description: C#で Aspose.Pdf を使用して更新された PDF を保存します。ExtGState などの PDF リソースの編集方法を学び、数ステップで新しいファイルを作成しましょう。 +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: ja +lastmod: 2026-07-23 +og_description: C#でAspose.Pdfを使用して更新されたPDFを保存します。このチュートリアルでは、PDFリソースの編集、グラフィックスステートの追加、そして新しいファイルの出力方法を示します。 +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: 更新されたPDFを保存 – Aspose.PdfでPDFリソースを編集 (C# ガイド) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: 更新されたPDFを保存 – Aspose.PdfでPDFリソースを編集 +url: /ja/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 更新された PDF の保存 – Aspose.Pdf で PDF リソースを編集 + +低レベルオブジェクトを調整した後に **更新された PDF を保存** する方法を考えたことはありますか?不透明度やブレンドモード、その他のグラフィックパラメータを変更したいが、ドキュメント全体を再作成したくない場合があります。要するに、**PDF リソースを直接編集** したいわけです。このガイドでは、Aspose.Pdf for .NET を使用してその手順を詳しく解説します。 + +まず既存の PDF を読み込み、リソースディクショナリに入り、新しいグラフィックスステートを注入し、最後に **更新された PDF を保存** します。最後まで読めば、プロジェクトにそのまま組み込める C# スニペットが手に入ります—不明な依存関係はなく、純粋なコードだけです。 + +## 本チュートリアルで学べること + +- Aspose.Pdf を使って PDF を開き、最初のページのリソースディクショナリを取得する方法。 +- `ExtGState` ディクショナリなど、**PDF リソースを編集** する手順。 +- ストローク/塗りの不透明度とブレンドモードを制御するカスタムグラフィックスステート(`GS0`)の作成と挿入方法。 +- 元のコンテンツをすべて保持したまま、**更新された PDF を新しいファイルに保存** する方法。 + +**前提条件**: .NET 6+(または .NET Framework 4.6+)、Aspose.Pdf のライセンスまたは評価版、C# の基本的な知識。PDF のディクショナリレベルに触れたことがなくても大丈夫です—このチュートリアルでは各呼び出しの「なぜ」を丁寧に説明します。 + +--- + +![PDF リソース編集の図](image.png){.align-center alt="PDF リソースを編集し、更新された PDF を保存する様子を示す図"} + +## 更新された PDF の保存 – 全体ワークフロー概要 + +コードに入る前に、高レベルの流れを整理しましょう。 + +1. **PDF を読み込む**。 +2. **最初のページとその `Resources` ディクショナリを取得**。 +3. グラフィックスステートが格納されている `ExtGState` サブディクショナリへ **ナビゲート**。 +4. カスタムグラフィックスステートを記述した新しい `CosPdfDictionary` を **作成**。 +5. そのディクショナリをユニークなキー(`GS0`)で `ExtGState` に **挿入**。 +6. 変更したドキュメントを新しいファイルとして **保存**。 + +以上です—6つの小さなステップで、各ステップは数行の C# に収まります。準備はいいですか?さっそく始めましょう。 + +## Step 1: Load the PDF Document + +ファイルを開くのが最もシンプルな部分です。Aspose.Pdf の `Document` クラスはパスまたはストリームを受け取るので、任意の既存 PDF を指定できます。 + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **`using` ブロックが必要な理由** +> ファイルハンドルがすぐに解放されることを保証し、後で **更新された PDF を保存** しようとしたときのロック問題を防ぎます。 + +## Step 2: Edit PDF Resources – Access the ExtGState Dictionary + +PDF の各ページには、フォント、画像、グラフィックスステートなどをまとめた *リソースディクショナリ* が存在します。不透明度やブレンドモードを変更するには `ExtGState` エントリが必要です。 + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **プロのコツ**: すべての PDF がデフォルトで `ExtGState` エントリを持っているわけではありません。上記の条件分岐により `KeyNotFoundException` が発生せず、**PDF リソースを安全に編集** できます。 + +## Step 3: Create a New Graphics State Dictionary + +グラフィックスステート(`GS`)は、PDF レンダラが描画前に参照するキー‑バリューの集合です。ここではストローク不透明度(`CA`)、塗り不透明度(`ca`)、ブレンドモード(`BM`)を定義します。 + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **これらのキーの意味** +> - `CA` は **ストローク** の不透明度を制御し、線や枠に影響します。 +> - `ca` は **塗り** の不透明度を制御し、図形やテキストの塗りに影響します。 +> - `BM` はブレンドモードを選択します。最も一般的なのは “Normal” ですが、クリエイティブな効果のために “Multiply” なども利用できます。 + +## Step 4: Insert the New Graphics State into ExtGState + +準備ができたディクショナリを新しい名前(`GS0`)で追加するだけです。名前はページ内の `ExtGState` コレクションでユニークである必要があります。 + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +後でコンテンツストリームからこのステートを参照する場合は、PDF 演算子 `gs` とともに `/GS0` を使用します。このチュートリアルでは、**PDF リソースを編集** したことを示すために追加するだけで十分です。 + +## Step 5: Verify (Optional) and Save the Updated PDF + +この時点で PDF の内部構造は変化していますが、`GS0` を実際に参照しなければ視覚的な変化はありません。それでも **更新された PDF を保存** して、PDF ビューアや `pdfcpu` のようなツールでオブジェクトツリーを確認できます。 + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **期待される結果** +> - `output.pdf` は `input.pdf` のバイト単位のコピーに加えて、新しい `ExtGState` エントリが追加されたものになります。 +> - テキストエディタ(または PDF 検査ツール)で開くと、次のような新しいオブジェクトが `ExtGState` ディクショナリ内に `/GS0` キーで現れます: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` + +効果を実際に確認したい場合は、以下のシンプルなコンテンツストリームを追加してみてください。 + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +オプションのスニペットを実行すると、50 % 透明な矩形が描画され、グラフィックスステートが正しく機能していることが確認できます。 + +--- + +## Common Questions & Edge Cases + +**Q: PDF にすでに `GS0` エントリが存在する場合は?** +A: `Add` メソッドは既存のキーを上書きします。衝突を避けるには、`GS1` や `GS_custom` などユニークな名前を生成するか、`extGState.ContainsKey("GS0")` で事前にチェックしてください。 + +**Q: フォントや XObject など、他のリソースタイプも編集できるか?** +A: もちろんです。`DictionaryEditor` は任意のトップレベルリソースキー(`Font`、`XObject`、`ColorSpace` など)に対して機能します。目的のディクショナリ名に `"ExtGState"` の代わりに置き換えるだけです。 + +**Q: 暗号化された PDF でもこの手法は使えるか?** +A: PDF がパスワードで保護されている場合、`Document` オブジェクトを作成するときにパスワードを渡す必要があります: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +復号化後は、同じ手順でリソースを編集できます。 + +**Q: ファイルサイズは目立って増えるか?** +A: この程度の小さなディクショナリを追加しても、通常は数百バイト程度の増加にとどまります。大きな XObject を埋め込んだり画像を追加した場合は、サイズが大幅に増えることがあります。 + +## Conclusion + +これで、Aspose.Pdf を使って **PDF リソースを直接編集** し、**更新された PDF を保存** する方法がマスターできました。手順は、ドキュメントの読み込み → `ExtGState` ディクショナリの取得 → 新しいグラフィックスステートの作成 → 挿入 → 保存、というシンプルな流れです。ここからは、他のリソースタイプを試したり、複数のグラフィックスステートをチェーンしたり、バルク変更用のヘルパーメソッドを作成したりしてみてください。 + +次のステップとしては、ブレンドモードを `"Multiply"` や `"Screen"` に変更して、重なり合うオブジェクトの挙動を観察してみましょう。また、`Font` ディクショナリを編集して実行時にカスタムフォントを埋め込むことも可能です。PDF 仕様は奥深く、Aspose.Pdf があればその可能性は無限です。 + +## What Should You Learn Next? + +以下のチュートリアルは、本ガイドで示したテクニックを応用した、密接に関連するテーマを扱っています。各リソースには、完全な動作コード例とステップバイステップの解説が含まれているので、API の追加機能を習得したり、独自の実装アプローチを探求したりする際に役立ちます。 + +- [Aspose Pdf Net Open Modify Save Pdfs](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [How to Extract & Save Specific PDF Pages Using Aspose.PDF for .NET - A Comprehensive Guide](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [How to Add File Attachment Annotations in PDFs Using Aspose.PDF for .NET | Step-by-Step Guide](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/korean/net/document-manipulation/_index.md b/pdf/korean/net/document-manipulation/_index.md index e62bb9dea4..b1717dea1f 100644 --- a/pdf/korean/net/document-manipulation/_index.md +++ b/pdf/korean/net/document-manipulation/_index.md @@ -87,13 +87,13 @@ Aspose.PDF for .NET에서 N-Up 방식을 사용하여 PDF 페이지를 효율적 C#에서 문서를 조작하는 강력한 라이브러리인 Aspose.PDF for .NET을 사용하여 PDF 문서에서 페이지를 효율적으로 삭제하는 방법을 알아보세요. ### [.NET용 Aspose.PDF를 사용하여 페이지 추출: 포괄적인 가이드](./extract-pages-aspose-pdf-net/) -Aspose.PDF를 사용하여 .NET 애플리케이션에서 PDF의 특정 페이지를 효율적으로 추출하는 방법을 알아보세요. 이 가이드에서는 설정, 구현 및 실제 사용 사례를 다룹니다. +Aspose.PDF를 사용하여 .NET 애플리케이션에서 PDF의 특정 페이지를 효율적으로 추출하는 방법을 알아보세요. 이 가이드는 설정, 구현 및 실제 사용 사례를 다룹니다. ### [Aspose.PDF for .NET을 사용하여 PDF에서 특정 페이지 추출](./extract-pdf-pages-aspose-dotnet/) Aspose.PDF Net에 대한 코드 튜토리얼 ### [Aspose.PDF for .NET을 사용하여 PDF에서 TOC 페이지 번호 숨기기: 단계별 가이드](./hide-toc-page-numbers-aspose-pdf-dotnet/) -Aspose.PDF for .NET을 사용하여 PDF 파일의 목차에서 페이지 번호를 제거하는 방법을 알아보세요. 이 가이드에서는 단계별 지침과 주요 구성 옵션을 제공합니다. +Aspose.PDF for .NET을 사용하여 PDF 파일의 목차에서 페이지 번호를 제거하는 방법을 알아보세요. 이 가이드는 단계별 지침과 주요 구성 옵션을 제공합니다. ### [Aspose.PDF for .NET을 사용하여 PDF에 다양한 헤더를 추가하는 방법: 단계별 가이드](./add-different-headers-aspose-pdf-net/) 이 자세한 C# 튜토리얼을 통해 Aspose.PDF for .NET을 사용하여 PDF 문서의 각 페이지에 다양한 머리글을 추가하고 사용자 지정하는 방법을 알아보세요. @@ -105,7 +105,7 @@ Aspose.PDF for .NET을 사용하여 PDF 문서에 텍스트와 이미지를 포 Aspose.PDF for .NET을 사용하여 PDF 파일에 텍스트 머리글을 원활하게 추가하는 방법을 알아보고, 문서의 가독성과 구성을 향상시켜 보세요. ### [Aspose.PDF for .NET을 사용하여 PDF에 선 객체를 추가하는 방법: 단계별 가이드](./add-line-aspose-pdf-dotnet-tutorial/) -Aspose.PDF for .NET을 사용하여 PDF에 선 객체를 추가하는 방법을 알아보세요. 이 가이드에서는 설정, 코딩 예제, 그리고 실제 적용 사례를 다룹니다. +Aspose.PDF for .NET을 사용하여 PDF에 선 객체를 추가하는 방법을 알아보세요. 이 가이드는 설정, 코딩 예제, 그리고 실제 적용 사례를 다룹니다. ### [Aspose.PDF for .NET을 사용하여 PDF에 텍스트 스탬프 바닥글을 추가하는 방법: 단계별 가이드](./add-text-stamp-footer-aspose-pdf-net/) Aspose.PDF for .NET을 사용하여 PDF 문서의 모든 페이지에 텍스트 스탬프 바닥글을 추가하는 방법을 단계별 가이드를 통해 알아보세요. 문서 처리를 효율적으로 간소화하세요. @@ -117,7 +117,7 @@ Aspose.PDF for .NET을 사용하여 PDF 문서에 텍스트 스탬프를 효율 Aspose.PDF for .NET을 사용하여 PDF 끝에 빈 페이지를 원활하게 추가하는 방법을 알아보세요. 이 포괄적인 튜토리얼에서는 설정, 구현 및 모범 사례를 다룹니다. ### [Aspose.PDF for .NET을 사용하여 PDF에 페이지 번호를 추가하고 사용자 지정하는 방법 | 문서 조작 가이드](./add-customize-page-numbers-aspose-pdf-dot-net/) -Aspose.PDF for .NET을 사용하여 PDF 문서에 페이지 번호를 손쉽게 추가하고 사용자 지정하는 방법을 알아보세요. 이 종합 가이드에서는 설치, 사용자 지정 옵션, 그리고 성능 향상 팁을 다룹니다. +Aspose.PDF for .NET을 사용하여 PDF 문서에 페이지 번호를 손쉽게 추가하고 사용자 지정하는 방법을 알아보세요. 이 종합 가이드는 설치, 사용자 지정 옵션, 그리고 성능 향상 팁을 다룹니다. ### [Aspose.PDF .NET을 사용하여 PDF에 JavaScript를 추가하고 제거하는 방법: 포괄적인 가이드](./aspose-pdf-net-add-remove-javascript-pdfs/) Aspose.PDF for .NET을 사용하여 PDF 문서에 JavaScript 함수를 추가하고 제거하는 방법을 알아보세요. 단계별 가이드를 통해 문서의 상호 작용성과 기능을 향상시키세요. @@ -132,13 +132,13 @@ Aspose.PDF for .NET을 사용하여 여러 PDF 파일을 효율적으로 단일 이 상세 가이드를 통해 Aspose.PDF for .NET을 사용하여 PDF 파일을 효율적으로 추가하는 방법을 알아보세요. 효율적인 워크플로를 위한 문서 조작을 마스터하세요. ### [Aspose.PDF for .NET을 사용하여 PDF 페이지 크기를 변경하는 방법(단계별 가이드)](./change-pdf-page-sizes-aspose-dotnet/) -Aspose.PDF for .NET을 사용하여 PDF의 페이지 크기를 효율적으로 변경하는 방법을 알아보세요. 이 단계별 가이드에서는 설치, 사용 방법 및 실제 활용 방법을 다룹니다. +Aspose.PDF for .NET을 사용하여 PDF의 페이지 크기를 효율적으로 변경하는 방법을 알아보세요. 이 단계별 가이드는 설치, 사용 방법 및 실제 활용 방법을 다룹니다. ### [Aspose.PDF for .NET을 사용하여 PDF 스트림을 연결하는 방법: 완전한 가이드](./aspose-pdf-net-stream-concatenation-guide/) 이 포괄적인 가이드를 통해 Aspose.PDF for .NET을 사용하여 PDF 스트림을 연결하는 방법을 알아보세요. 단계별 지침, 사전 요구 사항 및 실제 적용 사례를 살펴보세요. ### [.NET용 Aspose.PDF를 사용하여 PDF를 연결하는 방법: 완전한 가이드](./concatenate-pdfs-aspose-pdf-dotnet-guide/) -Aspose.PDF for .NET을 사용하여 여러 PDF 파일을 병합하는 방법을 알아보세요. 이 포괄적인 가이드에서는 설정, 구현 및 실제 적용 사례를 다룹니다. +Aspose.PDF for .NET을 사용하여 여러 PDF 파일을 병합하는 방법을 알아보세요. 이 포괄적인 가이드는 설정, 구현 및 실제 적용 사례를 다룹니다. ### [Aspose.PDF for .NET을 사용하여 빈 페이지가 있는 PDF를 연결하는 방법: 완전한 가이드](./concatenate-pdfs-blank-pages-aspose-pdf-net/) Aspose.PDF for .NET을 사용하여 PDF 파일을 병합하고 빈 페이지를 추가하는 방법을 알아보세요. 문서 관리 워크플로를 효율적으로 간소화하세요. @@ -156,7 +156,7 @@ Aspose.PDF for .NET을 사용하여 PDF 페이지 크기를 A4 크기로 업데 Aspose.PDF for .NET을 사용하여 페이지 여백을 설정하고 선을 그리는 등 PDF를 사용자 지정하는 방법을 알아보세요. 문서 서식을 개선하려는 개발자에게 적합합니다. ### [Aspose.PDF .NET을 사용하여 PDF에서 페이지를 삭제하는 방법: 포괄적인 가이드](./delete-pdf-pages-aspose-net/) -Aspose.PDF for .NET을 사용하여 PDF 문서에서 특정 페이지를 쉽게 삭제하는 방법을 알아보세요. 이 단계별 가이드에서는 설정, 구현 및 모범 사례를 다룹니다. +Aspose.PDF for .NET을 사용하여 PDF 문서에서 특정 페이지를 쉽게 삭제하는 방법을 알아보세요. 이 단계별 가이드는 설정, 구현 및 모범 사례를 다룹니다. ### [.NET용 Aspose.PDF에서 파일 압축을 비활성화하는 방법: 단계별 가이드](./disable-file-compression-aspose-pdf-net-guide/) 이 종합 가이드를 통해 Aspose.PDF for .NET을 사용하여 PDF 파일 압축을 비활성화하는 방법을 알아보세요. 지금 바로 문서 처리 능력을 향상시켜 보세요. @@ -168,7 +168,7 @@ C# 애플리케이션에서 Aspose.PDF for .NET을 사용하여 PDF에서 특정 C#과 .NET에서 Aspose.PDF를 사용하여 PDF 파일에서 특정 페이지를 효율적으로 추출하는 방법을 알아보세요. 최적의 문서 조작을 위한 단계별 가이드를 따라해 보세요. ### [Aspose.PDF for .NET을 사용하여 PDF에서 숨겨진 텍스트와 검색 가능한 텍스트를 구현하는 방법](./aspose-pdf-dotnet-hidden-text-pdfs/) -Aspose.PDF for .NET을 사용하여 PDF 문서 내 숨겨진 텍스트를 관리하는 방법을 알아보세요. 이 가이드에서는 텍스트 가시성 추가, 검색 및 최적화 방법을 다룹니다. +Aspose.PDF for .NET을 사용하여 PDF 문서 내 숨겨진 텍스트를 관리하는 방법을 알아보세요. 이 가이드는 텍스트 가시성 추가, 검색 및 최적화 방법을 다룹니다. ### [Aspose.PDF for .NET을 사용하여 PDF에 페이지를 삽입하는 방법: 단계별 가이드](./insert-pages-into-pdf-aspose-net/) Aspose.PDF for .NET을 사용하여 한 PDF의 특정 페이지를 다른 PDF에 삽입하는 방법을 알아보세요. 이 단계별 가이드를 따라 문서 조작 능력을 향상시켜 보세요. @@ -189,19 +189,19 @@ Aspose.PDF for .NET을 사용하여 PDF 문서에서 모든 책갈피를 효율 Aspose.PDF .NET을 사용하여 PDF에서 모든 텍스트를 효율적으로 제거하는 방법을 알아보세요. 민감한 데이터를 보호하거나 문서를 정리하는 데 적합합니다. ### [Aspose.PDF for .NET을 사용하여 PDF 열기 작업을 제거하는 방법: 완전한 가이드](./remove-pdf-open-action-aspose-dotnet-guide/) -Aspose.PDF for .NET을 사용하여 PDF 파일에서 원치 않는 열기 동작을 제거하는 방법을 알아보세요. 이 가이드에서는 단계별 지침과 모범 사례를 제공합니다. +Aspose.PDF for .NET을 사용하여 PDF 파일에서 원치 않는 열기 동작을 제거하는 방법을 알아보세요. 이 가이드는 단계별 지침과 모범 사례를 제공합니다. ### [Aspose.PDF for .NET을 사용하여 PDF 페이지를 분할하는 방법: 완전한 가이드](./mastering-pdf-page-splitting-aspose-pdf-net/) 이 종합 가이드를 통해 Aspose.PDF for .NET을 사용하여 PDF 페이지를 개별 파일로 효율적으로 분할하는 방법을 알아보세요. 지금 바로 문서 처리 능력을 향상시켜 보세요. ### [Aspose.PDF for .NET을 사용하여 PDF 페이지를 분할하는 방법: 포괄적인 가이드](./split-pdf-pages-aspose-pdf-net/) -Aspose.PDF for .NET을 사용하여 PDF의 특정 페이지를 여러 파일로 분할하는 방법을 알아보세요. 이 가이드에서는 스트림 처리 및 설정에 대해 설명합니다. +Aspose.PDF for .NET을 사용하여 PDF의 특정 페이지를 여러 파일로 분할하는 방법을 알아보세요. 이 가이드는 스트림 처리 및 설정에 대해 설명합니다. ### [Aspose.PDF for .NET을 사용하여 PDF 페이지를 분할하는 방법: 단계별 가이드](./split-pdf-pages-aspose-pdf-net-guide/) 이 종합 가이드를 통해 Aspose.PDF for .NET을 사용하여 PDF 페이지를 분할하는 방법을 알아보세요. C#으로 문서 조작을 마스터하고 워크플로를 최적화하세요. ### [Aspose.PDF for .NET을 사용하여 PDF에서 공백을 제거하는 방법: 종합 가이드](./trim-white-space-aspose-pdf-net/) -Aspose.PDF for .NET을 사용하여 PDF 문서의 공백을 효율적으로 제거하는 방법을 알아보세요. 이 가이드에서는 설정, 기술 및 최적화 팁을 다룹니다. +Aspose.PDF for .NET을 사용하여 PDF 문서의 공백을 효율적으로 제거하는 방법을 알아보세요. 이 가이드는 설정, 기술 및 최적화 팁을 다룹니다. ### [Aspose.PDF for .NET을 사용하여 PDF 파일의 링크를 업데이트하는 방법: 포괄적인 가이드](./update-links-pdfs-aspose-pdf-dotnet/) Aspose.PDF for .NET을 사용하여 PDF 파일의 링크를 프로그래밍 방식으로 업데이트하는 방법을 알아보세요. 이 단계별 가이드를 통해 링크 업데이트를 효율적으로 자동화하세요. @@ -233,8 +233,8 @@ Aspose.PDF for .NET을 사용하여 PDF 문서 속성을 열고, 가져오고, ### [Aspose.PDF를 사용하여 .NET에서 PDF 조작 마스터하기: 종합 가이드](./master-pdf-manipulation-net-asposepdf/) Aspose.PDF for .NET을 사용하여 PDF를 효율적으로 관리하는 방법을 알아보세요. 이 자세한 가이드를 통해 PDF 파일을 원활하게 추가, 추출, 분할하는 방법을 알아보세요. -### [Aspose.PDF를 사용한 .NET에서의 PDF 조작 마스터하기: 종합 가이드](./aspose-pdf-net-tutorial/) -Aspose.PDF를 사용하여 .NET에서 PDF를 프로그래밍 방식으로 관리하는 방법을 알아보세요. 이 가이드에서는 문서 로드, 양식 필드 접근, 옵션 반복에 대해 다룹니다. +### [Aspose.PDF를 사용한 .NET에서 PDF 조작 마스터하기: 종합 가이드](./aspose-pdf-net-tutorial/) +Aspose.PDF를 사용하여 .NET에서 PDF를 프로그래밍 방식으로 관리하는 방법을 알아보세요. 이 가이드는 문서 로드, 양식 필드 접근, 옵션 반복에 대해 다룹니다. ### [Aspose.PDF .NET을 활용한 PDF 조작 마스터하기: 문서 자동화에 대한 포괄적인 가이드](./master-pdf-manipulation-aspose-dotnet-guide/) Aspose.PDF for .NET을 사용하여 파일 연결, 페이지 추가, 텍스트 스탬프 삽입, 링크 생성 등 PDF 작업을 자동화하는 방법을 알아보세요. @@ -276,10 +276,10 @@ Aspose.PDF for .NET을 사용하여 PDF 문서를 로드, 조작 및 정규식 Aspose.PDF Net에 대한 코드 튜토리얼 ### [Aspose.PDF를 사용하여 .NET에서 PDF 병합: 포괄적인 가이드](./merge-pdfs-net-aspose-pdf-tutorial/) -Aspose.PDF for .NET을 사용하여 PDF 파일을 원활하게 병합하는 방법을 알아보세요. 이 단계별 가이드에서는 설정, 구현 및 실제 적용 방법을 다룹니다. +Aspose.PDF for .NET을 사용하여 PDF 파일을 원활하게 병합하는 방법을 알아보세요. 이 단계별 가이드는 설정, 구현 및 실제 적용 방법을 다룹니다. ### [Aspose.PDF를 사용하여 .NET에서 PDF 양식 필드 이동: 단계별 가이드](./move-pdf-fields-aspose-pdf-dotnet-guide/) -Aspose.PDF for .NET을 사용하여 PDF 양식 필드를 손쉽게 이동하고 재배치하는 방법을 알아보세요. 이 가이드에서는 설정, 단계별 지침 및 문제 해결 팁을 다룹니다. +Aspose.PDF for .NET을 사용하여 PDF 양식 필드를 손쉽게 이동하고 재배치하는 방법을 알아보세요. 이 가이드는 설정, 단계별 지침 및 문제 해결 팁을 다룹니다. ### [PDF 조작을 더욱 간편하게: Aspose.PDF .NET 로딩, 저장 및 확대/축소 구성 가이드](./master-pdf-manipulation-aspose-dotnet-load-save-configure-page-zoom/) Aspose.PDF for .NET을 사용하여 PDF 조작을 마스터하세요. 치수를 로드, 저장, 추출하고 확대/축소 설정을 효율적으로 구성하는 방법을 알아보세요. @@ -294,16 +294,16 @@ Aspose.PDF Net에 대한 코드 튜토리얼 Aspose.PDF for .NET을 사용하여 PDF 페이지를 효율적으로 회전하고 치수를 가져오는 방법을 알아보세요. 이 포괄적인 가이드를 통해 문서 조작 능력을 향상시켜 보세요. ### [.NET에서 Aspose.PDF를 사용하여 PDF 페이지 회전: 개발자 가이드](./rotate-pdf-pages-aspose-pdf-dotnet/) -Aspose.PDF for .NET을 사용하여 PDF 페이지를 회전하는 방법을 알아보세요. 이 가이드에서는 특정 페이지를 각도별로 회전하는 방법을 설명하고, 효율적인 문서 조작을 위한 코드 예제를 제공합니다. +Aspose.PDF for .NET을 사용하여 PDF 페이지를 회전하는 방법을 알아보세요. 이 가이드는 특정 페이지를 각도별로 회전하는 방법을 설명하고, 효율적인 문서 조작을 위한 코드 예제를 제공합니다. ### [.NET Streams와 Aspose.PDF를 사용하여 특정 페이지에서 PDF 페이지 분할](./split-pdf-pages-with-net-streams-aspose-pdf/) Aspose.PDF와 .NET 스트림을 사용하여 특정 페이지에서 PDF 파일을 효율적으로 분할하는 방법을 알아보고 애플리케이션에서 문서 관리를 개선하세요. ### [Aspose.PDF .NET을 사용하여 PDF 페이지를 개별 파일로 분할하기(C# 튜토리얼)](./split-pdf-pages-aspose-net-csharp/) -Aspose.PDF for .NET 및 C#을 사용하여 PDF 파일을 개별 페이지로 분할하는 방법을 알아보세요. 이 가이드에서는 설정, 구현 및 실제 적용 사례를 다룹니다. +Aspose.PDF for .NET 및 C#을 사용하여 PDF 파일을 개별 페이지로 분할하는 방법을 알아보세요. 이 가이드는 설정, 구현 및 실제 적용 사례를 다룹니다. ### [Aspose.PDF for .NET을 사용하여 PDF 페이지를 별도의 파일로 분할: 포괄적인 가이드](./aspose-pdf-split-pdf-pages-net/) -Aspose.PDF for .NET을 사용하여 PDF 페이지를 여러 파일로 분할하는 방법을 알아보세요. 이 종합 가이드에서는 설정, 구현 및 최적화 팁을 다룹니다. +Aspose.PDF for .NET을 사용하여 PDF 페이지를 여러 파일로 분할하는 방법을 알아보세요. 이 종합 가이드는 설정, 구현 및 최적화 팁을 다룹니다. ### [Aspose.PDF .NET을 사용하여 PDF 파일 분할 및 생성 | 문서 조작 가이드](./split-create-pdf-aspose-pdf-net/) Aspose.PDF for .NET을 사용하여 여러 페이지로 구성된 PDF를 분할하고 새 PDF 파일을 만드는 방법을 알아보세요. 코드 예제와 함께 이 포괄적인 가이드를 따라해 보세요. @@ -311,6 +311,9 @@ Aspose.PDF for .NET을 사용하여 여러 페이지로 구성된 PDF를 분할 ### [Aspose.PDF .NET을 활용한 PDF 조작 완벽 가이드: 텍스트를 효율적으로 로드, 저장 및 바꾸기](./master-pdf-manipulation-aspose-pdf-net/) Aspose.PDF for .NET을 사용하여 PDF를 완벽하게 다루는 방법을 알아보세요. 이 가이드에서는 PDF의 텍스트 로드, 저장 및 바꾸기를 다루며, 효율성을 추구하는 개발자에게 이상적입니다. +### [업데이트된 PDF 저장 – Aspose.Pdf로 PDF 리소스 편집](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Aspose.PDF를 사용해 수정된 PDF를 저장하고 PDF 리소스를 편집하는 방법을 단계별로 안내합니다. + ## 추가 자료 - [Net 문서용 Aspose.PDF](https://docs.aspose.com/pdf/net/) diff --git a/pdf/korean/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/korean/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..bb9220df13 --- /dev/null +++ b/pdf/korean/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,257 @@ +--- +category: general +date: 2026-07-23 +description: C#에서 Aspose.Pdf를 사용해 업데이트된 PDF를 저장하세요. ExtGState와 같은 PDF 리소스를 편집하고 몇 + 단계만으로 새 파일을 만드는 방법을 배워보세요. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: ko +lastmod: 2026-07-23 +og_description: C#에서 Aspose.Pdf를 사용해 업데이트된 PDF를 저장합니다. 이 튜토리얼에서는 PDF 리소스를 편집하고, 그래픽 + 상태를 추가하며, 새로운 파일을 출력하는 방법을 보여줍니다. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: 업데이트된 PDF 저장 – Aspose.Pdf로 PDF 리소스 편집 (C# 가이드) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: 업데이트된 PDF 저장 – Aspose.Pdf로 PDF 리소스 편집 +url: /ko/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# 업데이트된 PDF 저장 – Aspose.Pdf로 PDF 리소스 편집 + +PDF의 저수준 객체를 조정한 후 **업데이트된 PDF를 저장**하는 방법이 궁금하셨나요? 전체 문서를 다시 만들지 않고 불투명도, 블렌드 모드 또는 기타 그래픽 매개변수를 변경해야 할 수도 있습니다. 요컨대, **PDF 리소스를 직접 편집**하고 싶으신 겁니다. 이 가이드는 Aspose.Pdf for .NET을 사용하여 바로 그 과정을 단계별로 안내합니다. + +우리는 기존 PDF를 로드하고, 리소스 사전을 탐색한 뒤 새로운 그래픽 상태를 주입하고, 마지막으로 **업데이트된 PDF를 저장**합니다. 끝까지 진행하면 어떤 프로젝트에든 바로 넣을 수 있는 작동하는 C# 스니펫을 얻을 수 있습니다—미스터리한 종속성 없이 순수 코드만 제공합니다. + +## 배울 내용 + +- Aspose.Pdf으로 PDF를 열고 첫 번째 페이지의 리소스 사전을 찾는 방법. +- `ExtGState` 사전과 같은 **PDF 리소스를 편집**하는 단계. +- 스트로크/채우기 불투명도와 블렌드 모드를 제어하는 사용자 정의 그래픽 상태(`GS0`)를 생성하고 삽입하는 방법. +- 원본 내용을 모두 보존하면서 새 파일에 **업데이트된 PDF를 저장**하는 방법. + +**Prerequisites**: .NET 6+ (or .NET Framework 4.6+), a license or evaluation copy of Aspose.Pdf, and a basic familiarity with C#. If you’ve never touched a PDF at the dictionary level, don’t worry—this tutorial explains the “why” behind each call. + +![PDF 리소스 편집 다이어그램](image.png){.align-center alt="PDF 리소스를 편집하고 업데이트된 PDF를 저장하는 과정을 보여주는 다이어그램"} + +## 업데이트된 PDF 저장 – 전체 워크플로우 개요 + +코드에 들어가기 전에 전체 흐름을 간단히 정리해 보겠습니다: + +1. **Load** the source PDF. +2. **Grab** the first page and its `Resources` dictionary. +3. **Navigate** to the `ExtGState` sub‑dictionary where graphics states live. +4. **Create** a new `CosPdfDictionary` describing our custom graphics state. +5. **Insert** that dictionary back into `ExtGState` under a unique key (`GS0`). +6. **Save** the modified document as a new file. + +그게 전부입니다—여섯 개의 작은 단계가 각각 몇 줄의 C# 코드에 캡슐화됩니다. 준비됐나요? 시작해 보겠습니다. + +## 단계 1: PDF 문서 로드 + +파일을 여는 것은 가장 간단한 부분입니다. Aspose.Pdf의 `Document` 클래스는 경로나 스트림을 받아들여 기존 PDF를 가리킬 수 있습니다. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Why a `using` block?** +> It guarantees the file handle is released as soon as we finish, preventing lock‑issues when we later attempt to **save the updated PDF**. + +## 단계 2: PDF 리소스 편집 – ExtGState 사전 접근 + +PDF의 각 페이지에는 폰트, 이미지 및 그래픽 상태를 그룹화하는 *리소스 사전*이 있습니다. 불투명도나 블렌드 모드를 변경하려면 `ExtGState` 항목이 필요합니다. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Pro tip:** Not all PDFs contain an `ExtGState` entry by default. The conditional block above ensures we don’t throw a `KeyNotFoundException` and still lets us **edit PDF resources** safely. + +## 단계 3: 새로운 그래픽 상태 사전 만들기 + +그래픽 상태(`GS`)는 PDF 렌더러가 그리기 전에 참조하는 키‑값 쌍 집합입니다. 여기서는 스트로크 불투명도(`CA`), 채우기 불투명도(`ca`), 그리고 블렌드 모드(`BM`)를 정의합니다. + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Why these keys?** +> - `CA` controls the **stroke** opacity, affecting lines and borders. +> - `ca` controls the **fill** opacity, influencing shapes and text fills. +> - `BM` selects a blend mode; “Normal” is the most common but alternatives like “Multiply” exist for creative effects. + +## 단계 4: 새로운 그래픽 상태를 ExtGState에 삽입 + +이제 준비된 사전이 있으니, 새 이름(`GS0`)으로 간단히 추가합니다. 이름은 페이지의 `ExtGState` 컬렉션 내에서 고유해야 합니다. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +나중에 콘텐츠 스트림에서 이 상태를 참조해야 한다면 PDF 연산자 `gs`와 함께 `/GS0`를 사용합니다. 이 튜토리얼에서는 **PDF 리소스 편집**을 보여주기 위해 추가만 하면 충분합니다. + +## 단계 5: 검증 (선택 사항) 및 업데이트된 PDF 저장 + +이 시점에서 PDF 내부 구조는 변경됐지만, 실제 `GS0`를 참조하기 전까지 시각적 출력은 달라지지 않습니다. 그래도 **업데이트된 PDF를 저장**하고 PDF 뷰어나 `pdfcpu` 같은 도구로 객체 트리를 확인할 수 있습니다. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **What to expect:** +> - `output.pdf` will be a byte‑for‑byte copy of `input.pdf` plus the new `ExtGState` entry. +> - Opening the file in a text editor (or using a PDF inspection tool) will reveal a new object like: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> under the `ExtGState` dictionary, keyed as `/GS0`. + +효과를 직접 확인하고 싶다면, 새로운 그래픽 상태를 사용하는 간단한 콘텐츠 스트림을 추가해 보세요: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +옵션 스니펫을 실행하면 50 % 투명 사각형이 표시되어 그래픽 상태가 정상적으로 작동함을 확인할 수 있습니다. + +## 일반적인 질문 및 엣지 케이스 + +**Q: What if the PDF already has a `GS0` entry?** +A: The `Add` method will overwrite the existing key. To avoid collisions, generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` first. + +**Q: Can I edit other resource types, like fonts or XObjects?** +A: Absolutely. The `DictionaryEditor` works for any top‑level resource key (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the desired dictionary name. + +**Q: Does this approach work with encrypted PDFs?** +A: If the PDF is password‑protected, you must supply the password when constructing the `Document` object: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +After decryption you can edit resources exactly the same way. + +**Q: Will the file size increase noticeably?** +A: Adding a small dictionary like this typically adds only a few hundred bytes. If you add large XObjects or embed images, expect a bigger jump. + +## 결론 + +이제 Aspose.Pdf으로 **PDF 리소스를 직접 편집**한 뒤 **업데이트된 PDF를 저장**하는 방법을 알게 되었습니다. 전체 과정은 문서를 로드하고, `ExtGState` 사전을 찾고, 새로운 그래픽 상태를 만든 뒤 삽입하고, 마지막으로 결과를 저장하는 것으로 요약됩니다. 여기서부터는 다른 리소스 유형을 실험하거나, 여러 그래픽 상태를 체인하거나, 대량 수정용 재사용 가능한 헬퍼 메서드를 구축할 수 있습니다. + +다음 단계는? 블렌드 모드를 `"Multiply"` 또는 `"Screen"`으로 바꿔 겹치는 객체가 어떻게 동작하는지 확인해 보세요. 혹은 `Font` 사전을 편집해 실시간으로 커스텀 폰트를 임베드해 보는 것도 좋습니다. PDF 사양은 방대하고, Aspose.Pdf이 제공하는 기능은 무궁무진합니다. + +## 다음에 배워야 할 내용은? + +다음 튜토리얼들은 이 가이드에서 시연한 기술을 기반으로 하면서도 밀접하게 연관된 주제를 다룹니다. 각 리소스는 완전한 코드 예제와 단계별 설명을 포함하고 있어 추가 API 기능을 마스터하고 프로젝트에 다양한 구현 방식을 적용하는 데 도움이 됩니다. + +- [Aspose Pdf Net Open Modify Save Pdfs](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [How to Extract & Save Specific PDF Pages Using Aspose.PDF for .NET - A Comprehensive Guide](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [How to Add File Attachment Annotations in PDFs Using Aspose.PDF for .NET | Step-by-Step Guide](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/polish/net/document-manipulation/_index.md b/pdf/polish/net/document-manipulation/_index.md index 7f1f83fa57..5965b8a49d 100644 --- a/pdf/polish/net/document-manipulation/_index.md +++ b/pdf/polish/net/document-manipulation/_index.md @@ -287,6 +287,9 @@ Opanuj manipulację PDF za pomocą Aspose.PDF dla .NET. Dowiedz się, jak ładow ### [Zastąp pierwsze wystąpienie tekstu w pliku PDF za pomocą Aspose.PDF dla .NET — kompleksowy przewodnik](./replace-first-text-occurrence-aspose-pdf-net/) Dowiedz się, jak zastąpić pierwsze wystąpienie tekstu w pliku PDF za pomocą Aspose.PDF dla .NET. Ten przewodnik obejmuje konfigurację, przykłady kodu i praktyczne zastosowania. +### [Zapisz zaktualizowany PDF – Edytuj zasoby PDF przy użyciu Aspose.PDF](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Dowiedz się, jak zapisać zmodyfikowany plik PDF po edycji zasobów przy użyciu Aspose.PDF w .NET. + ### [Zmiana rozmiaru zawartości pliku PDF za pomocą Aspose.PDF dla .NET](./resize-pdf-contents-aspose-pdf-dotnet/) Samouczek dotyczący kodu dla Aspose.PDF Net diff --git a/pdf/polish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/polish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..e9dc58c8fe --- /dev/null +++ b/pdf/polish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,261 @@ +--- +category: general +date: 2026-07-23 +description: Zapisz zaktualizowany PDF przy użyciu Aspose.Pdf w C#. Dowiedz się, jak + edytować zasoby PDF, takie jak ExtGState, i utworzyć nowy plik w kilku prostych + krokach. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: pl +lastmod: 2026-07-23 +og_description: Zapisz zaktualizowany PDF przy użyciu Aspose.Pdf w C#. Ten samouczek + pokazuje, jak edytować zasoby PDF, dodać stan graficzny i wygenerować nowy plik. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Zapisz zaktualizowany PDF – Edytuj zasoby PDF przy użyciu Aspose.Pdf (przewodnik + C#) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Zapisz zaktualizowany PDF – Edytuj zasoby PDF za pomocą Aspose.Pdf +url: /pl/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Zapisz zaktualizowany PDF – Edytuj zasoby PDF przy użyciu Aspose.Pdf + +Zastanawiałeś się kiedyś, jak **zapisz zaktualizowany PDF** po modyfikacji jego niskopoziomowych obiektów? Być może musisz zmienić krycie, tryby mieszania lub inne parametry graficzne bez ponownego tworzenia całego dokumentu. Krótko mówiąc, chcesz **edytować zasoby PDF** bezpośrednio. Ten przewodnik krok po kroku pokazuje, jak to zrobić, używając Aspose.Pdf dla .NET. + +Zaczniemy od załadowania istniejącego PDF, zagłębimy się w jego słownik zasobów, wstrzykniemy nowy stan graficzny i w końcu **zapisz zaktualizowany PDF**. Po zakończeniu będziesz mieć działający fragment C#, który możesz wkleić do dowolnego projektu — bez tajemniczych zależności, po prostu czysty kod. + +## Czego się nauczysz + +- Jak otworzyć PDF przy użyciu Aspose.Pdf i zlokalizować słownik zasobów pierwszej strony. +- Kroki do **edytowania zasobów PDF** takich jak słownik `ExtGState`. +- Tworzenie i wstawianie własnego stanu graficznego (`GS0`), który kontroluje krycie linii/wypełnienia oraz tryb mieszania. +- Jak **zapisz zaktualizowany PDF** do nowego pliku, zachowując całą oryginalną zawartość. + +**Wymagania wstępne**: .NET 6+ (lub .NET Framework 4.6+), licencja lub wersja ewaluacyjna Aspose.Pdf oraz podstawowa znajomość C#. Jeśli nigdy nie pracowałeś z PDF na poziomie słownika, nie martw się — ten samouczek wyjaśnia „dlaczego” każdego wywołania. + +--- + +![Diagram edycji zasobów PDF](image.png){.align-center alt="Diagram pokazujący, jak edytować zasoby PDF, a następnie zapisać zaktualizowany PDF"} + +## Zapisz zaktualizowany PDF – Przegląd pełnego przepływu pracy + +Zanim przejdziemy do kodu, przedstawmy ogólny przepływ: + +1. **Load** źródłowy PDF. +2. **Grab** pierwszą stronę i jej słownik `Resources`. +3. **Navigate** do pod-słownika `ExtGState`, w którym znajdują się stany graficzne. +4. **Create** nowy `CosPdfDictionary` opisujący nasz własny stan graficzny. +5. **Insert** ten słownik z powrotem do `ExtGState` pod unikalnym kluczem (`GS0`). +6. **Save** zmodyfikowany dokument jako nowy plik. + +To wszystko — sześć małych kroków, każdy zamknięty w kilku linijkach C#. Gotowy? Zaczynamy. + +## Krok 1: Wczytaj dokument PDF + +Otwieranie pliku to najprostsza część. Klasa `Document` z Aspose.Pdf przyjmuje ścieżkę lub strumień, więc możesz wskazać dowolny istniejący PDF. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Dlaczego blok `using`?** +> Gwarantuje on zwolnienie uchwytu pliku natychmiast po zakończeniu, zapobiegając problemom z blokadą, gdy później spróbujemy **zapisz zaktualizowany PDF**. + +## Krok 2: Edytuj zasoby PDF – uzyskaj dostęp do słownika ExtGState + +Każda strona w PDF posiada *słownik zasobów*, który grupuje czcionki, obrazy i stany graficzne. Aby zmienić krycie lub tryb mieszania, potrzebujemy wpisu `ExtGState`. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Pro tip:** Nie wszystkie PDF-y zawierają domyślnie wpis `ExtGState`. Warunkowy blok powyżej zapewnia, że nie zostanie rzucony `KeyNotFoundException` i nadal pozwala nam bezpiecznie **edytować zasoby PDF**. + +## Krok 3: Utwórz nowy słownik stanu graficznego + +Stan graficzny (`GS`) to w zasadzie zestaw par klucz‑wartość, które renderer PDF odczytuje przed rysowaniem. Tutaj zdefiniujemy krycie linii (`CA`), krycie wypełnienia (`ca`) oraz tryb mieszania (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Dlaczego te klucze?** +> - `CA` kontroluje krycie **linii**, wpływając na linie i obramowania. +> - `ca` kontroluje krycie **wypełnienia**, wpływając na kształty i wypełnienia tekstu. +> - `BM` wybiera tryb mieszania; „Normal” jest najczęstszy, ale istnieją alternatywy takie jak „Multiply” dla efektów kreatywnych. + +## Krok 4: Wstaw nowy stan graficzny do ExtGState + +Teraz, gdy mamy gotowy słownik, po prostu dodajemy go pod nową nazwą (`GS0`). Nazwa musi być unikalna w kolekcji `ExtGState` danej strony. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Jeśli później będziesz musiał odwołać się do tego stanu w strumieniach zawartości, użyjesz `/GS0` w operatorach PDF, takich jak `gs`. Dla celów tego samouczka samo dodanie wystarczy, aby zademonstrować **edytowanie zasobów PDF**. + +## Krok 5: Zweryfikuj (opcjonalnie) i zapisz zaktualizowany PDF + +W tym momencie wewnętrzna struktura PDF uległa zmianie, ale wizualny wynik nie będzie się różnił, dopóki nie odwołasz się do `GS0`. Mimo to możemy **zapisz zaktualizowany PDF** i przejrzeć drzewo obiektów przy pomocy przeglądarki PDF lub narzędzia takiego jak `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **Czego się spodziewać:** +> - `output.pdf` będzie dokładną kopią `input.pdf` plus nowy wpis `ExtGState`. +> - Otwierając plik w edytorze tekstu (lub używając narzędzia do inspekcji PDF) zobaczysz nowy obiekt, np.: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> w słowniku `ExtGState`, pod kluczem `/GS0`. + +Jeśli chcesz zobaczyć efekt w działaniu, dodaj prosty strumień zawartości, który używa nowego stanu graficznego: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Uruchomienie opcjonalnego fragmentu da Ci prostokąt o 50 % przezroczystości, potwierdzając, że stan graficzny działa zgodnie z zamierzeniami. + +## Częste pytania i przypadki brzegowe + +**Q: Co jeśli PDF już zawiera wpis `GS0`?** +A: Metoda `Add` nadpisze istniejący klucz. Aby uniknąć kolizji, wygeneruj unikalną nazwę (np. `GS1`, `GS_custom`) lub najpierw sprawdź `extGState.ContainsKey("GS0")`. + +**Q: Czy mogę edytować inne typy zasobów, takie jak czcionki czy XObjects?** +A: Oczywiście. `DictionaryEditor` działa dla dowolnego klucza zasobów najwyższego poziomu (`Font`, `XObject`, `ColorSpace` itp.). Wystarczy zamienić `"ExtGState"` na żądaną nazwę słownika. + +**Q: Czy to podejście działa z zaszyfrowanymi PDF-ami?** +A: Jeśli PDF jest chroniony hasłem, musisz podać hasło przy tworzeniu obiektu `Document`: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Po odszyfrowaniu możesz edytować zasoby dokładnie w ten sam sposób. + +**Q: Czy rozmiar pliku zwiększy się zauważalnie?** +A: Dodanie małego słownika zazwyczaj zwiększa rozmiar o kilka setek bajtów. Jeśli dodasz duże XObjects lub osadzisz obrazy, spodziewaj się większego przyrostu. + +## Podsumowanie + +Teraz wiesz, jak **zapisz zaktualizowany PDF** po bezpośrednim **edytowaniu zasobów PDF** przy użyciu Aspose.Pdf. Proces sprowadza się do wczytania dokumentu, odnalezienia słownika `ExtGState`, stworzenia nowego stanu graficznego, wstawienia go i ostatecznego zapisania wyniku. Od tego momentu możesz eksperymentować z innymi typami zasobów, łączyć wiele stanów graficznych lub stworzyć wielokrotnego użytku metodę pomocniczą do masowych modyfikacji. + +Następne kroki? Spróbuj zamienić tryb mieszania na „Multiply” lub „Screen” i zobacz, jak zachowują się nakładające się obiekty. Albo zbadaj edycję słownika `Font`, aby dynamicznie osadzać własne czcionki. Specyfikacja PDF jest bogata, a Aspose.Pdf daje Ci + +## 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 kompletny działający kod z wyjaśnieniami krok po kroku, aby pomóc Ci opanować dodatkowe funkcje API i odkrywać alternatywne podejścia implementacyjne w własnych projektach. + +- [Aspose Pdf Net Otwórz Modyfikuj Zapisz PDF](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [Jak wyodrębnić i zapisać konkretne strony PDF przy użyciu Aspose.PDF dla .NET – Kompletny przewodnik](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [Jak dodać adnotacje z załącznikami plików w PDF przy użyciu Aspose.PDF dla .NET | Przewodnik krok po kroku](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/portuguese/net/document-manipulation/_index.md b/pdf/portuguese/net/document-manipulation/_index.md index 729d518f63..44753a049e 100644 --- a/pdf/portuguese/net/document-manipulation/_index.md +++ b/pdf/portuguese/net/document-manipulation/_index.md @@ -306,11 +306,14 @@ Aprenda a dividir um arquivo PDF em páginas individuais usando o Aspose.PDF par Aprenda a dividir páginas de PDF em arquivos separados usando o Aspose.PDF para .NET. Este guia completo aborda dicas de configuração, implementação e otimização. ### [Dividir e Criar Arquivos PDF Usando Aspose.PDF .NET | Guia de Manipulação de Documentos](./split-create-pdf-aspose-pdf-net/) -Aprenda a dividir PDFs de várias páginas e criar novos arquivos PDF usando o Aspose.PDF para .NET. Siga este guia completo com exemplos de código. +Aprenda a dividir PDFs de várias páginas e criar novos arquivos PDF usando o Aspose.PDF .NET. Siga este guia completo com exemplos de código. ### [Guia definitivo para manipulação de PDF com Aspose.PDF .NET: carregue, salve e substitua texto com eficiência](./master-pdf-manipulation-aspose-pdf-net/) Aprenda a dominar a manipulação de PDFs usando o Aspose.PDF para .NET. Este guia aborda como carregar, salvar e substituir texto em PDFs, ideal para desenvolvedores que buscam eficiência. +### [Salvar PDF Atualizado – Editar Recursos PDF com Aspose.PDF](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Aprenda a salvar as alterações feitas em um documento PDF usando Aspose.PDF para .NET. + ## Recursos adicionais - [Aspose.PDF para documentação da Net](https://docs.aspose.com/pdf/net/) diff --git a/pdf/portuguese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/portuguese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..2167964dc9 --- /dev/null +++ b/pdf/portuguese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,259 @@ +--- +category: general +date: 2026-07-23 +description: Salve o PDF atualizado usando Aspose.Pdf em C#. Aprenda a editar recursos + de PDF como ExtGState e gerar um novo arquivo em apenas alguns passos. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: pt +lastmod: 2026-07-23 +og_description: Salvar PDF atualizado com Aspose.Pdf em C#. Este tutorial mostra como + editar recursos de PDF, adicionar um estado gráfico e gerar um novo arquivo. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Salvar PDF Atualizado – Editar Recursos de PDF com Aspose.Pdf (Guia C#) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Salvar PDF Atualizado – Editar Recursos PDF com Aspose.Pdf +url: /pt/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Salvar PDF Atualizado – Editar Recursos PDF com Aspose.Pdf + +Já se perguntou como **salvar PDF atualizado** depois de ajustar seus objetos de baixo nível? Talvez você precise mudar a opacidade, modos de mesclagem ou outros parâmetros gráficos sem recriar todo o documento. Em resumo, você quer **editar recursos PDF** diretamente. Este guia mostra exatamente isso, usando Aspose.Pdf para .NET. + +Começaremos carregando um PDF existente, mergulhando em seu dicionário de recursos, inserindo um novo estado gráfico e, finalmente, **salvar o PDF atualizado**. Ao final, você terá um trecho de código C# funcional que pode ser inserido em qualquer projeto — sem dependências misteriosas, apenas código puro. + +## O que você aprenderá + +- Como abrir um PDF com Aspose.Pdf e localizar o dicionário de recursos da primeira página. +- As etapas para **editar recursos PDF** como o dicionário `ExtGState`. +- Criar e inserir um estado gráfico personalizado (`GS0`) que controla a opacidade de traço/preenchimento e o modo de mesclagem. +- Como **salvar o PDF atualizado** em um novo arquivo, preservando todo o conteúdo original. + +**Pré‑requisitos**: .NET 6+ (ou .NET Framework 4.6+), uma licença ou cópia de avaliação do Aspose.Pdf e familiaridade básica com C#. Se você nunca mexeu em um PDF ao nível de dicionário, não se preocupe — este tutorial explica o “porquê” de cada chamada. + +![Diagram of PDF resource editing](image.png){.align-center alt="Diagrama mostrando como editar recursos PDF e então salvar PDF atualizado"} + +## Salvar PDF Atualizado – Visão Geral do Fluxo de Trabalho Completo + +Antes de mergulharmos no código, vamos delinear o fluxo de alto nível: + +1. **Carregar** o PDF de origem. +2. **Obter** a primeira página e seu dicionário `Resources`. +3. **Navegar** até o sub‑dicionário `ExtGState` onde vivem os estados gráficos. +4. **Criar** um novo `CosPdfDictionary` descrevendo nosso estado gráfico personalizado. +5. **Inserir** esse dicionário de volta em `ExtGState` sob uma chave única (`GS0`). +6. **Salvar** o documento modificado como um novo arquivo. + +É isso — seis passos simples, cada um encapsulado em poucas linhas de C#. Pronto? Vamos lá. + +## Etapa 1: Carregar o Documento PDF + +Abrir um arquivo é a parte mais simples. A classe `Document` do Aspose.Pdf aceita um caminho ou um stream, então você pode apontá‑la para qualquer PDF existente. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Por que um bloco `using`?** +> Ele garante que o manipulador de arquivo seja liberado assim que terminamos, evitando problemas de bloqueio quando posteriormente tentamos **salvar o PDF atualizado**. + +## Etapa 2: Editar Recursos PDF – Acessar o Dicionário ExtGState + +Cada página em um PDF possui um *dicionário de recursos* que agrupa fontes, imagens e estados gráficos. Para mudar a opacidade ou o modo de mesclagem precisamos da entrada `ExtGState`. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Dica de especialista:** Nem todos os PDFs contêm uma entrada `ExtGState` por padrão. O bloco condicional acima garante que não lançaremos uma `KeyNotFoundException` e ainda nos permite **editar recursos PDF** com segurança. + +## Etapa 3: Criar um Novo Dicionário de Estado Gráfico + +Um estado gráfico (`GS`) é essencialmente um conjunto de pares chave‑valor que o renderizador PDF consulta antes de desenhar. Aqui definiremos a opacidade de traço (`CA`), a opacidade de preenchimento (`ca`) e o modo de mesclagem (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Por que essas chaves?** +> - `CA` controla a opacidade do **traço**, afetando linhas e bordas. +> - `ca` controla a opacidade do **preenchimento**, influenciando formas e preenchimentos de texto. +> - `BM` seleciona um modo de mesclagem; “Normal” é o mais comum, mas alternativas como “Multiply” existem para efeitos criativos. + +## Etapa 4: Inserir o Novo Estado Gráfico em ExtGState + +Agora que temos um dicionário pronto, basta adicioná‑lo sob um novo nome (`GS0`). O nome deve ser único dentro da coleção `ExtGState` da página. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Se mais tarde você precisar referenciar esse estado a partir de fluxos de conteúdo, usará `/GS0` em operadores PDF como `gs`. Para o propósito deste tutorial, apenas adicioná‑lo já demonstra **editar recursos PDF**. + +## Etapa 5: Verificar (Opcional) e Salvar o PDF Atualizado + +Neste ponto a estrutura interna do PDF mudou, mas a saída visual não diferirá até que você realmente referencie `GS0`. Ainda assim, podemos **salvar o PDF atualizado** e inspecionar a árvore de objetos com um visualizador PDF ou uma ferramenta como `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **O que esperar:** +> - `output.pdf` será uma cópia byte‑a‑byte de `input.pdf` mais a nova entrada `ExtGState`. +> - Abrir o arquivo em um editor de texto (ou usar uma ferramenta de inspeção de PDF) revelará um novo objeto como: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> sob o dicionário `ExtGState`, com a chave `/GS0`. + +Se quiser ver o efeito em ação, adicione um fluxo de conteúdo simples que use o novo estado gráfico: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Executar o trecho opcional gerará um retângulo 50 % transparente, confirmando que o estado gráfico funciona como esperado. + +--- + +## Perguntas Frequentes & Casos Limite + +**Q: E se o PDF já possuir uma entrada `GS0`?** +A: O método `Add` sobrescreverá a chave existente. Para evitar colisões, gere um nome único (por exemplo, `GS1`, `GS_custom`) ou verifique `extGState.ContainsKey("GS0")` primeiro. + +**Q: Posso editar outros tipos de recurso, como fontes ou XObjects?** +A: Absolutamente. O `DictionaryEditor` funciona para qualquer chave de recurso de nível superior (`Font`, `XObject`, `ColorSpace`, etc.). Basta substituir `"ExtGState"` pelo nome do dicionário desejado. + +**Q: Essa abordagem funciona com PDFs criptografados?** +A: Se o PDF estiver protegido por senha, você deve fornecer a senha ao construir o objeto `Document`: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Após a descriptografia, você pode editar os recursos exatamente da mesma forma. + +**Q: O tamanho do arquivo aumentará perceptivelmente?** +A: Adicionar um pequeno dicionário como este normalmente acrescenta apenas algumas centenas de bytes. Se você adicionar XObjects grandes ou incorporar imagens, espere um aumento maior. + +## Conclusão + +Agora você sabe como **salvar PDFs atualizados** após **editar recursos PDF** diretamente com Aspose.Pdf. O processo resume‑se a carregar o documento, localizar o dicionário `ExtGState`, criar um novo estado gráfico, inseri‑lo e, finalmente, persistir o resultado. A partir daqui, você pode experimentar outros tipos de recurso, encadear múltiplos estados gráficos ou criar um método auxiliar reutilizável para modificações em massa. + +Próximos passos? Experimente trocar o modo de mesclagem para `"Multiply"` ou `"Screen"` e veja como objetos sobrepostos se comportam. Ou explore a edição do dicionário `Font` para incorporar fontes personalizadas em tempo real. A especificação PDF é rica, e Aspose.Pdf lhe dá + +## 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 de implementação alternativas em seus próprios projetos. + +- [Aspose Pdf Net Abrir Modificar Salvar PDFs](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [Como Extrair & Salvar Páginas PDF Específicas Usando Aspose.PDF para .NET - Guia Abrangente](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [Como Adicionar Anotações de Anexo de Arquivo em PDFs Usando Aspose.PDF para .NET | Guia Passo a Passo](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/russian/net/document-manipulation/_index.md b/pdf/russian/net/document-manipulation/_index.md index 913e015e73..5137fd2dc9 100644 --- a/pdf/russian/net/document-manipulation/_index.md +++ b/pdf/russian/net/document-manipulation/_index.md @@ -119,7 +119,7 @@ ### [Как добавлять и настраивать номера страниц в PDF-файлах с помощью Aspose.PDF для .NET | Руководство по работе с документами](./add-customize-page-numbers-aspose-pdf-dot-net/) Узнайте, как легко добавлять и настраивать номера страниц в документах PDF с помощью Aspose.PDF для .NET. Это всеобъемлющее руководство охватывает установку, параметры настройки и советы по производительности. -### [Как добавлять и удалять JavaScript в PDF-файлах с помощью Aspose.PDF .NET: подробное руководство](./aspose-pdf-net-add-remove-javascript-pdfs/) +### [Как добавить и удалять JavaScript в PDF-файлах с помощью Aspose.PDF .NET: подробное руководство](./aspose-pdf-net-add-remove-javascript-pdfs/) Узнайте, как добавлять и удалять функции JavaScript в ваших документах PDF с помощью Aspose.PDF для .NET. Улучшите интерактивность и функциональность вашего документа с помощью нашего пошагового руководства. ### [Как добавить несколько PDF-файлов с помощью Aspose.PDF для .NET: пошаговое руководство](./append-multiple-pdf-files-aspose-net/) @@ -309,7 +309,10 @@ Узнайте, как разделить многостраничные PDF-файлы и создать новые PDF-файлы с помощью Aspose.PDF для .NET. Следуйте этому подробному руководству с примерами кода. ### [Полное руководство по работе с PDF-файлами с помощью Aspose.PDF .NET: эффективная загрузка, сохранение и замена текста](./master-pdf-manipulation-aspose-pdf-net/) -Узнайте, как освоить манипуляции PDF с помощью Aspose.PDF для .NET. Это руководство охватывает загрузку, сохранение и замену текста в PDF-файлах, идеально подходит для разработчиков, стремящихся к эффективности. +Узнайте, как освоить манипуляции PDF с помощью Aspose.PDF .NET. Это руководство охватывает загрузку, сохранение и замену текста в PDF-файлах, идеально подходит для разработчиков, стремящихся к эффективности. + +### [Сохранить обновлённый PDF – редактирование ресурсов PDF с помощью Aspose.Pdf](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Узнайте, как сохранить изменённый PDF‑файл после редактирования ресурсов с помощью Aspose.PDF. ## Дополнительные ресурсы diff --git a/pdf/russian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/russian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..c58899db85 --- /dev/null +++ b/pdf/russian/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-07-23 +description: Сохраните обновлённый PDF с помощью Aspose.Pdf на C#. Узнайте, как редактировать + ресурсы PDF, такие как ExtGState, и создать новый файл за несколько шагов. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: ru +lastmod: 2026-07-23 +og_description: Сохраните обновлённый PDF с помощью Aspose.Pdf в C#. Этот учебник + показывает, как редактировать ресурсы PDF, добавить графическое состояние и вывести + новый файл. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Сохранить обновлённый PDF – редактирование ресурсов PDF с помощью Aspose.Pdf + (руководство по C#) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Сохранить обновлённый PDF – редактировать ресурсы PDF с помощью Aspose.Pdf +url: /ru/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Сохранить обновлённый PDF – редактирование ресурсов PDF с помощью Aspose.Pdf + +Когда‑нибудь задумывались, как **сохранить обновлённый PDF** после изменения его низкоуровневых объектов? Возможно, вам нужно изменить непрозрачность, режимы наложения или другие графические параметры без пересоздания всего документа. Короче говоря, вы хотите **редактировать ресурсы PDF** напрямую. Это руководство проведёт вас через процесс, используя Aspose.Pdf для .NET. + +Мы начнём с загрузки существующего PDF, погрузимся в его словарь ресурсов, внедрим новое графическое состояние и, наконец, **сохраним обновлённый PDF**. К концу вы получите рабочий фрагмент C#, который можно вставить в любой проект — без скрытых зависимостей, только чистый код. + +## Что вы узнаете + +- Как открыть PDF с помощью Aspose.Pdf и найти словарь ресурсов первой страницы. +- Шаги для **редактирования ресурсов PDF**, таких как словарь `ExtGState`. +- Создание и вставка пользовательского графического состояния (`GS0`), которое управляет непрозрачностью обводки/заливки и режимом наложения. +- Как **сохранить обновлённый PDF** в новый файл, сохранив всё оригинальное содержимое. + +**Prerequisites**: .NET 6+ (или .NET Framework 4.6+), лицензия или оценочная копия Aspose.Pdf и базовое знакомство с C#. Если вы никогда не работали с PDF на уровне словарей, не переживайте — в этом руководстве объясняется «почему» каждого вызова. + +--- + +![Диаграмма редактирования ресурсов PDF](image.png){.align-center alt="Диаграмма, показывающая как редактировать ресурсы PDF и затем сохранить обновлённый PDF"} + +## Сохранить обновлённый PDF – Обзор полного рабочего процесса + +Прежде чем перейти к коду, давайте обозначим общий поток: + +1. **Load** исходный PDF. +2. **Grab** первую страницу и её словарь `Resources`. +3. **Navigate** к под‑словарю `ExtGState`, где хранятся графические состояния. +4. **Create** новый `CosPdfDictionary`, описывающий наше пользовательское графическое состояние. +5. **Insert** этот словарь обратно в `ExtGState` под уникальным ключом (`GS0`). +6. **Save** изменённый документ в новый файл. + +Вот и всё — шесть небольших шагов, каждый из которых укладывается в несколько строк C#. Готовы? Поехали. + +## Step 1: Load the PDF Document + +Открытие файла — самая простая часть. Класс `Document` из Aspose.Pdf принимает путь или поток, поэтому вы можете указать любой существующий PDF. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Why a `using` block?** +> It guarantees the file handle is released as soon as we finish, preventing lock‑issues when we later attempt to **save the updated PDF**. + +## Step 2: Edit PDF Resources – Access the ExtGState Dictionary + +Каждая страница PDF имеет *словарь ресурсов*, в котором группируются шрифты, изображения и графические состояния. Чтобы изменить непрозрачность или режим наложения, нам нужен элемент `ExtGState`. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Pro tip:** Not all PDFs contain an `ExtGState` entry by default. The conditional block above ensures we don’t throw a `KeyNotFoundException` and still lets us **edit PDF resources** safely. + +## Step 3: Create a New Graphics State Dictionary + +Графическое состояние (`GS`) — по сути набор пар «ключ‑значение», которые рендерер PDF проверяет перед отрисовкой. Здесь мы определим непрозрачность обводки (`CA`), непрозрачность заливки (`ca`) и режим наложения (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Why these keys?** +> - `CA` controls the **stroke** opacity, affecting lines and borders. +> - `ca` controls the **fill** opacity, influencing shapes and text fills. +> - `BM` selects a blend mode; “Normal” is the most common but alternatives like “Multiply” exist for creative effects. + +## Step 4: Insert the New Graphics State into ExtGState + +Теперь, когда у нас есть готовый словарь, мы просто добавляем его под новым именем (`GS0`). Имя должно быть уникальным в коллекции `ExtGState` страницы. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Если позже понадобится ссылаться на это состояние из потоков содержимого, вы будете использовать `/GS0` в PDF‑операторах типа `gs`. Для целей данного руководства достаточно просто добавить его, чтобы продемонстрировать **редактирование ресурсов PDF**. + +## Step 5: Verify (Optional) and Save the Updated PDF + +На данном этапе внутренняя структура PDF изменилась, но визуальный результат не будет отличаться, пока вы не начнёте использовать `GS0`. Тем не менее, мы можем **сохранить обновлённый PDF** и изучить дерево объектов с помощью просмотрщика PDF или инструмента вроде `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **What to expect:** +> - `output.pdf` will be a byte‑for‑byte copy of `input.pdf` plus the new `ExtGState` entry. +> - Opening the file in a text editor (or using a PDF inspection tool) will reveal a new object like: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> under the `ExtGState` dictionary, keyed as `/GS0`. + +Если хотите увидеть эффект в действии, добавьте простой поток содержимого, использующий новое графическое состояние: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Запуск необязательного фрагмента кода выдаст 50 % полупрозрачный прямоугольник, подтверждая, что графическое состояние работает как задумано. + +--- + +## Common Questions & Edge Cases + +**Q: What if the PDF already has a `GS0` entry?** +A: The `Add` method will overwrite the existing key. To avoid collisions, generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` first. + +**Q: Can I edit other resource types, like fonts or XObjects?** +A: Absolutely. The `DictionaryEditor` works for any top‑level resource key (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the desired dictionary name. + +**Q: Does this approach work with encrypted PDFs?** +A: If the PDF is password‑protected, you must supply the password when constructing the `Document` object: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +After decryption you can edit resources exactly the same way. + +**Q: Will the file size increase noticeably?** +A: Adding a small dictionary like this typically adds only a few hundred bytes. If you add large XObjects or embed images, expect a bigger jump. + +## Conclusion + +You now know how to **save updated PDF** files after directly **edit PDF resources** with Aspose.Pdf. The process boils down to loading the document, locating the `ExtGState` dictionary, crafting a new graphics state, inserting it, and finally persisting the result. From here you can experiment with other resource types, chain multiple graphics states, or build a reusable helper method for bulk modifications. + +Next steps? Try swapping the blend mode to `"Multiply"` or `"Screen"` and see how overlapping objects behave. Or explore editing the `Font` dictionary to embed custom fonts on the fly. The PDF spec is rich, and Aspose.Pdf gives you + +## Что следует изучить дальше? + +Следующие руководства охватывают тесно связанные темы, построенные на техниках, продемонстрированных в этом руководстве. Каждый ресурс включает полностью работающие примеры кода с пошаговыми объяснениями, чтобы помочь вам освоить дополнительные возможности API и исследовать альтернативные подходы в собственных проектах. + +- [Aspose Pdf Net Open Modify Save Pdfs](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [How to Extract & Save Specific PDF Pages Using Aspose.PDF for .NET - A Comprehensive Guide](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [How to Add File Attachment Annotations in PDFs Using Aspose.PDF for .NET | Step-by-Step Guide](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/spanish/net/document-manipulation/_index.md b/pdf/spanish/net/document-manipulation/_index.md index 1cb5659fc3..b808059b3f 100644 --- a/pdf/spanish/net/document-manipulation/_index.md +++ b/pdf/spanish/net/document-manipulation/_index.md @@ -80,7 +80,7 @@ Aprenda a optimizar archivos PDF eliminando objetos no utilizados con Aspose.PDF ### [Manipulación eficiente de páginas PDF con Aspose.PDF para .NET: Guía para desarrolladores](./manipulate-pdf-pages-aspose-dot-net/) Aprenda a manipular páginas PDF de forma eficiente con Aspose.PDF para .NET. Esta guía explica cómo rotar, ampliar y configurar orígenes sin Adobe Acrobat. -### [Combine páginas PDF de forma eficiente con Aspose.PDF para .NET: Guía del método N-Up](./combine-pdf-pages-aspose-net-nup-method/) +### [Combine páginas PDF de forma eficiente con el método N-Up](./combine-pdf-pages-aspose-net-nup-method/) Aprenda a combinar páginas PDF eficientemente con el método N-Up de Aspose.PDF para .NET. Esta guía abarca la configuración, la implementación y las aplicaciones prácticas. ### [Elimine páginas de archivos PDF de forma eficiente con Aspose.PDF para .NET](./delete-pages-pdf-aspose-dotnet/) @@ -216,7 +216,7 @@ Aprenda a insertar páginas en un PDF con Aspose.PDF para .NET. Esta guía paso Aprenda a insertar páginas en un PDF con Aspose.PDF para .NET con esta guía paso a paso. Optimice su flujo de trabajo documental. ### [Insertar una página vacía en un PDF con Aspose.PDF .NET: una guía completa](./aspose-pdf-net-insert-empty-page/) -Aprenda a insertar páginas vacías en documentos PDF fácilmente con Aspose.PDF para .NET. Siga esta guía paso a paso para mejorar sus habilidades de manipulación de documentos. +Aprenda a insertar páginas vacías en documentos PDF fácilmente con Aspose.PDF .NET. Siga esta guía paso a paso para mejorar sus habilidades de manipulación de documentos. ### [Domine el método MakeNUp de Aspose.PDF .NET para diseños PDF eficientes](./aspose-pdf-net-make-nup-method-pdf-layout/) Aprenda a reorganizar eficientemente varias páginas PDF en nuevos diseños con el método MakeNUp de Aspose.PDF .NET. Ideal para boletines, folletos e informes. @@ -306,11 +306,14 @@ Aprenda a dividir un archivo PDF en páginas individuales con Aspose.PDF para .N Aprenda a dividir páginas PDF en archivos separados con Aspose.PDF para .NET. Esta guía completa incluye consejos de configuración, implementación y optimización. ### [Dividir y crear archivos PDF con Aspose.PDF .NET | Guía de manipulación de documentos](./split-create-pdf-aspose-pdf-net/) -Aprenda a dividir archivos PDF de varias páginas y a crear nuevos archivos PDF con Aspose.PDF para .NET. Siga esta guía completa con ejemplos de código. +Aprenda a dividir archivos PDF de varias páginas y a crear nuevos archivos PDF con Aspose.PDF .NET. Siga esta guía completa con ejemplos de código. ### [Guía definitiva para la manipulación de PDF con Aspose.PDF .NET: Carga, guarda y reemplaza texto de forma eficiente](./master-pdf-manipulation-aspose-pdf-net/) Aprenda a dominar la manipulación de PDF con Aspose.PDF para .NET. Esta guía explica cómo cargar, guardar y reemplazar texto en PDF, ideal para desarrolladores que buscan eficiencia. +### [Guardar PDF actualizado – Editar recursos PDF con Aspose.PDF](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Aprenda a guardar un PDF actualizado después de editar sus recursos usando Aspose.PDF para .NET. + ## Recursos adicionales - [Documentación de Aspose.PDF para la red](https://docs.aspose.com/pdf/net/) diff --git a/pdf/spanish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/spanish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..d1b0c3e844 --- /dev/null +++ b/pdf/spanish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-07-23 +description: Guarda el PDF actualizado usando Aspose.Pdf en C#. Aprende a editar recursos + PDF como ExtGState y a generar un nuevo archivo en solo unos pocos pasos. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: es +lastmod: 2026-07-23 +og_description: Guardar PDF actualizado con Aspose.Pdf en C#. Este tutorial muestra + cómo editar recursos PDF, agregar un estado gráfico y generar un archivo nuevo. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Guardar PDF actualizado – Editar recursos PDF con Aspose.Pdf (Guía C#) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Guardar PDF actualizado – Editar recursos PDF con Aspose.Pdf +url: /es/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Guardar PDF actualizado – Editar recursos PDF con Aspose.Pdf + +¿Alguna vez te has preguntado cómo **guardar PDF actualizado** después de modificar sus objetos de bajo nivel? Tal vez necesites cambiar la opacidad, los modos de fusión u otros parámetros gráficos sin volver a crear todo el documento. En resumen, deseas **editar recursos PDF** directamente. Esta guía te muestra exactamente eso, usando Aspose.Pdf para .NET. + +Comenzaremos cargando un PDF existente, profundizando en su diccionario de recursos, inyectando un nuevo estado gráfico y, finalmente, **guardar el PDF actualizado**. Al final tendrás un fragmento de C# funcional que puedes insertar en cualquier proyecto—sin dependencias misteriosas, solo código puro. + +## Lo que aprenderás + +- Cómo abrir un PDF con Aspose.Pdf y localizar el diccionario de recursos de la primera página. +- Los pasos para **editar recursos PDF** como el diccionario `ExtGState`. +- Crear e insertar un estado gráfico personalizado (`GS0`) que controla la opacidad de trazo/relleno y el modo de fusión. +- Cómo **guardar el PDF actualizado** en un nuevo archivo, preservando todo el contenido original. + +**Requisitos previos**: .NET 6+ (o .NET Framework 4.6+), una licencia o copia de evaluación de Aspose.Pdf, y una familiaridad básica con C#. Si nunca has manipulado un PDF a nivel de diccionario, no te preocupes—este tutorial explica el “por qué” detrás de cada llamada. + +--- + +![Diagrama de edición de recursos PDF](image.png){.align-center alt="Diagrama que muestra cómo editar recursos PDF y luego guardar el PDF actualizado"} + +## Guardar PDF actualizado – Visión general del flujo de trabajo completo + +Antes de sumergirnos en el código, describamos el flujo de alto nivel: + +1. **Cargar** el PDF de origen. +2. **Obtener** la primera página y su diccionario `Resources`. +3. **Navegar** al sub‑diccionario `ExtGState` donde viven los estados gráficos. +4. **Crear** un nuevo `CosPdfDictionary` que describa nuestro estado gráfico personalizado. +5. **Insertar** ese diccionario de nuevo en `ExtGState` bajo una clave única (`GS0`). +6. **Guardar** el documento modificado como un nuevo archivo. + +Eso es todo—seis pasos pequeños, cada uno encapsulado en unas pocas líneas de C#. ¿Listo? Vamos. + +## Paso 1: Cargar el documento PDF + +Abrir un archivo es la parte más sencilla. La clase `Document` de Aspose.Pdf acepta una ruta o un flujo, por lo que puedes apuntar a cualquier PDF existente. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **¿Por qué un bloque `using`?** +> Garantiza que el manejador del archivo se libere tan pronto como terminemos, evitando problemas de bloqueo cuando luego intentemos **guardar el PDF actualizado**. + +## Paso 2: Editar recursos PDF – Acceder al diccionario ExtGState + +Cada página en un PDF tiene un *diccionario de recursos* que agrupa fuentes, imágenes y estados gráficos. Para cambiar la opacidad o el modo de fusión necesitamos la entrada `ExtGState`. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Consejo profesional:** No todos los PDFs contienen una entrada `ExtGState` por defecto. El bloque condicional anterior asegura que no se lance una `KeyNotFoundException` y aún nos permite **editar recursos PDF** de forma segura. + +## Paso 3: Crear un nuevo diccionario de estado gráfico + +Un estado gráfico (`GS`) es esencialmente un conjunto de pares clave‑valor que el renderizador PDF consulta antes de dibujar. Aquí definiremos la opacidad de trazo (`CA`), la opacidad de relleno (`ca`) y el modo de fusión (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **¿Por qué estas claves?** +> - `CA` controla la opacidad del **trazo**, afectando líneas y bordes. +> - `ca` controla la opacidad del **relleno**, influyendo en formas y rellenos de texto. +> - `BM` selecciona un modo de fusión; “Normal” es el más común, pero existen alternativas como “Multiply” para efectos creativos. + +## Paso 4: Insertar el nuevo estado gráfico en ExtGState + +Ahora que tenemos un diccionario listo, simplemente lo añadimos bajo un nuevo nombre (`GS0`). El nombre debe ser único dentro de la colección `ExtGState` de la página. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Si más adelante necesitas referenciar este estado desde flujos de contenido, usarás `/GS0` en operadores PDF como `gs`. Para el propósito de este tutorial, solo añadirlo es suficiente para demostrar **la edición de recursos PDF**. + +## Paso 5: Verificar (opcional) y guardar el PDF actualizado + +En este punto la estructura interna del PDF ha cambiado, pero la salida visual no diferirá hasta que realmente referencies `GS0`. Aún así, podemos **guardar el PDF actualizado** e inspeccionar el árbol de objetos con un visor PDF o una herramienta como `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **Qué esperar:** +> - `output.pdf` será una copia byte a byte de `input.pdf` más la nueva entrada `ExtGState`. +> - Abrir el archivo en un editor de texto (o usar una herramienta de inspección PDF) revelará un nuevo objeto como: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> bajo el diccionario `ExtGState`, con la clave `/GS0`. + +Si deseas ver el efecto en acción, agrega un flujo de contenido simple que use el nuevo estado gráfico: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Ejecutar el fragmento opcional te dará un rectángulo 50 % transparente, confirmando que el estado gráfico funciona como se espera. + +--- + +## Preguntas frecuentes y casos límite + +**P: ¿Qué pasa si el PDF ya tiene una entrada `GS0`?** +R: El método `Add` sobrescribirá la clave existente. Para evitar colisiones, genera un nombre único (p. ej., `GS1`, `GS_custom`) o verifica `extGState.ContainsKey("GS0")` primero. + +**P: ¿Puedo editar otros tipos de recursos, como fuentes o XObjects?** +R: Por supuesto. `DictionaryEditor` funciona para cualquier clave de recurso de nivel superior (`Font`, `XObject`, `ColorSpace`, etc.). Simplemente reemplaza `"ExtGState"` con el nombre del diccionario deseado. + +**P: ¿Este enfoque funciona con PDFs encriptados?** +R: Si el PDF está protegido con contraseña, debes proporcionar la contraseña al crear el objeto `Document`: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Después de la desencriptación puedes editar los recursos exactamente de la misma manera. + +**P: ¿Aumentará notablemente el tamaño del archivo?** +R: Añadir un diccionario pequeño como este normalmente solo agrega unos cientos de bytes. Si añades XObjects grandes o incrustas imágenes, espera un aumento mayor. + +--- + +## Conclusión + +Ahora sabes cómo **guardar archivos PDF actualizados** después de **editar recursos PDF** directamente con Aspose.Pdf. El proceso se reduce a cargar el documento, localizar el diccionario `ExtGState`, crear un nuevo estado gráfico, insertarlo y, finalmente, persistir el resultado. Desde aquí puedes experimentar con otros tipos de recursos, encadenar múltiples estados gráficos o crear un método auxiliar reutilizable para modificaciones masivas. + +¿Próximos pasos? Prueba cambiar el modo de fusión a `"Multiply"` o `"Screen"` y observa cómo se comportan los objetos superpuestos. O explora editar el diccionario `Font` para incrustar fuentes personalizadas al vuelo. La especificación PDF es rica, y Aspose.Pdf te brinda + +## ¿Qué deberías 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 ayudarte a dominar características adicionales de la API y explorar enfoques de implementación alternativos en tus propios proyectos. + +- [Aspose Pdf .NET Abrir, Modificar y Guardar PDFs](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [Cómo extraer y guardar páginas PDF específicas usando Aspose.PDF para .NET - Guía completa](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [Cómo agregar anotaciones de adjuntos de archivo en PDFs usando Aspose.PDF para .NET | Guía paso a paso](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/swedish/net/document-manipulation/_index.md b/pdf/swedish/net/document-manipulation/_index.md index d2766426b1..5273fd9d20 100644 --- a/pdf/swedish/net/document-manipulation/_index.md +++ b/pdf/swedish/net/document-manipulation/_index.md @@ -311,6 +311,9 @@ Lär dig hur du delar upp flersidiga PDF-filer och skapar nya PDF-filer med Aspo ### [Ultimat guide till PDF-manipulation med Aspose.PDF .NET: Ladda, spara och ersätt text effektivt](./master-pdf-manipulation-aspose-pdf-net/) Lär dig hur du bemästrar PDF-manipulation med Aspose.PDF för .NET. Den här guiden behandlar hur man laddar, sparar och ersätter text i PDF-filer, perfekt för utvecklare som söker effektivitet. +### [Spara uppdaterad PDF – Redigera PDF-resurser med Aspose.Pdf](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Lär dig hur du sparar ändrade PDF-filer efter redigering av resurser med Aspose.Pdf för .NET. + ## Ytterligare resurser - [Aspose.PDF för nätdokumentation](https://docs.aspose.com/pdf/net/) diff --git a/pdf/swedish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/swedish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..00be948656 --- /dev/null +++ b/pdf/swedish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-07-23 +description: Spara uppdaterad PDF med Aspose.Pdf i C#. Lär dig hur du redigerar PDF‑resurser + som ExtGState och skapar en ny fil på bara några steg. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: sv +lastmod: 2026-07-23 +og_description: Spara uppdaterad PDF med Aspose.Pdf i C#. Denna handledning visar + hur du redigerar PDF‑resurser, lägger till ett grafikstatus och skapar en ny fil. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Spara uppdaterad PDF – Redigera PDF‑resurser med Aspose.Pdf (C#‑guide) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Spara uppdaterad PDF – Redigera PDF‑resurser med Aspose.Pdf +url: /sv/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Spara uppdaterad PDF – Redigera PDF-resurser med Aspose.Pdf + +Har du någonsin undrat hur du **sparar uppdaterad PDF** efter att ha justerat dess låg‑nivå‑objekt? Kanske behöver du ändra opacitet, blandningslägen eller andra grafikparametrar utan att återskapa hela dokumentet. Kort sagt vill du **redigera PDF-resurser** direkt. Den här guiden visar exakt hur du gör det, med Aspose.Pdf för .NET. + +Vi börjar med att ladda en befintlig PDF, dyker ner i dess resursordbok, injicerar ett nytt grafik‑tillstånd och slutligen **sparar den uppdaterade PDF‑filen**. När du är klar har du ett fungerande C#‑exempel som du kan klistra in i vilket projekt som helst—inga mystiska beroenden, bara ren kod. + +## Vad du kommer att lära dig + +- Hur du öppnar en PDF med Aspose.Pdf och hittar den första sidans resursordbok. +- Stegen för att **redigera PDF-resurser** som `ExtGState`‑ordboken. +- Skapa och infoga ett anpassat grafik‑tillstånd (`GS0`) som styr linje‑/fyll‑opacitet och blandningsläge. +- Hur du **sparar den uppdaterade PDF‑filen** till en ny fil, samtidigt som allt originalinnehåll bevaras. + +**Förutsättningar**: .NET 6+ (eller .NET Framework 4.6+), en licens eller utvärderingskopi av Aspose.Pdf, och en grundläggande kunskap i C#. Om du aldrig har rört en PDF på ordboksnivå, oroa dig inte—denna handledning förklarar “varför” bakom varje anrop. + +--- + +![Diagram över PDF-resursredigering](image.png){.align-center alt="Diagram som visar hur man redigerar PDF-resurser och sedan sparar uppdaterad PDF"} + +## Spara uppdaterad PDF – Fullständig arbetsflödesöversikt + +Innan vi hoppar in i koden, låt oss beskriva det övergripande flödet: + +1. **Load** käll‑PDF‑filen. +2. **Grab** den första sidan och dess `Resources`‑ordbok. +3. **Navigate** till `ExtGState`‑undordboken där grafik‑tillstånd finns. +4. **Create** en ny `CosPdfDictionary` som beskriver vårt anpassade grafik‑tillstånd. +5. **Insert** den ordboken tillbaka i `ExtGState` under en unik nyckel (`GS0`). +6. **Save** det modifierade dokumentet som en ny fil. + +Det är allt—sex små steg, var och en kapslad i några rader C#. Är du redo? Låt oss köra. + +## Steg 1: Ladda PDF‑dokumentet + +Att öppna en fil är den enklaste delen. Aspose.Pdf:s `Document`‑klass tar emot en sökväg eller en ström, så du kan peka den på vilken befintlig PDF som helst. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Varför ett `using`‑block?** +> Det garanterar att filhandtaget frigörs så snart vi är klara, vilket förhindrar lås‑problem när vi senare försöker **spara den uppdaterade PDF‑filen**. + +## Steg 2: Redigera PDF‑resurser – Åtkomst till ExtGState‑ordboken + +Varje sida i en PDF har en *resursordbok* som grupperar typsnitt, bilder och grafik‑tillstånd. För att ändra opacitet eller blandningsläge behöver vi `ExtGState`‑posten. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Proffstips:** Inte alla PDF‑filer innehåller en `ExtGState`‑post som standard. Det villkorsstyrda blocket ovan säkerställer att vi inte kastar ett `KeyNotFoundException` och låter oss ändå **redigera PDF‑resurser** på ett säkert sätt. + +## Steg 3: Skapa en ny grafik‑tillståndsordbok + +Ett grafik‑tillstånd (`GS`) är i princip en uppsättning nyckel‑värde‑par som PDF‑renderaren konsulterar innan den ritar. Här kommer vi att definiera linje‑opacitet (`CA`), fyll‑opacitet (`ca`) och blandningsläge (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Varför dessa nycklar?** +> - `CA` styr **linje**‑opaciteten, vilket påverkar linjer och kanter. +> - `ca` styr **fyll**‑opaciteten, vilket påverkar former och textfyllningar. +> - `BM` väljer ett blandningsläge; “Normal” är det vanligaste men alternativ som “Multiply” finns för kreativa effekter. + +## Steg 4: Infoga det nya grafik‑tillståndet i ExtGState + +Nu när vi har en färdig ordbok, lägger vi helt enkelt till den under ett nytt namn (`GS0`). Namnet måste vara unikt inom sidans `ExtGState`‑samling. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Om du senare behöver referera till detta tillstånd från innehållsströmmar, använder du `/GS0` i PDF‑operatorer som `gs`. För syftet med den här handledningen räcker det att bara lägga till det för att demonstrera **redigering av PDF‑resurser**. + +## Steg 5: Verifiera (valfritt) och spara den uppdaterade PDF‑filen + +Vid detta tillfälle har PDF:ens interna struktur förändrats, men den visuella utskriften kommer inte att skilja sig förrän du faktiskt refererar `GS0`. Ändå kan vi **spara den uppdaterade PDF‑filen** och inspektera objektträdet med en PDF‑visare eller ett verktyg som `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **Vad du kan förvänta dig:** +> - `output.pdf` blir en byte‑för‑byte‑kopia av `input.pdf` plus den nya `ExtGState`‑posten. +> - När du öppnar filen i en textredigerare (eller med ett PDF‑inspektionsverktyg) kommer du att se ett nytt objekt som: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> under `ExtGState`‑ordboken, med nyckeln `/GS0`. + +Om du vill se effekten i praktiken, lägg till ett enkelt innehållsflöde som använder det nya grafik‑tillståndet: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Att köra det valfria kodsnutten ger dig en 50 % transparent rektangel, vilket bekräftar att grafik‑tillståndet fungerar som avsett. + +--- + +## Vanliga frågor & kantfall + +**Q: Vad händer om PDF‑filen redan har en `GS0`‑post?** +A: `Add`‑metoden kommer att skriva över den befintliga nyckeln. För att undvika kollisioner, generera ett unikt namn (t.ex. `GS1`, `GS_custom`) eller kontrollera `extGState.ContainsKey("GS0")` först. + +**Q: Kan jag redigera andra resurstypers, som typsnitt eller XObjects?** +A: Absolut. `DictionaryEditor` fungerar för vilken toppnivå‑resursnyckel som helst (`Font`, `XObject`, `ColorSpace`, etc.). Byt bara ut `"ExtGState"` mot det önskade ordboksnamnet. + +**Q: Fungerar detta tillvägagångssätt med krypterade PDF‑filer?** +A: Om PDF‑filen är lösenordsskyddad måste du ange lösenordet när du skapar `Document`‑objektet: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Efter avkryptering kan du redigera resurser på exakt samma sätt. + +**Q: Kommer filstorleken att öka märkbart?** +A: Att lägga till en liten ordbok som denna lägger vanligtvis bara till några hundra byte. Om du lägger till stora XObjects eller bäddar in bilder, förvänta dig en större ökning. + +--- + +## Slutsats + +Du vet nu hur du **sparar uppdaterade PDF‑filer** efter att ha direkt **redigerat PDF‑resurser** med Aspose.Pdf. Processen reduceras till att ladda dokumentet, hitta `ExtGState`‑ordboken, skapa ett nytt grafik‑tillstånd, infoga det och slutligen spara resultatet. Härifrån kan du experimentera med andra resurstypers, kedja flera grafik‑tillstånd, eller bygga en återanvändbar hjälpfunktion för massändringar. + +Nästa steg? Prova att byta blandningsläget till `"Multiply"` eller `"Screen"` och se hur överlappande objekt beter sig. Eller utforska att redigera `Font`‑ordboken för att bädda in anpassade typsnitt i farten. PDF‑specifikationen är rik, och Aspose.Pdf ger dig + +## 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. + +- [Aspose Pdf .NET Öppna Ändra Spara PDF‑filer](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [Hur man extraherar och sparar specifika PDF‑sidor med Aspose.PDF för .NET – En omfattande guide](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [Hur man lägger till filbilaggs‑annotationer i PDF‑filer med Aspose.PDF för .NET | Steg‑för‑steg‑guide](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/thai/net/document-manipulation/_index.md b/pdf/thai/net/document-manipulation/_index.md index 0084ed8370..cb29de221d 100644 --- a/pdf/thai/net/document-manipulation/_index.md +++ b/pdf/thai/net/document-manipulation/_index.md @@ -137,7 +137,7 @@ ### [วิธีเชื่อมโยงสตรีม PDF โดยใช้ Aspose.PDF สำหรับ .NET: คู่มือฉบับสมบูรณ์](./aspose-pdf-net-stream-concatenation-guide/) เรียนรู้วิธีเชื่อมโยงสตรีม PDF โดยใช้ Aspose.PDF สำหรับ .NET ด้วยคู่มือที่ครอบคลุมนี้ สำรวจคำแนะนำทีละขั้นตอน ข้อกำหนดเบื้องต้น และการใช้งานจริง -### [วิธีเชื่อมโยงไฟล์ PDF ด้วย Aspose.PDF สำหรับ .NET: คู่มือฉบับสมบูรณ์](./concatenate-pdfs-aspose-pdf-dotnet-guide/) +### [วิธีเชื่อมโยงไฟล์ PDF โดยใช้ Aspose.PDF สำหรับ .NET: คู่มือฉบับสมบูรณ์](./concatenate-pdfs-aspose-pdf-dotnet-guide/) เรียนรู้วิธีการรวมไฟล์ PDF หลายไฟล์โดยใช้ Aspose.PDF สำหรับ .NET คู่มือฉบับสมบูรณ์นี้ครอบคลุมถึงการตั้งค่า การใช้งาน และแอปพลิเคชันในทางปฏิบัติ ### [วิธีเชื่อมโยงไฟล์ PDF กับหน้าว่างโดยใช้ Aspose.PDF สำหรับ .NET: คู่มือฉบับสมบูรณ์](./concatenate-pdfs-blank-pages-aspose-pdf-net/) @@ -176,7 +176,7 @@ ### [วิธีการรวมไฟล์ PDF หลายไฟล์อย่างมีประสิทธิภาพโดยใช้ Aspose.PDF สำหรับ .NET | คำแนะนำในการจัดการเอกสาร](./append-multiple-pdfs-aspose-pdf-dotnet/) เรียนรู้วิธีการรวมเอกสาร PDF หลายฉบับเป็นไฟล์เดียวอย่างมีประสิทธิภาพโดยใช้ Aspose.PDF สำหรับ .NET คู่มือนี้ประกอบด้วยคำแนะนำทีละขั้นตอน ตัวอย่างโค้ด และเคล็ดลับเพื่อปรับกระบวนการจัดการเอกสารของคุณให้มีประสิทธิภาพยิ่งขึ้น -### [วิธีการรวมไฟล์ PDF โดยใช้ Aspose.PDF สำหรับ .NET: การเชื่อมต่อสตรีมและการรักษาโครงสร้างเชิงตรรกะ](./merge-pdf-aspose-net-streams-structure/) +### [วิธีการรวมไฟล์ PDF โดยใช้ Aspose.PDF สำหรับ .NET: การเชื่อมต่อสตรีมและการรักษาโครงสร้างเชิงตรรกะ](./merge-pdf-aspose-pdf-net-streams-structure/) เรียนรู้วิธีเชื่อมโยงไฟล์ PDF โดยใช้ Aspose.PDF สำหรับ .NET โดยรักษาโครงสร้างเชิงตรรกะเพื่อการเข้าถึงได้ คู่มือนี้ครอบคลุมถึงการเชื่อมโยงสตรีม การเพิ่มประสิทธิภาพการทำงาน และการใช้งานจริง ### [วิธีการใส่คำนำหน้าชื่อคลาส CSS ในไฟล์ PDF โดยใช้ Aspose.PDF สำหรับ .NET](./prefix-css-class-names-pdf-aspose-pdf-net/) @@ -195,7 +195,7 @@ เรียนรู้วิธีแบ่งหน้า PDF ออกเป็นไฟล์แต่ละไฟล์อย่างมีประสิทธิภาพโดยใช้ Aspose.PDF สำหรับ .NET ด้วยคู่มือฉบับสมบูรณ์นี้ พัฒนาทักษะการจัดการเอกสารของคุณวันนี้ ### [วิธีแยกหน้า PDF โดยใช้ Aspose.PDF สำหรับ .NET: คู่มือฉบับสมบูรณ์](./split-pdf-pages-aspose-pdf-net/) -เรียนรู้วิธีแยกหน้าเฉพาะจาก PDF ออกเป็นไฟล์แยกต่างหากโดยใช้ Aspose.PDF สำหรับ .NET คู่มือนี้ครอบคลุมถึงการจัดการและการตั้งค่าสตรีม +เรียนรู้วิธีแยกหน้า PDF โดยใช้ Aspose.PDF สำหรับ .NET ด้วยคู่มือที่ครอบคลุมนี้ เชี่ยวชาญการจัดการเอกสารใน C# และเพิ่มประสิทธิภาพเวิร์กโฟลว์ของคุณ ### [วิธีแยกหน้า PDF โดยใช้ Aspose.PDF สำหรับ .NET: คำแนะนำทีละขั้นตอน](./split-pdf-pages-aspose-pdf-net-guide/) เรียนรู้วิธีแยกหน้า PDF โดยใช้ Aspose.PDF สำหรับ .NET ด้วยคู่มือที่ครอบคลุมนี้ เชี่ยวชาญการจัดการเอกสารใน C# และเพิ่มประสิทธิภาพเวิร์กโฟลว์ของคุณ @@ -267,7 +267,7 @@ เรียนรู้วิธีจัดการเอกสาร PDF อย่างมีประสิทธิภาพด้วยการเปลี่ยนการวางแนวของหน้า ตรวจจับสีขาว และระบุหน้าว่างโดยใช้ Aspose.PDF สำหรับ .NET ### [การเรียนรู้การจัดการ PDF อย่างเชี่ยวชาญ: คู่มือฉบับสมบูรณ์สำหรับการใช้ Aspose.PDF สำหรับ .NET](./aspose-pdf-net-manipulation-guide/) -เรียนรู้วิธีการจัดการ PDF อย่างมีประสิทธิภาพด้วย Aspose.PDF สำหรับ .NET คู่มือนี้ครอบคลุมทุกสิ่งที่คุณต้องการสำหรับการจัดการเอกสารอัตโนมัติ ตั้งแต่การตั้งค่าไปจนถึงฟีเจอร์ขั้นสูง +เรียนรู้วิธีการจัดการ PDF อย่างมีประสิทธิภาพด้วย Aspose.PDF สำหรับ .NET คู่มือนี้ครอบคลุมทุกอย่างที่คุณต้องการสำหรับการจัดการเอกสารอัตโนมัติ ตั้งแต่การตั้งค่าไปจนถึงฟีเจอร์ขั้นสูง ### [การเรียนรู้การจัดการ PDF: Aspose.PDF .NET สำหรับการค้นหา Regex และการประมวลผลเอกสาร](./aspose-pdf-net-regex-searching/) เรียนรู้วิธีใช้ Aspose.PDF สำหรับ .NET เพื่อโหลด จัดการ และดำเนินการค้นหา regex ในเอกสาร PDF ทำให้กระบวนการประมวลผลเอกสารของคุณเป็นแบบอัตโนมัติอย่างมีประสิทธิภาพ @@ -284,8 +284,8 @@ ### [การจัดการ PDF ได้อย่างง่ายดาย: คู่มือ Aspose.PDF .NET สำหรับการโหลด การบันทึก และการกำหนดค่าการซูม](./master-pdf-manipulation-aspose-dotnet-load-save-configure-page-zoom/) เรียนรู้การจัดการ PDF อย่างเชี่ยวชาญด้วย Aspose.PDF สำหรับ .NET เรียนรู้วิธีโหลด บันทึก แยกมิติ และกำหนดค่าการซูมอย่างมีประสิทธิภาพ -### [แทนที่ข้อความแรกที่เกิดขึ้นใน PDF โดยใช้ Aspose.PDF สำหรับ .NET - คู่มือที่ครอบคลุม](./replace-first-text-occurrence-aspose-pdf-net/) -เรียนรู้วิธีการแทนที่ข้อความแรกใน PDF โดยใช้ Aspose.PDF สำหรับ .NET คู่มือนี้ครอบคลุมถึงการตั้งค่า ตัวอย่างโค้ด และการใช้งานจริง +### [แทนที่แรกใน PDF โดยใช้ Aspose.PDF สำหรับ .NET - คู่มือที่ครอบคลุม](./replace-first-text-occurrence-aspose-pdf-net/) +เรียนรู้วิธีแทนที่ข้อความแรกใน PDF โดยใช้ Aspose.PDF สำหรับ .NET คู่มือนี้ครอบคลุมถึงการตั้งค่า ตัวอย่างโค้ด และการใช้งานจริง ### [ปรับขนาดเนื้อหา PDF ด้วย Aspose.PDF สำหรับ .NET](./resize-pdf-contents-aspose-pdf-dotnet/) บทช่วยสอนเกี่ยวกับโค้ดสำหรับ Aspose.PDF Net @@ -311,6 +311,9 @@ ### [คู่มือฉบับสมบูรณ์สำหรับการจัดการ PDF ด้วย Aspose.PDF .NET: โหลด บันทึก และแทนที่ข้อความอย่างมีประสิทธิภาพ](./master-pdf-manipulation-aspose-pdf-net/) เรียนรู้วิธีการจัดการ PDF อย่างเชี่ยวชาญโดยใช้ Aspose.PDF สำหรับ .NET คู่มือนี้ครอบคลุมถึงการโหลด การบันทึก และการแทนที่ข้อความใน PDF ซึ่งเหมาะสำหรับนักพัฒนาที่ต้องการประสิทธิภาพ +### [บันทึก PDF ที่อัปเดต – แก้ไขทรัพยากร PDF ด้วย Aspose.PDF](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +เรียนรู้วิธีบันทึก PDF ที่แก้ไขแล้วและจัดการทรัพยากร PDF ด้วย Aspose.PDF สำหรับ .NET อย่างมีประสิทธิภาพ + ## แหล่งข้อมูลเพิ่มเติม - [Aspose.PDF สำหรับเอกสารประกอบ Net](https://docs.aspose.com/pdf/net/) diff --git a/pdf/thai/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/thai/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..9c66d10dde --- /dev/null +++ b/pdf/thai/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,263 @@ +--- +category: general +date: 2026-07-23 +description: บันทึก PDF ที่อัปเดตโดยใช้ Aspose.Pdf ใน C# เรียนรู้วิธีแก้ไขทรัพยากร + PDF เช่น ExtGState และสร้างไฟล์ใหม่เพียงไม่กี่ขั้นตอน +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: th +lastmod: 2026-07-23 +og_description: บันทึก PDF ที่อัปเดตด้วย Aspose.Pdf ใน C# บทเรียนนี้แสดงวิธีแก้ไขทรัพยากร + PDF, เพิ่มสถานะกราฟิก และสร้างไฟล์ใหม่ +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: บันทึก PDF ที่อัปเดต – แก้ไขทรัพยากร PDF ด้วย Aspose.Pdf (คู่มือ C#) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: บันทึก PDF ที่อัปเดต – แก้ไขทรัพยากร PDF ด้วย Aspose.Pdf +url: /th/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# บันทึก PDF ที่อัปเดต – แก้ไขทรัพยากร PDF ด้วย Aspose.Pdf + +เคยสงสัยไหมว่าจะแก้ไข **PDF ที่อัปเดต** อย่างไรหลังจากปรับเปลี่ยนวัตถุต่ำระดับ? บางทีคุณอาจต้องการเปลี่ยนความทึบ, โหมดการผสม, หรือพารามิเตอร์กราฟิกอื่น ๆ โดยไม่ต้องสร้างเอกสารใหม่ทั้งหมด สรุปคือคุณต้องการ **แก้ไขทรัพยากร PDF** โดยตรง คู่มือนี้จะพาคุณทำตามขั้นตอนนั้นโดยใช้ Aspose.Pdf สำหรับ .NET + +เราจะเริ่มจากการโหลด PDF ที่มีอยู่แล้ว, ดำดิ่งเข้าไปในพจนานุกรมทรัพยากร, แทรกสถานะกราฟิกใหม่, และสุดท้าย **บันทึก PDF ที่อัปเดต** เมื่อทำเสร็จคุณจะได้โค้ดสแนปช็อต C# ที่สามารถนำไปใช้ในโปรเจกต์ใดก็ได้ — ไม่มีการพึ่งพาที่ซับซ้อน, เพียงโค้ดบริสุทธิ์เท่านั้น + +## สิ่งที่คุณจะได้เรียนรู้ + +- วิธีเปิด PDF ด้วย Aspose.Pdf และค้นหาพจนานุกรมทรัพยากรของหน้าแรก +- ขั้นตอนในการ **แก้ไขทรัพยากร PDF** เช่นพจนานุกรม `ExtGState` +- การสร้างและแทรกสถานะกราฟิกแบบกำหนดเอง (`GS0`) ที่ควบคุมความทึบของเส้น/เติมและโหมดการผสม +- วิธี **บันทึก PDF ที่อัปเดต** ไปยังไฟล์ใหม่โดยคงเนื้อหาต้นฉบับทั้งหมดไว้ + +**ข้อกำหนดเบื้องต้น**: .NET 6+ (หรือ .NET Framework 4.6+), ไลเซนส์หรือสำเนาประเมินของ Aspose.Pdf, และความคุ้นเคยพื้นฐานกับ C# หากคุณไม่เคยเจอ PDF ระดับพจนานุกรมก็ไม่ต้องกังวล — คู่มือนี้จะอธิบาย “ทำไม” ของแต่ละคำสั่ง + +--- + +![Diagram of PDF resource editing](image.png){.align-center alt="แผนภาพแสดงวิธีแก้ไขทรัพยากร PDF แล้วบันทึก PDF ที่อัปเดต"} + +## บันทึก PDF ที่อัปเดต – ภาพรวมขั้นตอนทำงานเต็มรูปแบบ + +ก่อนที่เราจะกระโดดเข้าสู่โค้ด, มาดูภาพรวมของกระบวนการระดับสูงกัน: + +1. **Load** PDF ต้นฉบับ +2. **Grab** หน้าแรกและพจนานุกรม `Resources` ของมัน +3. **Navigate** ไปยังพจนานุกรมย่อย `ExtGState` ที่เก็บสถานะกราฟิก +4. **Create** `CosPdfDictionary` ใหม่ที่อธิบายสถานะกราฟิกที่กำหนดเองของเรา +5. **Insert** พจนานุกรมนั้นกลับเข้าไปใน `ExtGState` ภายใต้คีย์ที่ไม่ซ้ำ (`GS0`) +6. **Save** เอกสารที่แก้ไขแล้วเป็นไฟล์ใหม่ + +แค่นั้นเอง — หกขั้นตอนเล็ก ๆ แต่ละขั้นตอนใช้เพียงไม่กี่บรรทัดของ C# พร้อมหรือยัง? ไปกันเลย + +## ขั้นตอนที่ 1: โหลดเอกสาร PDF + +การเปิดไฟล์เป็นส่วนที่ง่ายที่สุด `Document` ของ Aspose.Pdf รับพาธหรือสตรีม, ดังนั้นคุณสามารถชี้ไปที่ PDF ใดก็ได้ที่มีอยู่ + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **ทำไมต้องใช้บล็อก `using`?** +> มันรับประกันว่าการจัดการไฟล์จะถูกปล่อยออกทันทีเมื่อเสร็จสิ้น, ป้องกันปัญหาไฟล์ล็อกเมื่อเราพยายาม **บันทึก PDF ที่อัปเดต** ต่อไป + +## ขั้นตอนที่ 2: แก้ไขทรัพยากร PDF – เข้าถึงพจนานุกรม ExtGState + +แต่ละหน้าของ PDF มี *พจนานุกรมทรัพยากร* ที่จัดกลุ่มฟอนต์, รูปภาพ, และสถานะกราฟิก เพื่อเปลี่ยนความทึบหรือโหมดการผสมเราต้องการรายการ `ExtGState` + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **เคล็ดลับ:** PDF บางไฟล์อาจไม่มีรายการ `ExtGState` โดยค่าเริ่มต้น บล็อกเงื่อนไขข้างต้นทำให้เราหลีกเลี่ยง `KeyNotFoundException` และยังคงสามารถ **แก้ไขทรัพยากร PDF** ได้อย่างปลอดภัย + +## ขั้นตอนที่ 3: สร้างพจนานุกรมสถานะกราฟิกใหม่ + +สถานะกราฟิก (`GS`) คือชุดคีย์‑ค่า ที่เครื่องมือแสดงผล PDF จะตรวจสอบก่อนวาดภาพ ที่นี่เราจะกำหนดความทึบของเส้น (`CA`), ความทึบของการเติม (`ca`), และโหมดการผสม (`BM`) + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **ทำไมต้องใช้คีย์เหล่านี้?** +> - `CA` ควบคุมความทึบของ **stroke** (เส้น), มีผลต่อเส้นและขอบ +> - `ca` ควบคุมความทึบของ **fill** (การเติม), มีผลต่อรูปทรงและการเติมข้อความ +> - `BM` เลือกโหมดการผสม; “Normal” เป็นค่าที่ใช้บ่อยที่สุด แต่ก็มีตัวเลือกเช่น “Multiply” สำหรับเอฟเฟกต์สร้างสรรค์ + +## ขั้นตอนที่ 4: แทรกสถานะกราฟิกใหม่เข้าไปใน ExtGState + +ตอนนี้เรามีพจนานุกรมที่พร้อมใช้งานแล้ว เพียงเพิ่มเข้าไปภายใต้ชื่อใหม่ (`GS0`) ชื่อนี้ต้องไม่ซ้ำกับคีย์ที่มีอยู่ในคอลเลกชัน `ExtGState` ของหน้า + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +หากคุณต้องการอ้างอิงสถานะนี้จากสตรีมเนื้อหาในภายหลัง คุณจะใช้ `/GS0` ในออพเรเตอร์ PDF เช่น `gs` สำหรับวัตถุประสงค์ของบทเรียนนี้ การเพิ่มเข้าไปเท่านั้นก็เพียงพอที่จะสาธิต **การแก้ไขทรัพยากร PDF** แล้ว + +## ขั้นตอนที่ 5: ตรวจสอบ (ไม่บังคับ) และบันทึก PDF ที่อัปเดต + +ในขณะนี้โครงสร้างภายในของ PDF ได้เปลี่ยนแปลงแล้ว, แต่ผลลัพธ์ภาพจะไม่แตกต่างจนกว่าจะอ้างอิง `GS0` จริง ๆ อย่างไรก็ตามเรายังสามารถ **บันทึก PDF ที่อัปเดต** และตรวจสอบต้นไม้ของอ็อบเจกต์ด้วยโปรแกรมดู PDF หรือเครื่องมืออย่าง `pdfcpu` + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **สิ่งที่ควรคาดหวัง:** +> - `output.pdf` จะเป็นสำเนาแบบไบต์ต่อไบต์ของ `input.pdf` พร้อมรายการ `ExtGState` ใหม่ +> - การเปิดไฟล์ในโปรแกรมแก้ไขข้อความ (หรือใช้เครื่องมือตรวจสอบ PDF) จะพบอ็อบเจกต์ใหม่เช่น: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> อยู่ภายใต้พจนานุกรม `ExtGState` โดยมีคีย์เป็น `/GS0` + +หากต้องการเห็นผลลัพธ์จริง ให้เพิ่มสตรีมเนื้อหาง่าย ๆ ที่ใช้สถานะกราฟิกใหม่: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +การรันสแนปช็อตเสริมนี้จะสร้างสี่เหลี่ยมโปร่งใส 50 % ยืนยันว่าสถานะกราฟิกทำงานตามที่ตั้งใจ + +--- + +## คำถามที่พบบ่อย & กรณีขอบเขต + +**Q: ถ้า PDF มีรายการ `GS0` อยู่แล้วจะทำอย่างไร?** +A: เมธอด `Add` จะเขียนทับคีย์ที่มีอยู่ เพื่อหลีกเลี่ยงการชนกัน ควรสร้างชื่อที่ไม่ซ้ำ (เช่น `GS1`, `GS_custom`) หรือเช็ค `extGState.ContainsKey("GS0")` ก่อน + +**Q: ฉันสามารถแก้ไขประเภททรัพยากรอื่น ๆ เช่น ฟอนต์หรือ XObjects ได้ไหม?** +A: ทำได้แน่นอน `DictionaryEditor` ทำงานกับคีย์ทรัพยากรระดับบน (`Font`, `XObject`, `ColorSpace` ฯลฯ) เพียงเปลี่ยน `"ExtGState"` เป็นชื่อพจนานุกรมที่ต้องการ + +**Q: วิธีนี้ทำงานกับ PDF ที่เข้ารหัสหรือไม่?** +A: หาก PDF ถูกป้องกันด้วยรหัสผ่าน คุณต้องส่งรหัสผ่านเมื่อสร้างอ็อบเจกต์ `Document`: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +หลังจากถอดรหัสแล้วคุณสามารถแก้ไขทรัพยากรได้เช่นเดียวกัน + +**Q: ขนาดไฟล์จะเพิ่มขึ้นอย่างมีนัยสำคัญหรือไม่?** +A: การเพิ่มพจนานุกรมขนาดเล็กเช่นนี้มักเพิ่มเพียงไม่กี่ร้อยไบต์ หากคุณเพิ่ม XObjects ขนาดใหญ่หรือฝังรูปภาพ จะทำให้ไฟล์เพิ่มขนาดมากขึ้น + +--- + +## สรุป + +คุณได้เรียนรู้วิธี **บันทึก PDF ที่อัปเดต** หลังจาก **แก้ไขทรัพยากร PDF** โดยตรงด้วย Aspose.Pdf กระบวนการสรุปได้เป็นการโหลดเอกสาร, ค้นหาพจนานุกรม `ExtGState`, สร้างสถานะกราฟิกใหม่, แทรกเข้าไป, และสุดท้ายบันทึกผลลัพธ์ จากนี้คุณสามารถทดลองกับประเภททรัพยากรอื่น ๆ, เชื่อมต่อหลายสถานะกราฟิก, หรือสร้างเมธอดช่วยเหลือที่ใช้ซ้ำได้สำหรับการแก้ไขเป็นกลุ่ม + +ขั้นตอนต่อไป? ลองเปลี่ยนโหมดการผสมเป็น `"Multiply"` หรือ `"Screen"` แล้วดูว่าวัตถุที่ซ้อนทับกันทำงานอย่างไร หรือสำรวจการแก้ไขพจนานุกรม `Font` เพื่อฝังฟอนต์กำหนดเองแบบทันที สเปค PDF มีความลึกและ Aspose.Pdf ให้คุณ + +## สิ่งที่คุณควรเรียนต่อ + +บทแนะนำต่อไปนี้ครอบคลุมหัวข้อที่เกี่ยวข้องอย่างใกล้ชิดและต่อยอดจากเทคนิคที่แสดงในคู่มือนี้ แต่ละแหล่งข้อมูลมีโค้ดตัวอย่างทำงานครบถ้วนพร้อมคำอธิบายขั้นตอน‑ต่อ‑ขั้นตอน เพื่อช่วยคุณเชี่ยวชาญฟีเจอร์ API เพิ่มเติมและสำรวจแนวทางการทำงานอื่น ๆ ในโปรเจกต์ของคุณ + +- [Aspose Pdf Net Open Modify Save Pdfs](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [How to Extract & Save Specific PDF Pages Using Aspose.PDF for .NET - A Comprehensive Guide](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [How to Add File Attachment Annotations in PDFs Using Aspose.PDF for .NET | Step-by-Step Guide](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/turkish/net/document-manipulation/_index.md b/pdf/turkish/net/document-manipulation/_index.md index a2c89fccb5..c37e801fbb 100644 --- a/pdf/turkish/net/document-manipulation/_index.md +++ b/pdf/turkish/net/document-manipulation/_index.md @@ -107,7 +107,7 @@ Aspose.PDF for .NET'i kullanarak PDF dosyalarınıza sorunsuz bir şekilde metin ### [.NET için Aspose.PDF Kullanarak PDF'ye Satır Nesnesi Nasıl Eklenir: Adım Adım Kılavuz](./add-line-aspose-pdf-dotnet-tutorial/) .NET için Aspose.PDF kullanarak PDF'lere satır nesnelerinin nasıl ekleneceğini öğrenin. Bu kılavuz kurulum, kodlama örnekleri ve pratik uygulamaları kapsar. -### [.NET için Aspose.PDF Kullanarak PDF'lere Metin Damgası Alt Bilgisi Nasıl Eklenir: Adım Adım Kılavuz](./add-text-stamp-footer-aspose-pdf-net/) +### [.NET için Aspose.PDF Kullanarak PDF'ye Metin Damgası Alt Bilgisi Nasıl Eklenir: Adım Adım Kılavuz](./add-text-stamp-footer-aspose-pdf-net/) Aspose.PDF for .NET'i kullanarak PDF belgelerinizin her sayfasına metin damgası altbilgileri eklemeyi adım adım kılavuzumuzla öğrenin. Belge işlemeyi verimli bir şekilde kolaylaştırın. ### [Aspose.PDF for .NET Kullanarak PDF'lere Metin Damgası Nasıl Eklenir](./add-text-stamp-pdf-aspose-dotnet/) @@ -152,7 +152,7 @@ Aspose.PDF for .NET kullanarak PDF sayfa boyutlarını A4'e nasıl güncelleyece ### [.NET için Aspose.PDF Kullanarak PDF'deki Sayfaları Nasıl Sayabilirsiniz (C# Eğitimi)](./mastering-aspose-pdf-net-get-page-count/) Bu adım adım C# eğitimiyle .NET için Aspose.PDF kullanarak bir PDF'deki sayfaların nasıl sayılacağını öğrenin. Belge düzenlemede kolayca ustalaşın. -### [.NET için Aspose.PDF ile PDF'leri Özelleştirme: Sayfa Kenar Boşluklarını Ayarlama ve Çizgiler Çizme](./customize-pdfs-aspose-pdf-set-margins-draw-lines/) +### [.NET için Aspose.PDF Kullanarak PDF'leri Özelleştirme: Sayfa Kenar Boşluklarını Ayarlama ve Çizgiler Çizme](./customize-pdfs-aspose-pdf-set-margins-draw-lines/) Sayfa kenar boşluklarını ayarlayarak ve çizgiler çizerek Aspose.PDF for .NET kullanarak PDF'leri nasıl özelleştireceğinizi öğrenin. Belge biçimlendirmesini geliştirmek isteyen geliştiriciler için mükemmeldir. ### [Aspose.PDF .NET kullanarak PDF'den Sayfalar Nasıl Silinir: Kapsamlı Bir Kılavuz](./delete-pdf-pages-aspose-net/) @@ -173,7 +173,7 @@ Aspose.PDF for .NET kullanarak PDF belgelerindeki gizli metinleri nasıl yönete ### [.NET için Aspose.PDF Kullanarak PDF'ye Sayfalar Nasıl Eklenir: Adım Adım Kılavuz](./insert-pages-into-pdf-aspose-net/) Aspose.PDF for .NET kullanarak bir PDF'den diğerine belirli sayfaları nasıl ekleyeceğinizi öğrenin. Belge düzenleme becerilerinizi geliştirmek için bu adım adım kılavuzu izleyin. -### [.NET için Aspose.PDF Kullanarak Birden Fazla PDF'yi Verimli Şekilde Nasıl Birleştirirsiniz | Belge İşleme Kılavuzu](./append-multiple-pdfs-aspose-pdf-dotnet/) +### [.NET için Aspose.PDF Kullanarak Birden Fazla PDF'yi Verimli Şekilde Nasıl Birleştirirsiniz | Belge İşleme Kılavuzu](./append-multiple-pdf-files-aspose-net/) Aspose.PDF for .NET kullanarak birden fazla PDF belgesini tek bir dosyada nasıl etkili bir şekilde birleştireceğinizi öğrenin. Bu kılavuz, belge yönetimi sürecinizi kolaylaştırmak için adım adım talimatlar, kod örnekleri ve ipuçları sunar. ### [.NET için Aspose.PDF Kullanarak PDF Dosyaları Nasıl Birleştirilir: Akış Birleştirme ve Mantıksal Yapı Koruma](./merge-pdf-aspose-net-streams-structure/) @@ -248,7 +248,7 @@ Güçlü Aspose.PDF .NET kütüphanesini kullanarak PDF belgelerini yükleme, ge ### [.NET için Aspose.PDF ile PDF İşlemede Ustalaşın: Kapsamlı Bir Kılavuz](./mastering-pdf-manipulation-aspose-pdf-net-guide/) Aspose.PDF for .NET kullanarak PDF'lerden verileri etkili bir şekilde nasıl oluşturacağınızı, değiştireceğinizi, birleştireceğinizi ve çıkaracağınızı öğrenin. Belge iş akışlarınızı geliştirin ve üretkenliği artırın. -### [.NET için Aspose.PDF ile PDF Sayfa Sayısı Manipülasyonunda Ustalaşın: Eksiksiz Bir Kılavuz](./mastering-pdf-manipulation-aspose-pdf-net/) +### [.NET için Aspose.PDF Kullanarak PDF Sayfa Sayısı Manipülasyonunda Ustalaşın: Eksiksiz Bir Kılavuz](./mastering-pdf-manipulation-aspose-pdf-net/) Aspose.PDF for .NET kullanarak PDF sayfa sayılarını nasıl verimli bir şekilde alacağınızı ve değiştireceğinizi öğrenin. Bu kılavuz kurulum, uygulama ve pratik uygulamaları kapsar. ### [Aspose.PDF .NET'te Ustalaşma: LaTeX'i PDF Tablolarına ve Hücrelerine Sorunsuz Bir Şekilde Entegre Edin](./integrate-latex-aspose-pdf-dotnet/) @@ -270,7 +270,7 @@ Aspose.PDF for .NET'i kullanarak sayfa yönünü değiştirerek, beyaz rengi alg Aspose.PDF for .NET ile PDF'leri nasıl verimli bir şekilde işleyeceğinizi öğrenin. Kurulumdan gelişmiş özelliklere kadar, bu kılavuz belge otomasyonu için ihtiyacınız olan her şeyi kapsar. ### [PDF Manipülasyonunda Ustalaşma: Regex Aramaları ve Belge İşleme için Aspose.PDF .NET](./aspose-pdf-net-regex-searching/) -PDF belgelerinde regex aramaları yüklemek, düzenlemek ve gerçekleştirmek için Aspose.PDF for .NET'i nasıl kullanacağınızı öğrenin. Belge işleme görevlerinizi verimli bir şekilde otomatikleştirin. +PDF belgelerinde regex aramaları yüklemek, düzenlemek ve gerçekleştirmek için Aspose.PDF for .NET'i nasıl kullanacağınızı öğrenın. Belge işleme görevlerinizi verimli bir şekilde otomatikleştirin. ### [Aspose.PDF .NET ile PDF Sayfa Bölmede Ustalaşma](./mastering-page-splitting-aspose-pdf-net/) Aspose.PDF Net için bir kod öğreticisi @@ -309,7 +309,9 @@ Aspose.PDF for .NET kullanarak PDF sayfalarını ayrı dosyalara nasıl bölece Çok sayfalı PDF'leri nasıl böleceğinizi ve .NET için Aspose.PDF kullanarak yeni PDF dosyaları nasıl oluşturacağınızı öğrenin. Kod örnekleriyle bu kapsamlı kılavuzu izleyin. ### [Aspose.PDF .NET ile PDF Düzenlemeye İlişkin Nihai Kılavuz: Metni Verimli Şekilde Yükleyin, Kaydedin ve Değiştirin](./master-pdf-manipulation-aspose-pdf-net/) -Aspose.PDF for .NET kullanarak PDF düzenlemede ustalaşmayı öğrenin. Bu kılavuz, PDF'lerde metin yükleme, kaydetme ve değiştirmeyi kapsar ve verimlilik arayan geliştiriciler için idealdir. + +### [Güncellenmiş PDF'yi Kaydedin – Aspose.Pdf ile PDF Kaynaklarını Düzenleyin](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Aspose.Pdf kullanarak PDF kaynaklarını düzenledikten sonra güncellenmiş PDF dosyasını nasıl kaydedeceğinizi öğrenin. ## Ek Kaynaklar diff --git a/pdf/turkish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/turkish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..d34913b0cf --- /dev/null +++ b/pdf/turkish/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,264 @@ +--- +category: general +date: 2026-07-23 +description: Aspose.Pdf kullanarak C#'de güncellenmiş PDF'yi kaydedin. ExtGState gibi + PDF kaynaklarını nasıl düzenleyeceğinizi öğrenin ve sadece birkaç adımda yeni bir + dosya oluşturun. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: tr +lastmod: 2026-07-23 +og_description: Aspose.Pdf ile C#'ta güncellenmiş PDF'yi kaydedin. Bu öğreticide PDF + kaynaklarını nasıl düzenleyeceğiniz, bir grafik durumu ekleyeceğiniz ve yeni bir + dosya oluşturacağınız gösterilmektedir. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Güncellenmiş PDF'yi Kaydet – Aspose.Pdf ile PDF Kaynaklarını Düzenle (C# + Rehberi) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Güncellenmiş PDF'yi Kaydet – Aspose.Pdf ile PDF Kaynaklarını Düzenle +url: /tr/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Güncellenmiş PDF'yi Kaydet – Aspose.Pdf ile PDF Kaynaklarını Düzenle + +Hiç **güncellenmiş PDF'yi kaydetmek** istediğinizde düşük seviyeli nesnelerini değiştirmenin nasıl yapılacağını merak ettiniz mi? Belki opaklığı, karışım modlarını veya diğer grafik parametrelerini tüm belgeyi yeniden oluşturmadan değiştirmek istiyorsunuz. Kısacası, **PDF kaynaklarını** doğrudan düzenlemek istiyorsunuz. Bu rehber, Aspose.Pdf for .NET kullanarak tam olarak bunu nasıl yapacağınızı adım adım gösteriyor. + +Bir PDF dosyasını yükleyerek, kaynak sözlüğüne dalarak yeni bir grafik durumu ekleyecek ve sonunda **güncellenmiş PDF'yi kaydedeceğiz**. Sonunda, herhangi bir projeye ekleyebileceğiniz çalışan bir C# kod parçacığına sahip olacaksınız—gizli bağımlılıklar yok, sadece saf kod. + +## Öğrenecekleriniz + +- Aspose.Pdf ile bir PDF'i nasıl açıp ilk sayfanın kaynak sözlüğünü bulacağınızı. +- `ExtGState` sözlüğü gibi **PDF kaynaklarını** nasıl düzenleyeceğinizi. +- Çizgi/doldurma opaklığını ve karışım modunu kontrol eden özel bir grafik durumu (`GS0`) oluşturup eklemeyi. +- Tüm orijinal içeriği koruyarak **güncellenmiş PDF'yi** yeni bir dosyaya nasıl kaydedeceğinizi. + +**Önkoşullar**: .NET 6+ (veya .NET Framework 4.6+), bir lisans veya değerlendirme kopyası Aspose.Pdf ve C# hakkında temel bir aşinalık. Eğer sözlük seviyesinde hiç PDF ile çalışmadıysanız endişelenmeyin—bu öğretici her çağrının “nedenini” açıklıyor. + +--- + +![Diagram of PDF resource editing](image.png){.align-center alt="PDF kaynaklarını nasıl düzenleyeceğinizi ve ardından güncellenmiş PDF'yi nasıl kaydedeceğinizi gösteren diyagram"} + +## Güncellenmiş PDF'yi Kaydet – Tam İş Akışı Genel Bakışı + +Kod yazmaya geçmeden önce yüksek seviyeli akışı özetleyelim: + +1. **Load** (Yükle) kaynak PDF'i. +2. **Grab** (Al) ilk sayfayı ve onun `Resources` sözlüğünü. +3. **Navigate** (Gez) grafik durumlarının bulunduğu `ExtGState` alt‑sözlüğüne. +4. **Create** (Oluştur) özel grafik durumumuzu tanımlayan yeni bir `CosPdfDictionary`. +5. **Insert** (Ekle) bu sözlüğü `ExtGState` içine benzersiz bir anahtar (`GS0`) ile. +6. **Save** (Kaydet) değiştirilmiş belgeyi yeni bir dosya olarak. + +Hepsi bu—altı küçük adım, her biri birkaç C# satırı içinde kapsüllenmiş. Hazır mısınız? Hadi başlayalım. + +## Adım 1: PDF Belgesini Yükle + +Bir dosyayı açmak en basit kısımdır. Aspose.Pdf’in `Document` sınıfı bir yol ya da akış alır, böylece mevcut herhangi bir PDF’e işaret edebilirsiniz. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Why a `using` block?** +> Dosya tanıtıcısının işimiz bittiğinde hemen serbest bırakılmasını sağlar, böylece **güncellenmiş PDF'yi kaydetmeye** çalıştığınızda kilit sorunları önlenir. + +## Adım 2: PDF Kaynaklarını Düzenle – ExtGState Sözlüğüne Erişim + +Bir PDF'teki her sayfanın, yazı tipleri, görseller ve grafik durumlarını gruplayan bir *resource dictionary* (kaynak sözlüğü) vardır. Opaklık ya da karışım modunu değiştirmek için `ExtGState` girdisine ihtiyacımız var. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Pro tip:** Tüm PDF'ler varsayılan olarak bir `ExtGState` girdisi içermez. Yukarıdaki koşullu blok, bir `KeyNotFoundException` fırlatmamızı engeller ve **PDF kaynaklarını** güvenli bir şekilde düzenlememize izin verir. + +## Adım 3: Yeni Bir Grafik Durumu Sözlüğü Oluştur + +Bir grafik durumu (`GS`) temelde, PDF renderlayıcısının çizimden önce başvurduğu anahtar‑değer çiftlerinden oluşur. Burada çizgi opaklığı (`CA`), doldurma opaklığı (`ca`) ve karışım modu (`BM`) tanımlayacağız. + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Why these keys?** +> - `CA`, **stroke** (çizgi) opaklığını kontrol eder, çizgi ve kenarlara etki eder. +> - `ca`, **fill** (doldurma) opaklığını kontrol eder, şekil ve metin doldurmalarını etkiler. +> - `BM`, bir karışım modu seçer; “Normal” en yaygın olandır, ancak “Multiply” gibi yaratıcı etkiler için alternatifler de vardır. + +## Adım 4: Yeni Grafik Durumunu ExtGState'e Ekle + +Artık hazır bir sözlüğümüz olduğuna göre, onu yeni bir ad (`GS0`) altında basitçe ekliyoruz. İsim, sayfanın `ExtGState` koleksiyonunda benzersiz olmalıdır. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Daha sonra bu durumu içerik akışlarından referanslamanız gerekirse, PDF operatörlerinde `/GS0` kullanırsınız (ör. `gs`). Bu öğretici için sadece eklemek, **PDF kaynaklarını düzenleme**yi göstermek açısından yeterlidir. + +## Adım 5: Doğrulama (İsteğe Bağlı) ve Güncellenmiş PDF'yi Kaydet + +Bu noktada PDF’in iç yapısı değişti, ancak görsel çıktı `GS0`'ı gerçekten referans alana kadar farklı görünmez. Yine de **güncellenmiş PDF'yi** kaydedebilir ve nesne ağacını bir PDF görüntüleyici ya da `pdfcpu` gibi bir araçla inceleyebiliriz. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **What to expect:** +> - `output.pdf`, `input.pdf`'nin bayt‑bayt kopyası artı yeni `ExtGState` girdisi olacaktır. +> - Dosyayı bir metin düzenleyicide (veya PDF inceleme aracında) açtığınızda şu şekilde bir nesne göreceksiniz: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> `ExtGState` sözlüğü altında, anahtar `/GS0` olarak. + +Etkisini görmek isterseniz, yeni grafik durumunu kullanan basit bir içerik akışı ekleyin: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Opsiyonel kod parçacığını çalıştırdığınızda %50 şeffaf bir dikdörtgen elde edeceksiniz; bu da grafik durumunun beklendiği gibi çalıştığını doğrular. + +--- + +## Yaygın Sorular & Kenar Durumları + +**S: PDF zaten bir `GS0` girdisine sahipse ne olur?** +C: `Add` metodu mevcut anahtarı üzerine yazar. Çakışmaları önlemek için benzersiz bir ad üretin (ör. `GS1`, `GS_custom`) ya da önce `extGState.ContainsKey("GS0")` kontrol edin. + +**S: Yazı tipleri ya da XObject'ler gibi diğer kaynak türlerini düzenleyebilir miyim?** +C: Kesinlikle. `DictionaryEditor`, herhangi bir üst‑seviye kaynak anahtarı (`Font`, `XObject`, `ColorSpace` vb.) için çalışır. Sadece `"ExtGState"` yerine istediğiniz sözlük adını koyun. + +**S: Bu yöntem şifreli PDF'lerde çalışır mı?** +C: PDF şifre korumalıysa, `Document` nesnesini oluştururken şifreyi sağlamalısınız: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Şifre çözüldükten sonra kaynakları aynı şekilde düzenleyebilirsiniz. + +**S: Dosya boyutu belirgin şekilde artar mı?** +C: Böyle küçük bir sözlük eklemek genellikle sadece birkaç yüz bayt ekler. Büyük XObject'ler ya da gömülü görseller eklerseniz, daha büyük bir artış bekleyin. + +## Sonuç + +Artık Aspose.Pdf ile **güncellenmiş PDF** dosyalarını doğrudan **PDF kaynaklarını düzenleyerek** nasıl kaydedeceğinizi biliyorsunuz. Süreç, belgeyi yüklemek, `ExtGState` sözlüğünü bulmak, yeni bir grafik durumu oluşturmak, eklemek ve son olarak sonucu kalıcı hâle getirmekten ibarettir. Bundan sonra diğer kaynak türleriyle deney yapabilir, birden çok grafik durumu zinciri oluşturabilir ya da toplu değişiklikler için yeniden kullanılabilir bir yardımcı metot geliştirebilirsiniz. + +Sonraki adımlar? Karışım modunu `"Multiply"` ya da `"Screen"` olarak değiştirin ve üst üste binen nesnelerin nasıl davrandığını görün. Ya da `Font` sözlüğünü düzenleyerek anında özel yazı tipleri gömün. PDF spesifikasyonu zengindir ve Aspose.Pdf size + +## Sonra Ne Öğrenmelisiniz? + +Aşağıdaki öğreticiler, bu kılavuzda gösterilen tekniklere dayanan ve yakından ilgili konuları kapsar. Her kaynak, adım adım açıklamalarla tam çalışan kod örnekleri içerir; böylece ek API özelliklerini ustalaşabilir ve kendi projelerinizde alternatif uygulama yaklaşımlarını keşfedebilirsiniz. + +- [Aspose Pdf Net Aç Değiştir Kaydet Pdf'ler](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [Aspose.PDF for .NET kullanarak Belirli PDF Sayfalarını Çıkar ve Kaydet - Kapsamlı Rehber](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [Aspose.PDF for .NET ile PDF'lere Dosya Eki Açıklamaları Ekleme | Adım Adım Kılavuz](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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/pdf/vietnamese/net/document-manipulation/_index.md b/pdf/vietnamese/net/document-manipulation/_index.md index 7ddc3e1680..6bf5cd3cbc 100644 --- a/pdf/vietnamese/net/document-manipulation/_index.md +++ b/pdf/vietnamese/net/document-manipulation/_index.md @@ -80,7 +80,7 @@ Tìm hiểu cách tối ưu hóa tệp PDF bằng cách loại bỏ các đối ### [Xử lý trang PDF hiệu quả với Aspose.PDF cho .NET: Hướng dẫn dành cho nhà phát triển](./manipulate-pdf-pages-aspose-dot-net/) Học cách thao tác hiệu quả các trang PDF bằng Aspose.PDF cho .NET. Hướng dẫn này bao gồm xoay, thu phóng và thiết lập gốc mà không cần Adobe Acrobat. -### [Kết hợp hiệu quả các trang PDF bằng Aspose.PDF cho .NET: Hướng dẫn phương pháp N-Up](./combine-pdf-pages-aspose-net-nup-method/) +### [Kết hợp hiệu quả các trang PDF bằng Aspose.PDF cho .NET: Hướng pháp N-Up](./combine-pdf-pages-aspose-net-nup-method/) Tìm hiểu cách kết hợp các trang PDF hiệu quả bằng phương pháp N-Up với Aspose.PDF cho .NET. Hướng dẫn này bao gồm thiết lập, triển khai và ứng dụng thực tế. ### [Xóa trang khỏi PDF hiệu quả bằng Aspose.PDF cho .NET](./delete-pages-pdf-aspose-dotnet/) @@ -195,7 +195,7 @@ Tìm hiểu cách loại bỏ các hành động mở không mong muốn khỏi Tìm hiểu cách chia các trang PDF thành từng tệp riêng lẻ một cách hiệu quả bằng Aspose.PDF cho .NET với hướng dẫn toàn diện này. Nâng cao kỹ năng thao tác tài liệu của bạn ngay hôm nay. ### [Cách chia trang PDF bằng Aspose.PDF cho .NET: Hướng dẫn toàn diện](./split-pdf-pages-aspose-pdf-net/) -Tìm hiểu cách tách các trang cụ thể từ PDF thành các tệp riêng biệt bằng Aspose.PDF cho .NET. Hướng dẫn này bao gồm cách xử lý và thiết lập luồng. +Tìm hiểu cách tách các trang PDF thành các tệp riêng biệt bằng Aspose.PDF cho .NET. Hướng dẫn này bao gồm cách xử lý và thiết lập luồng. ### [Cách chia trang PDF bằng Aspose.PDF cho .NET: Hướng dẫn từng bước](./split-pdf-pages-aspose-pdf-net-guide/) Tìm hiểu cách chia trang PDF bằng Aspose.PDF cho .NET với hướng dẫn toàn diện này. Làm chủ thao tác tài liệu trong C# và tối ưu hóa quy trình làm việc của bạn. @@ -311,6 +311,9 @@ Tìm hiểu cách chia nhỏ các tệp PDF nhiều trang và tạo tệp PDF m ### [Hướng dẫn tối ưu về thao tác PDF với Aspose.PDF .NET: Tải, lưu và thay thế văn bản hiệu quả](./master-pdf-manipulation-aspose-pdf-net/) Tìm hiểu cách làm chủ thao tác PDF bằng Aspose.PDF cho .NET. Hướng dẫn này bao gồm việc tải, lưu và thay thế văn bản trong PDF, lý tưởng cho các nhà phát triển tìm kiếm hiệu quả. +### [Lưu PDF Đã Cập Nhật – Chỉnh sửa Tài Nguyên PDF với Aspose.Pdf](./save-updated-pdf-edit-pdf-resources-with-aspose-pdf/) +Hướng dẫn cách lưu tài liệu PDF đã chỉnh sửa và cập nhật tài nguyên PDF bằng Aspose.Pdf trong .NET. + ## Tài nguyên bổ sung - [Aspose.PDF cho Tài liệu Net](https://docs.aspose.com/pdf/net/) diff --git a/pdf/vietnamese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md b/pdf/vietnamese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md new file mode 100644 index 0000000000..59b63ddd1b --- /dev/null +++ b/pdf/vietnamese/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/_index.md @@ -0,0 +1,260 @@ +--- +category: general +date: 2026-07-23 +description: Lưu PDF đã cập nhật bằng Aspose.Pdf trong C#. Tìm hiểu cách chỉnh sửa + các tài nguyên PDF như ExtGState và tạo một tệp mới chỉ trong vài bước. +draft: false +images: +- PLACEHOLDER_URL/og-image.png +keywords: +- save updated pdf +- edit pdf resources +- Aspose.Pdf C# +- PDF graphics state +- modify PDF dictionary +language: vi +lastmod: 2026-07-23 +og_description: Lưu PDF đã cập nhật bằng Aspose.Pdf trong C#. Hướng dẫn này cho thấy + cách chỉnh sửa tài nguyên PDF, thêm trạng thái đồ họa và xuất ra một tệp mới. +og_image_alt: Screenshot illustrating how to save updated PDF after editing PDF resources +og_title: Lưu PDF Đã Cập Nhật – Chỉnh sửa Tài Nguyên PDF với Aspose.Pdf (Hướng dẫn + C#) +schemas: +- author: Aspose + dateModified: '2026-07-23' + description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + headline: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + type: TechArticle +- description: Save updated PDF using Aspose.Pdf in C#. Learn how to edit PDF resources + like ExtGState and produce a new file in just a few steps. + name: Save Updated PDF – Edit PDF Resources with Aspose.Pdf + steps: + - name: '**Load** the source PDF.' + text: '**Load** the source PDF.' + - name: '**Grab** the first page and its `Resources` dictionary.' + text: '**Grab** the first page and its `Resources` dictionary.' + - name: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + text: '**Navigate** to the `ExtGState` sub‑dictionary where graphics states live.' + - name: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + text: '**Create** a new `CosPdfDictionary` describing our custom graphics state.' + - name: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + text: '**Insert** that dictionary back into `ExtGState` under a unique key (`GS0`).' + - name: '**Save** the modified document as a new file.' + text: '**Save** the modified document as a new file.' + type: HowTo +- questions: + - answer: The `Add` method will overwrite the existing key. To avoid collisions, + generate a unique name (e.g., `GS1`, `GS_custom`) or check `extGState.ContainsKey("GS0")` + first. + question: What if the PDF already has a `GS0` entry? + - answer: Absolutely. The `DictionaryEditor` works for any top‑level resource key + (`Font`, `XObject`, `ColorSpace`, etc.). Just replace `"ExtGState"` with the + desired dictionary name. + question: Can I edit other resource types, like fonts or XObjects? + - answer: 'If the PDF is password‑protected, you must supply the password when constructing + the `Document` object: ```csharp var doc = new Document("secure.pdf", new LoadOptions + { Password = "mySecret" }); ``` After decryption you can edit resources exactly + the same way.' + question: Does this approach work with encrypted PDFs? + - answer: 'Adding a small dictionary like this typically adds only a few hundred + bytes. If you add large XObjects or embed images, expect a bigger jump. --- + ## Conclusion You now know how to **save updated PDF** files after directly + **edit PDF resources** with Aspose.Pdf. The process boils down to loading the ' + question: Will the file size increase noticeably? + type: FAQPage +tags: +- PDF +- C# +- Aspose.Pdf +title: Lưu PDF đã cập nhật – Chỉnh sửa tài nguyên PDF với Aspose.Pdf +url: /vi/net/document-manipulation/save-updated-pdf-edit-pdf-resources-with-aspose-pdf/ +--- + +{{< blocks/products/pf/main-wrap-class >}} +{{< blocks/products/pf/main-container >}} +{{< blocks/products/pf/tutorial-page-section >}} + +# Lưu PDF Đã Cập Nhật – Chỉnh Sửa Tài Nguyên PDF với Aspose.Pdf + +Bạn đã bao giờ tự hỏi làm thế nào để **lưu PDF đã cập nhật** sau khi chỉnh sửa các đối tượng cấp thấp? Có thể bạn cần thay đổi độ trong suốt, chế độ hòa trộn, hoặc các tham số đồ họa khác mà không cần tạo lại toàn bộ tài liệu. Nói ngắn gọn, bạn muốn **chỉnh sửa tài nguyên PDF** trực tiếp. Hướng dẫn này sẽ chỉ cho bạn cách thực hiện, sử dụng Aspose.Pdf cho .NET. + +Chúng ta sẽ bắt đầu bằng việc tải một PDF hiện có, khám phá từ điển tài nguyên của nó, chèn một trạng thái đồ họa mới, và cuối cùng **lưu PDF đã cập nhật**. Khi kết thúc, bạn sẽ có một đoạn mã C# hoạt động mà có thể đưa vào bất kỳ dự án nào—không có phụ thuộc bí ẩn, chỉ là mã thuần. + +## Những Điều Bạn Sẽ Học + +- Cách mở một PDF bằng Aspose.Pdf và xác định từ điển tài nguyên của trang đầu tiên. +- Các bước để **chỉnh sửa tài nguyên PDF** như từ điển `ExtGState`. +- Tạo và chèn một trạng thái đồ họa tùy chỉnh (`GS0`) điều khiển độ trong suốt nét vẽ/đổ màu và chế độ hòa trộn. +- Cách **lưu PDF đã cập nhật** vào một tệp mới, giữ nguyên toàn bộ nội dung gốc. + +**Yêu cầu trước**: .NET 6+ (hoặc .NET Framework 4.6+), một giấy phép hoặc bản dùng thử của Aspose.Pdf, và kiến thức cơ bản về C#. Nếu bạn chưa từng thao tác với PDF ở mức từ điển, đừng lo—hướng dẫn này sẽ giải thích “tại sao” cho mỗi lời gọi. + +--- + +![Sơ đồ chỉnh sửa tài nguyên PDF](image.png){.align-center alt="Sơ đồ cho thấy cách chỉnh sửa tài nguyên PDF và sau đó lưu PDF đã cập nhật"} + +## Lưu PDF Đã Cập Nhật – Tổng Quan Quy Trình Toàn Bộ + +Trước khi chúng ta chuyển sang mã, hãy phác thảo quy trình cấp cao: + +1. **Load** PDF nguồn. +2. **Grab** trang đầu tiên và từ điển `Resources` của nó. +3. **Navigate** tới sub‑dictionary `ExtGState` nơi các trạng thái đồ họa được lưu. +4. **Create** một `CosPdfDictionary` mới mô tả trạng thái đồ họa tùy chỉnh của chúng ta. +5. **Insert** từ điển đó trở lại `ExtGState` dưới một khóa duy nhất (`GS0`). +6. **Save** tài liệu đã sửa thành một tệp mới. + +Chỉ vậy thôi—sáu bước nhỏ, mỗi bước được gói gọn trong vài dòng C#. Sẵn sàng? Hãy bắt đầu. + +## Bước 1: Tải Tài Liệu PDF + +Mở một tệp là phần đơn giản nhất. Lớp `Document` của Aspose.Pdf nhận một đường dẫn hoặc một luồng, vì vậy bạn có thể chỉ định nó tới bất kỳ PDF nào đã tồn tại. + +```csharp +using Aspose.Pdf; +using Aspose.Pdf.Collections; +using Aspose.Pdf.Text; +using Aspose.Pdf.Operators; +using Aspose.Pdf.Operators.GfxState; +using Aspose.Pdf.Operators.Filters; +using Aspose.Pdf.COS; +using System.Collections.Generic; + +// Step 1 – Load the PDF you want to modify +using (var doc = new Document("YOUR_DIRECTORY/input.pdf")) +{ + // The rest of the workflow lives inside this using block. +} +``` + +> **Tại sao lại dùng khối `using`?** +> Nó đảm bảo tay cầm tệp được giải phóng ngay khi chúng ta hoàn thành, ngăn ngừa các vấn đề khóa khi sau này chúng ta cố **lưu PDF đã cập nhật**. + +## Bước 2: Chỉnh Sửa Tài Nguyên PDF – Truy Cập Từ Điển ExtGState + +Mỗi trang trong PDF có một *từ điển tài nguyên* nhóm các phông chữ, hình ảnh và trạng thái đồ họa. Để thay đổi độ trong suốt hoặc chế độ hòa trộn, chúng ta cần mục `ExtGState`. + +```csharp +// Step 2 – Retrieve the first page and its Resources dictionary +var page = doc.Pages[1]; // 1‑based index for pages +var resourcesEditor = new DictionaryEditor(page.Resources); + +// Step 2.1 – Grab the ExtGState dictionary (creates it if missing) +CosPdfDictionary extGState; +if (resourcesEditor.ContainsKey("ExtGState")) +{ + extGState = resourcesEditor["ExtGState"].ToCosPdfDictionary(); +} +else +{ + // If the PDF didn't have any graphics states yet, we create the container. + extGState = CosPdfDictionary.CreateEmptyDictionary(doc); + resourcesEditor.Add("ExtGState", extGState); +} +``` + +> **Mẹo chuyên nghiệp:** Không phải tất cả PDF đều có mục `ExtGState` theo mặc định. Khối điều kiện ở trên đảm bảo chúng ta không gặp `KeyNotFoundException` và vẫn cho phép chúng ta **chỉnh sửa tài nguyên PDF** một cách an toàn. + +## Bước 3: Tạo Một Từ Điển Trạng Thái Đồ Họa Mới + +Một trạng thái đồ họa (`GS`) thực chất là một tập hợp các cặp khóa‑giá trị mà bộ render PDF tham khảo trước khi vẽ. Ở đây chúng ta sẽ định nghĩa độ trong suốt nét vẽ (`CA`), độ trong suốt đổ màu (`ca`), và chế độ hòa trộn (`BM`). + +```csharp +// Step 3 – Build a new graphics state dictionary (GS0) +var newGraphicsState = CosPdfDictionary.CreateEmptyDictionary(doc); +var parameters = new[] +{ + // Stroke opacity (1 = fully opaque) + new KeyValuePair("CA", new CosPdfNumber(1)), + // Fill opacity (0.5 = 50 % transparent) + new KeyValuePair("ca", new CosPdfNumber(0.5)), + // Blend mode (Normal is the default, but we set it explicitly) + new KeyValuePair("BM", new CosPdfName("Normal")) +}; + +foreach (var param in parameters) + newGraphicsState.Add(param); +``` + +> **Tại sao lại dùng các khóa này?** +> - `CA` điều khiển độ trong suốt **nét vẽ**, ảnh hưởng đến các đường và viền. +> - `ca` điều khiển độ trong suốt **đổ màu**, ảnh hưởng đến các hình dạng và phần tô văn bản. +> - `BM` chọn chế độ hòa trộn; “Normal” là phổ biến nhất nhưng các lựa chọn như “Multiply” cũng tồn tại cho các hiệu ứng sáng tạo. + +## Bước 4: Chèn Trạng Thái Đồ Họa Mới vào ExtGState + +Bây giờ chúng ta đã có một từ điển sẵn sàng, chúng ta chỉ cần thêm nó dưới một tên mới (`GS0`). Tên này phải là duy nhất trong bộ sưu tập `ExtGState` của trang. + +```csharp +// Step 4 – Add the new graphics state to the ExtGState dictionary +extGState.Add("GS0", newGraphicsState); +``` + +Nếu sau này bạn cần tham chiếu trạng thái này từ các luồng nội dung, bạn sẽ dùng `/GS0` trong các toán tử PDF như `gs`. Đối với mục đích của hướng dẫn này, chỉ việc thêm nó là đủ để minh họa **việc chỉnh sửa tài nguyên PDF**. + +## Bước 5: Kiểm Tra (Tùy Chọn) và Lưu PDF Đã Cập Nhật + +Ở thời điểm này cấu trúc nội bộ của PDF đã thay đổi, nhưng kết quả hiển thị sẽ không khác cho đến khi bạn thực sự tham chiếu `GS0`. Tuy nhiên, chúng ta vẫn có thể **lưu PDF đã cập nhật** và kiểm tra cây đối tượng bằng một trình xem PDF hoặc công cụ như `pdfcpu`. + +```csharp +// Step 5 – Persist the changes to a new file +doc.Save("YOUR_DIRECTORY/output.pdf"); +``` + +> **Điều gì sẽ xảy ra:** +> - `output.pdf` sẽ là bản sao byte‑for‑byte của `input.pdf` cộng với mục `ExtGState` mới. +> - Mở tệp trong trình soạn thảo văn bản (hoặc sử dụng công cụ kiểm tra PDF) sẽ hiển thị một đối tượng mới như: +> ``` +> << /CA 1 /ca 0.5 /BM /Normal >> +> ``` +> dưới từ điển `ExtGState`, với khóa là `/GS0`. + +Nếu bạn muốn thấy hiệu ứng hoạt động, hãy thêm một luồng nội dung đơn giản sử dụng trạng thái đồ họa mới: + +```csharp +// OPTIONAL: Draw a semi‑transparent rectangle using GS0 +var canvas = new Canvas(page, page.PageInfo); +canvas.SetGraphicsState(newGraphicsState); // applies GS0 +canvas.Rectangle(100, 500, 200, 100); +canvas.FillAndStroke(); +``` + +Chạy đoạn mã tùy chọn sẽ tạo ra một hình chữ nhật trong suốt 50 %, xác nhận rằng trạng thái đồ họa hoạt động như mong đợi. + +## Các Câu Hỏi Thường Gặp & Trường Hợp Cạnh + +**Hỏi: Nếu PDF đã có mục `GS0` thì sao?** +**Đáp:** Phương thức `Add` sẽ ghi đè lên khóa hiện có. Để tránh xung đột, hãy tạo một tên duy nhất (ví dụ, `GS1`, `GS_custom`) hoặc kiểm tra `extGState.ContainsKey("GS0")` trước. + +**Hỏi: Tôi có thể chỉnh sửa các loại tài nguyên khác, như phông chữ hoặc XObjects không?** +**Đáp:** Chắc chắn. `DictionaryEditor` hoạt động cho bất kỳ khóa tài nguyên cấp cao nào (`Font`, `XObject`, `ColorSpace`, v.v.). Chỉ cần thay `"ExtGState"` bằng tên từ điển mong muốn. + +**Hỏi: Cách này có hoạt động với PDF được mã hoá không?** +**Đáp:** Nếu PDF được bảo vệ bằng mật khẩu, bạn phải cung cấp mật khẩu khi khởi tạo đối tượng `Document`: +```csharp +var doc = new Document("secure.pdf", new LoadOptions { Password = "mySecret" }); +``` +Sau khi giải mã, bạn có thể chỉnh sửa tài nguyên theo cùng cách. + +**Hỏi: Kích thước tệp có tăng đáng kể không?** +**Đáp:** Thêm một từ điển nhỏ như thế này thường chỉ tăng vài trăm byte. Nếu bạn thêm XObjects lớn hoặc nhúng hình ảnh, kích thước sẽ tăng đáng kể hơn. + +## Kết Luận + +Bây giờ bạn đã biết cách **lưu các tệp PDF đã cập nhật** sau khi **chỉnh sửa tài nguyên PDF** trực tiếp bằng Aspose.Pdf. Quy trình chỉ gồm tải tài liệu, tìm từ điển `ExtGState`, tạo một trạng thái đồ họa mới, chèn nó, và cuối cùng lưu lại kết quả. Từ đây bạn có thể thử nghiệm với các loại tài nguyên khác, xâu chuỗi nhiều trạng thái đồ họa, hoặc xây dựng một phương thức trợ giúp có thể tái sử dụng cho việc chỉnh sửa hàng loạt. + +Bước tiếp theo? Hãy thử đổi chế độ hòa trộn thành `"Multiply"` hoặc `"Screen"` và xem các đối tượng chồng lên nhau hoạt động như thế nào. Hoặc khám phá việc chỉnh sửa từ điển `Font` để nhúng phông chữ tùy chỉnh ngay lập tức. Đặc tả PDF rất phong phú, và Aspose.Pdf cung cấp cho bạn + +## 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 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 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. + +- [Aspose Pdf Net Mở, Sửa, Lưu PDF](/pdf/english/net/document-manipulation/aspose-pdf-net-open-modify-save-pdfs/) +- [Cách Trích Xuất & Lưu Các Trang PDF Cụ Thể Bằng Aspose.PDF cho .NET - Hướng Dẫn Toàn Diện](/pdf/english/net/document-manipulation/extract-save-pdf-pages-aspose-net/) +- [Cách Thêm Ghi Chú Đính Kèm Tệp trong PDF Bằng Aspose.PDF cho .NET | Hướng Dẫn Từng Bước](/pdf/english/net/forms-annotations/create-file-attachment-annotations-aspose-pdf-net/) + +{{< /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