تحويل HTML إلى PDF في .NET

نظرة عامة

تشرح هذه المقالة كيفية تحويل HTML إلى PDF باستخدام C#. تغطي المواضيع التالية.

الكود التالي يعمل أيضًا مع مكتبة Aspose.PDF.Drawing.

Aspose.PDF for .NET هو واجهة برمجة تطبيقات لمعالجة ملفات PDF تتيح لك تحويل أي مستند HTML موجود إلى PDF بسهولة. يمكن تخصيص عملية تحويل HTML إلى PDF بمرونة.

تحويل HTML إلى PDF

يعرض مثال كود C# التالي كيفية تحويل مستند HTML إلى PDF.

تحويل HTML إلى PDF

  1. إنشاء كائن من الفئة HtmlLoadOptions.
  2. تهيئة كائن Document.
  3. حفظ مستند PDF الناتج عن طريق استدعاء طريقة Document.Save().
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertHTMLtoPDF()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Load the HTML file into a document using HtmlLoadOptions
    var options = new Aspose.Pdf.HtmlLoadOptions();

    // Open HTML document
    using (var document = new Aspose.Pdf.Document(dataDir + "test.html", options))
    {
        // Save PDF document
        document.Save(dataDir + "ConvertHTMLtoPDF_out.pdf");
    }
}

التحويل المتقدم من HTML إلى PDF

يحتوي محرك تحويل HTML على عدة خيارات تسمح لنا بالتحكم في عملية التحويل.

دعم استعلامات الوسائط

استعلامات الوسائط تقنية شائعة لتقديم ورقة أنماط مخصصة لأجهزة مختلفة. يمكننا تعيين نوع الجهاز باستخدام خاصية HtmlMediaType.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertHTMLtoPDFAdvancedMediaType()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Load the HTML file into a document using HtmlLoadOptions with Print media type
    var options = new HtmlLoadOptions
    {
        // Set Print or Screen mode
        HtmlMediaType = Aspose.Pdf.HtmlMediaType.Print
    };

    // Open HTML document
    using (var document = new Aspose.Pdf.Document(dataDir + "test.html", options))
    {
        // Save PDF document
        document.Save(dataDir + "ConvertHTMLtoPDFAdvancedMediaType_out.pdf");
    }
}

تمكين (تعطيل) تضمين الخطوط

غالبًا ما تستخدم صفحات HTML خطوطًا (مثل الخطوط من مجلد محلي، Google Fonts، إلخ). يمكننا أيضًا التحكم في تضمين الخطوط في المستند باستخدام خاصية IsEmbedFonts.

 // For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
 private static void ConvertHTMLtoPDFAdvancedEmbedFonts()
 {
     // The path to the documents directory
     var dataDir = RunExamples.GetDataDir_AsposePdf();

     // Load the HTML file into a document using HtmlLoadOptions with the font embedding option set
     var options = new Aspose.Pdf.HtmlLoadOptions
     {
         // Disable font embedding
         IsEmbedFonts = false
     };

     // Open HTML document
     using (var document = new Aspose.Pdf.Document(dataDir + "test_fonts.html", options))
     {
         // Save PDF document
         document.Save(dataDir + "ConvertHTMLtoPDFAdvanced_EmbedFonts_out.pdf");
     }
 }

إدارة تحميل الموارد الخارجية

يوفر محرك التحويل آلية تسمح لك بالتحكم في تحميل موارد معينة مرتبطة بمستند HTML.
تحتوي الفئة HtmlLoadOptions على الخاصية CustomLoaderOfExternalResources التي يمكن من خلالها تعريف سلوك محمل الموارد.
افترض أننا نحتاج إلى استبدال جميع صور PNG بصورة واحدة test.jpg واستبدال عناوين URL الخارجية بأخرى داخلية للموارد الأخرى.
للقيام بذلك يمكننا تعريف محمل مخصص SamePictureLoader وتوجيه CustomLoaderOfExternalResources إلى هذا الاسم.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertHTMLtoPDFAdvanced_DummyImage()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Load the HTML file into a document with a custom resource loader for external images
    var options = new Aspose.Pdf.HtmlLoadOptions
    {
        CustomLoaderOfExternalResources = SamePictureLoader
    };

    // Open HTML document
    using (var document = new Aspose.Pdf.Document(dataDir + "test.html", options))
    {
        // Save PDF document
        document.Save(dataDir + "html_test.pdf");
    }
}

