Как преобразовать PDF в PNG в многопоточном режиме на C# и .NET


Полный код

using System;
using System.IO;
using System.Collections.Generic;
using System.Threading;
using SautinSoft;

namespace Sample
{
    class Sample
    {
        static void Main(string[] args)
        {
            // Before starting, we recommend to get a free 100-day key:
            // https://sautinsoft.com/start-for-free/
            
            // Apply the key here:
            // SautinSoft.PdfFocus.SetLicense("...");
			
            ConvertPdfToPngInThread();
        }
        public class TArgument
        {
            public string PdfFile { get; set; }
            public int PageNumber { get; set; }
        }
        public static void ConvertPdfToPngInThread()
        {
            string pdfs = Path.GetFullPath(@"..\..\..");
            string[] files = Directory.GetFiles(pdfs, "*.pdf");

            List<Thread> threads = new List<Thread>();
            for (int i = 0; i < files.Length; i++)
            {
                TArgument targ = new TArgument()
                {
                    PdfFile = files[i],
                    PageNumber = 1
                };

                var t = new Thread((a) => ConvertToPng(a));
                t.Start(targ);
                threads.Add(t);
            }

            foreach (var thread in threads)
                thread.Join();
            Console.WriteLine("Done!");
        }

        public static void ConvertToPng(object targ)
        {
            TArgument targum = (TArgument)targ;
            string pdfFile = targum.PdfFile;
            int page = targum.PageNumber;

            string pngFile = Path.GetFileNameWithoutExtension(pdfFile) + ".png";
			
            SautinSoft.PdfFocus f = new SautinSoft.PdfFocus();

            f.ImageOptions.ImageFormat = PdfFocus.CImageOptions.ImageFormats.Png;
            f.ImageOptions.Dpi = 300;

            f.OpenPdf(pdfFile);

            bool done = false;

            if (f.PageCount > 0)
            {
                if (page >= f.PageCount)
                    page = 1;

                f.ImageOptions.PageIndex = page - 1;
                if (f.ToImage(pngFile) == 0)
                    done = true;
                f.ClosePdf();
            }

            if (done)
            {
                Console.WriteLine("{0}\t - Done!", Path.GetFileName(pdfFile));
                System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(pngFile) { UseShellExecute = true });
            }
            else
                Console.WriteLine("{0}\t - Error!", Path.GetFileName(pdfFile));
        }
    }
}

Download

Option Infer On

Imports Microsoft.VisualBasic
Imports System
Imports System.IO
Imports System.Collections.Generic
Imports System.Threading
Imports SautinSoft

Namespace Sample
	Friend Class Sample
		Shared Sub Main(ByVal args() As String)
			' Before starting, we recommend to get a free 100-day key:
			' https://sautinsoft.com/start-for-free/

			' Apply the key here
			' SautinSoft.PdfFocus.SetLicense("...");

			ConvertPdfToPngInThread()
		End Sub
		Public Class TArgument
			Public Property PdfFile() As String
			Public Property PageNumber() As Integer
		End Class
		Public Shared Sub ConvertPdfToPngInThread()
			Dim pdfs As String = Path.GetFullPath("..\..\..")
			Dim files() As String = Directory.GetFiles(pdfs, "*.pdf")

			Dim threads As New List(Of Thread)()
			For i As Integer = 0 To files.Length - 1
				Dim targ As New TArgument() With {
					.PdfFile = files(i),
					.PageNumber = 1
				}

				Dim t = New Thread(Sub(a) ConvertToPng(a))
				t.Start(targ)
				threads.Add(t)
			Next i

			For Each thread In threads
				thread.Join()
			Next thread
			Console.WriteLine("Done!")
		End Sub

		Public Shared Sub ConvertToPng(ByVal targ As Object)
			Dim targum As TArgument = DirectCast(targ, TArgument)
			Dim pdfFile As String = targum.PdfFile
			Dim page As Integer = targum.PageNumber

			Dim pngFile As String = Path.GetFileNameWithoutExtension(pdfFile) & ".png"

			Dim f As New SautinSoft.PdfFocus()

			f.ImageOptions.ImageFormat = PdfFocus.CImageOptions.ImageFormats.Png
			f.ImageOptions.Dpi = 300

			f.OpenPdf(pdfFile)

			Dim done As Boolean = False

			If f.PageCount > 0 Then
				If page >= f.PageCount Then
					page = 1
				End If

				f.ImageOptions.PageIndex = page - 1
				If f.ToImage(pngFile) = 0 Then
					done = True
				End If
				f.ClosePdf()
			End If

			If done Then
				Console.WriteLine("{0}" & vbTab & " - Done!", Path.GetFileName(pdfFile))
				System.Diagnostics.Process.Start(New System.Diagnostics.ProcessStartInfo(pngFile) With {.UseShellExecute = True})
			Else
				Console.WriteLine("{0}" & vbTab & " - Error!", Path.GetFileName(pdfFile))
			End If
		End Sub
	End Class
End Namespace

Download


Если вам нужен пример кода или у вас есть вопрос: напишите нам по адресу support@sautinsoft.com или спросите в онлайн-чате (правый нижний угол этой страницы) или используйте форму ниже:



Вопросы и предложения всегда приветствуются!

Мы разрабатываем компоненты .Net с 2002 года. Мы знаем форматы PDF, DOCX, RTF, HTML, XLSX и Images. Если вам нужна помощь в создании, изменении или преобразовании документов в различных форматах, мы можем вам помочь. Мы напишем для вас любой пример кода абсолютно бесплатно.