حسین احمدی
بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

آموزش تبدیل HTML به PDF در سی شارپ

یکی از قابلیت هایی که وب سایت های محتوا محور در اختیار کاربر قرار میدن، تبدیل صفحات HTML به PDF هست. در این قسمت با ابزار wkhtmltopdf آشنا میشیم که می تونید این کار رو به راحتی انجام بدید. این ابزار در محیط Command قابل استفاده هست و البته می تونید از طریق زبان های مختلف برنامه نویسی، مثل زبان سی شارپ با این ابزار کار کنید. در ابتدا این ابزار رو از طریق این لینک دانلود و نصب کنید. بعد از نصب این ابزار، به صورت زیر می تونید یک صفحه HTML رو به PDF تبدیل کنید:

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
C:\Program Files\wkhtmltopdf\bin>wkhtmltopdf.exe https://tosinso.com/fa/latest d:\tosinso.pdf
Loading pages (1/6)
QFont::setPixelSize: Pixel size <= 0 (0)=========>           ] 81%
QFont::setPixelSize: Pixel size <= 0 (0)==========>          ] 83%
QFont::setPixelSize: Pixel size <= 0 (0)===============>     ] 90%
Counting pages (2/6)
QFont::setPixelSize: Pixel size <= 0 (0)=====================] Object 1 of 1
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
QFont::setPixelSize: Pixel size <= 0 (0)=====================] Page 18 of 18
Done

با اجرای دستور بالا فایل tosinso.pdf در درایو D ایجاد می شود. نکته که باید بهش دقت کنیم اینه که این ابزار امکان پارس کردن کدهای JavaScript رو نداره و به همین خاطر اگر بخشی از صفحه شما بوسیله کدهای JavaScript بارگذاری میشه، توی خروجی مشکل خواهید داشت. یک روش بهینه برای استفاده از این ابزار ایجاد یک نسخه چاپی ساده از صفحه و بعد تبدیل اون صفحه به HTML هست. برای مثال، فرض کنیم این لینک نسخه چاپی از یک مطلب در وب سایت نوسینسو هست:

https://programming.tosinso.com/fa/contents/printversion?id=29e059f4-6121-4f81-9872-d969a6269efc

داخل صفحه بالا هیچ کد جاوا اسکریپتی استفاده نشده و یک صفحه ساده هست و به همین دلیل بدون هیچ مشکلی به فرمت PDF تبدیل میشه. نکته قابل توجه این ابزار پشتیبانی از زبان های راست به چپ هست.

اما چطور می تونیم از این ابزار داخل زبان سی شارپ استفاده کنیم؟ یک متد خیلی ساده این کار رو برای ما انجام میده:

static void CreatePdfFromWeb(string address, string output)
{
    const string binPath = "C:\\Program Files\\wkhtmltopdf\\bin";

    var process = new Process();
    process.StartInfo = new ProcessStartInfo()
    {
        Arguments = $"\"{address}\" \"{output}\"",
        CreateNoWindow = true,
        FileName = Path.Combine(binPath, "wkhtmltopdf.exe"),
        UseShellExecute = false,
        RedirectStandardError = true,
        RedirectStandardOutput = true,
        WindowStyle = ProcessWindowStyle.Hidden
    };
    process.EnableRaisingEvents = true;
    process.OutputDataReceived += (sender, args) => { Console.WriteLine(args.Data); };
    var start = process.Start();
    process.WaitForExit();
}

و نحوه فراخوانی کد بالا:

CreatePdfFromWeb("https://programming.tosinso.com/fa/contents/printversion?id=29e059f4-6121-4f81-9872-d969a6269efc", "d:\\content.pdf");

تو کد بالا متدی تعریف کردیم که دو پارامتر میگیره، اولی آدرس صفحه وبی که قصد تبدیل اون به PDF رو داریم و پارامتر دوم مسیر فایل خروجی ما. داخل متد هم بوسیله ایجاد یک Process از ابزار wkthmltopdf برای تبدیل صفحه به pdf استفاده می کنیم. امیدوارم که این مطلب مورد استفاده دوستان واقع بشه.


حسین احمدی
حسین احمدی

بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ...

08 دی 1398 این مطلب را ارسال کرده

نظرات