private static Aspose.Pdf.LoadOptions.ResourceLoadingResult SamePictureLoader(string resourceURI)
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();
    Aspose.Pdf.LoadOptions.ResourceLoadingResult result;

    if (resourceURI.EndsWith(".png"))
    {
        byte[] resultBytes = File.ReadAllBytes(dataDir + "test.jpg");
        result = new Aspose.Pdf.LoadOptions.ResourceLoadingResult(resultBytes)
        {
            // Set MIME Type
            MIMETypeIfKnown = "image/jpeg"
        };
    }
    else
    {
        result = new Aspose.Pdf.LoadOptions.ResourceLoadingResult(GetContentFromUrl(resourceURI));
    }
    return result;
}

private static byte[] GetContentFromUrl(string url)
{
    var httpClient = new System.Net.Http.HttpClient();
    return httpClient.GetByteArrayAsync(url).GetAwaiter().GetResult();
}

عرض كل محتوى HTML في صفحة واحدة

توفر Aspose.PDF for .NET القدرة على عرض كل المحتوى في صفحة واحدة عند تحويل ملف HTML إلى صيغة PDF. على سبيل المثال، إذا كان لديك محتوى HTML حجمه أكبر من صفحة واحدة، يمكنك استخدام الخيار لعرض البيانات الناتجة في صفحة PDF واحدة. لتفعيل هذا الخيار، تم توسيع فئة HtmlLoadOptions بالعلامة IsRenderToSinglePage. يوضح المقتطف البرمجي أدناه كيفية استخدام هذه الميزة.

 // For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
 private static void ConvertHTMLtoPDFAdvancedSinglePageRendering()
 {
     // The path to the documents directory
     var dataDir = RunExamples.GetDataDir_AsposePdf();

     // Initialize HtmlLoadOptions
     var options = new Aspose.Pdf.HtmlLoadOptions
     {
         // Set Render to single page property
         IsRenderToSinglePage = true
     };

     // Open PDF document
     using (var document = new Aspose.Pdf.Document(dataDir + "HTMLToPDF.html", options))
     {
         // Save PDF document
         document.Save(dataDir + "RenderContentToSamePage_out.pdf");
     }
 }

عرض HTML مع بيانات SVG

توفر Aspose.PDF for .NET القدرة على تحويل صفحة HTML إلى مستند PDF. بما أن HTML يسمح بإضافة عناصر رسومية SVG كوسوم في الصفحة، فإن Aspose.PDF يدعم أيضًا تحويل هذه البيانات إلى ملف PDF الناتج. يوضح المقتطف البرمجي التالي كيفية تحويل ملفات HTML التي تحتوي على وسوم رسومية SVG إلى مستندات PDF ذات وسوم.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertHTMLtoPDFWithSVG()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Initialize HtmlLoadOptions
    var options = new Aspose.Pdf.HtmlLoadOptions(Path.GetDirectoryName(dataDir + "HTMLSVG.html"));

    // Initialize Document object
    using (var document = new Aspose.Pdf.Document(dataDir + "HTMLSVG.html", options))
    {
        // Save PDF document
        document.Save(dataDir + "RenderHTMLwithSVGData_out.pdf");
    }
}

إنشاء بنية منطقية من وسوم HTML

لتلبية متطلبات إمكانية الوصول، يجب أن يتضمن مستند PDF عناصر بنية منطقية تحدد ترتيب القراءة، وتوفر نصًا بديلًا لقارئات الشاشة لوصف الأجزاء التوضيحية من المستند، وتحدد تسلسل هرمي لمحتوياته.

العديد من مستندات HTML تحتوي بالفعل على هذا النوع من البنية المنطقية. يمكن لـ Aspose.PDF الحفاظ عليها ونقلها إلى PDF أثناء عملية التحويل من HTML إلى PDF.

قم بتعيين الخاصية HtmlLoadOptions.CreateLogicalStructure إلى true لتكرار بنية مستند HTML الأصلي باستخدام عناصر بنية PDF المنطقية.

تحويل صفحة ويب إلى PDF

تحويل صفحة ويب يختلف قليلاً عن تحويل مستند HTML محلي. لتحويل محتويات صفحة ويب إلى صيغة PDF، يمكننا أولاً جلب محتويات صفحة HTML باستخدام كائن HttpClient، إنشاء كائن Stream، تمرير المحتويات إلى كائن Document، ثم عرض الناتج بصيغة PDF.

عند تحويل صفحة ويب مستضافة على خادم إلى PDF:

تحويل صفحة ويب إلى PDF

  1. قراءة محتويات الصفحة باستخدام كائن HttpClient.
  2. إنشاء كائن HtmlLoadOptions وتعيين عنوان URL الأساسي.
  3. تهيئة كائن Document مع تمرير كائن الـ Stream.
  4. اختياريًا، تعيين حجم الصفحة و/أو الاتجاه.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertHTMLtoPDFAdvanced_WebPage()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    const string url = "https://en.wikipedia.org/wiki/Aspose_API";

    // Set page size A3 and Landscape orientation;   
    var options = new Aspose.Pdf.HtmlLoadOptions(url)
    {
        PageInfo =
        {
            Width = 842,
            Height = 1191,
            IsLandscape = true
        }
    };

    // Load the web page content as a stream and create a PDF document
    using (var document = new Aspose.Pdf.Document(GetContentFromUrlAsStream(url), options))
    {
        // Save PDF document
        document.Save(dataDir + "html_test.pdf");
    }
}

private static Stream GetContentFromUrlAsStream(string url, System.Net.ICredentials credentials = null)
{
    using (var handler = new System.Net.Http.HttpClientHandler { Credentials = credentials })
    using (var httpClient = new System.Net.Http.HttpClient(handler))
    {
        return httpClient.GetStreamAsync(url).GetAwaiter().GetResult();
    }
}

توفير بيانات الاعتماد لتحويل صفحة ويب إلى PDF

في بعض الأحيان نحتاج إلى تحويل ملفات HTML التي تتطلب مصادقة وصلاحيات وصول، بحيث لا يتمكن سوى المستخدمون المصرح لهم من جلب محتويات الصفحة. يشمل ذلك السيناريو الذي يتم فيه جلب بعض الموارد/البيانات المشار إليها داخل HTML من خادم خارجي يتطلب مصادقة. لتلبية هذا المتطلب، تمت إضافة الخاصية ExternalResourcesCredentials إلى فئة HtmlLoadOptions. يوضح المقتطف البرمجي التالي الخطوات لتمرير بيانات الاعتماد لطلب HTML وموارده المقابلة أثناء تحويل ملف HTML إلى PDF.

 // For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
 private static void ConvertHTMLtoPDFAdvancedAuthorized()
 {
     // The path to the documents directory
     var dataDir = RunExamples.GetDataDir_AsposePdf();

     const string url = "http://httpbin.org/basic-auth/user1/password1";
     var credentials = new System.Net.NetworkCredential("user1", "password1");

     var options = new Aspose.Pdf.HtmlLoadOptions(url)
     {
         ExternalResourcesCredentials = credentials
     };

     using (var document = new Aspose.Pdf.Document(GetContentFromUrlAsStream(url, credentials), options))
     {
         // Save PDF document
         document.Save(dataDir + "HtmlTest_out.pdf");
     }
 }

private static Stream GetContentFromUrlAsStream(string url, System.Net.ICredentials credentials = null)
{
    using (var handler = new System.Net.Http.HttpClientHandler { Credentials = credentials })
    using (var httpClient = new System.Net.Http.HttpClient(handler))
    {
        return httpClient.GetStreamAsync(url).GetAwaiter().GetResult();
    }
}

تحويل MHTML إلى PDF

MHTML، اختصارًا لـ MIME HTML، هو تنسيق أرشفة صفحات الويب يُستخدم لدمج الموارد التي عادةً ما تكون ممثلة بروابط خارجية (مثل الصور، الرسوم المتحركة Flash، تطبيقات Java، وملفات الصوت) مع كود HTML في ملف واحد. يتم ترميز محتوى ملف MHTML كما لو كان رسالة بريد إلكتروني HTML، باستخدام نوع MIME multipart/related. يمكن لـ Aspose.PDF for .NET تحويل ملفات HTML إلى صيغة PDF، ومع إصدار Aspose.PDF for .NET 9.0.0، قدمنا ميزة جديدة تتيح لك تحويل ملفات MHTML إلى صيغة PDF. يوضح المقتطف البرمجي التالي كيفية تحويل ملفات MHTML إلى صيغة PDF باستخدام C#:

تحويل MHTML إلى PDF

  1. إنشاء كائن من الفئة MhtLoadOptions.
  2. تهيئة كائن Document.
  3. حفظ مستند PDF الناتج عن طريق استدعاء طريقة Document.Save().
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertMHTtoPDF()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Initialize MhtLoadOptions with page setup
    var options = new Aspose.Pdf.MhtLoadOptions()
    {
        PageInfo = { Width = 842, Height = 1191, IsLandscape = true }
    };

    // Initialize Document object using the MHT file and options
    using (var document = new Aspose.Pdf.Document(dataDir + "fileformatinfo.mht", options))
    {
        // Save PDF document
        document.Save(dataDir + "MhtmlTest_out.pdf");
    }
}