Библиотека создания и отображения PDF

  • Создавайте PDF-документы с нуля или из скан-копий
  • Объединяйте или разбивайте постранично PDF-файлы
  • Извлекайте или редактирйуйте текст и изображения
  • Содержит встраеваемые Winforms и WPF компоненты
  • Поддерживает .Net 2.0+, .Net 6, Standard, Core, Mono
    Работает на WinXP и MacOS
    Совместимо с Microsoft Azure
Скачать Установить с помощью NuGet

Одна библиотека для создания и отображения PDF

Pdfium.Net SDK — это ведущая библиотека .Net для создания, обработки и просмотра файлов в формате переносимых документов (PDF). Мы предлагаем высокоуровневый API c# для динамического создания PDF-файлов на веб-сервере или любой другой серверной системе, а также для реализации функции «Сохранить как PDF» в существующих настольных или веб-приложениях.

Создаваемый код максимально прост и лаконичен:

Как программно создать PDF-документ (C#)

/// <summary>
/// Create PDF Document on The Fly in C# using Pdfium.Net SDK Library
/// </summary>
public void CreatePdf()
{
    // The PDF coordinate system origin is at the bottom left corner of the page. 
    // The X-axis is pointing to the right. The Y-axis is pointing in upward direction.
    // The sizes and coordinates in this method are given in the inches.

    // Step 1: Initialize PDF library and create empty document
    // Return value: PdfDocument main class
    PdfCommon.Initialize();
    var doc = PdfDocument.CreateNew();  // Create a PDF document

    // Step 2: Add new page
    // Arguments: page width: 8.27", page height: 11.69", Unit of measure: inches
    //  The PDF unit of measure is point. There are 72 points in one inch.
    var page = doc.Pages.InsertPageAt(doc.Pages.Count, 8.27f * 72, 11.69f * 72);

    // Step 3: Add graphics and text contents to the page
    // Insert image from file using standart System.Drawing.Bitmap class
    using (PdfBitmap logo = PdfBitmap.FromFile(@"e:\63\logo_square.png"))
    {
        PdfImageObject imageObject = PdfImageObject.Create(doc, logo, 0, 0);
        //image resolution is 300 DPI and location is 1.69 x 10.0 inches.
        imageObject.Matrix = new FS_MATRIX(logo.Width * 72 / 300, 0, 0, logo.Height * 72 / 300, 1.69 * 72, 10.0 * 72);
        page.PageObjects.Add(imageObject);
    }

    // Create fonts used for text objects
    PdfFont calibryBold = PdfFont.CreateFont(doc, "CalibriBold");
    // Insert text objects at 7.69"; 11.02" and font size is 25
    PdfTextObject textObject = PdfTextObject.Create("Sample text", 1.69f * 72, 11.02f * 72, calibryBold, 25);
    textObject.FillColor = FS_COLOR.Black;
    page.PageObjects.Add(textObject);

    // Step 5: Generate page content and save pdf file
    // argument: PDF file name
    page.GenerateContent();
    doc.Save(@"e:\63\sample_document.pdf", SaveFlags.NoIncremental);
}
 

С# Библиотека Pdfium.Net SDK позволяет разработчикам легко создавать PDF-документы. В данном примере иллюстрируется, как создать такой документ с помощью страничных объектов.

Вы можете создать страничные обекты разных типов (текст, изображения, контуры, формы и т.п.) и разместить их в любом месте страницы.

Как программно сгенерировать PDF из набора изображений (C#)

/// <summary>
/// Generate PDF document From Multiple Images in C# using PDF Library
/// </summary>
public void GeneratePdf()
{
    //Initialize C# PDF Library
    PdfCommon.Initialize();
    //Create a PDF document
    using (var doc = PdfDocument.CreateNew())
    {
        //Read images
        var files = System.IO.Directory.GetFiles(@"c:\Images\", "*.*", 
                    System.IO.SearchOption.AllDirectories);
        foreach (var file in files)
        {
            //Create empty PdfBitmap
            using (PdfBitmap pdfBitmap = PdfBitmap.FromFile(file))
            {
                //Create Image object
                var imageObject = PdfImageObject.Create(doc, pdfBitmap, 0, 0);
                //Calculate size of image in PDF points
                var size = CalculateSize(pdfBitmap.Width, pdfBitmap.Height);
                //Add empty page to PDF document
                var page = doc.Pages.InsertPageAt(doc.Pages.Count, size);
                //Insert image to newly created page
                page.PageObjects.Add(imageObject);
                //set image matrix
                imageObject.Matrix = new FS_MATRIX(size.Width, 0, 0, size.Height, 0, 0);
                //Generate PDF page content to content stream
                page.GenerateContent();
            }
        }
        // Save  PDF document as "saved.pdf" in no incremental mode
        doc.Save(@"c:\test.pdf", SaveFlags.NoIncremental);
    }
}
/// <summary>
/// The function takes width and height of the bitmap in pixels as well as 
/// horizontal and vertical DPI and calculates the size of the PDF page. 
/// To understand the conversion you should know the following:
///     One inch contains exactly 72 PDF points;
///     DPI of the scanned image may vфry and depends on scanning resolution
/// <summary>
private FS_SIZEF CalculateSize(int width, int height, float dpiX=300, float dpiY=300)
{
    return new FS_SIZEF()
    {
        Width = width * 72 / dpiX,
        Height = height * 72 / dpiY
    };
}
 

В этом примере показано, как можно создать документ PDF из набора отсканированных изображений с помощью простого кода C# и библиотеки PDF.

Как печатать PDF-файлы (C#)

/// <summary>
/// Printing PDF Files in C# using PDF Library
/// </summary>
public void PrintPdf()
{
    var doc = PdfDocument.Load("c:\test.pdf");  // Read PDF file
    var printDoc = new PdfPrintDocument(doc);
    printDoc.Print();
}

Приведенный выше код печатает PDF-документ на принтере по умолчанию. Также отображается стандартный диалог печати с ходом печати. Если вы хотите скрыть окно прогресса, измените код, как показано ниже.

public void PrintPdf()
{
    var doc = PdfDocument.Load("c:\test.pdf");
    var printDoc = new PdfPrintDocument(doc);
    PrintController printController = new StandardPrintController();
    printDoc.PrintController = printController;
    printDoc.Print(); // C# Print PDF document
}

PdfPrintDocument является производным от стандартного класса PrintDocument, поэтому вы можете использовать диалоговое окно печати .Net Framework (PrinterDialog), которое настраивает PrintDocument в соответствии с пользовательским вводом.

public void OnPrintClick()
{
	if (PdfViewer.Document.FormFill != null)
		PdfViewer.Document.FormFill.ForceToKillFocus();

	//create an instance of PrintDocument class
	var printDoc = new PdfPrintDocument(PdfViewer.Document); // create an instance of Print document class that is used for printing PDF document.

	//Create a standard print dialog box
	var dlg = new PrintDialog();
	dlg.AllowCurrentPage = true;
	dlg.AllowSomePages = true;
	dlg.UseEXDialog = true;
	//sets the PrintDocument used to obtain PrinterSettings.
	dlg.Document = printDoc;
	//show PrinterDialog and print pdf document
	if (dlg.ShowDialog() == DialogResult.OK)
		printDoc.Print();   // C# Print PDF
}
 
 

Как открыть файл PDF и извлечь из него текст (С#)

/// <summary>
/// Read PDF File and Extract Text From it in C#
/// </summary>public void ExtractText()
{
    //Initialize the SDK library
    //You have to call this function before you can call any PDF processing functions.
    PdfCommon.Initialize();

    //Open and load a PDF document from a file.
    using (var doc = PdfDocument.Load(@"c:\test001.pdf")) // C# Read PDF File
    {
        foreach (var page in doc.Pages)
        {
            //Gets number of characters in a page or -1 for error.
            //Generated characters, like additional space characters, new line characters, are also counted.
            int totalCharCount = page.Text.CountChars;

            //Extract text from page to the string
            string text = page.Text.GetText(0, totalCharCount);

            page.Dispose();
        }
    }
}

Pdfium.Net SDK позволяет разработчикам легко извлекать полный текст практически из любого файла PDF.

Как искать текст в файле PDF (C#)

/// <summary>
/// Search for a Text in a PDF File in C# With Pdfium.Net SDK Library
/// </summary>
public void Search()
{
    //Open PDF document
    using (var doc = PdfDocument.Load(@"d:\0\test_big.pdf")) // Read PDF document and enumerate pages
    {
	    //Enumerate pages
	    foreach(var page in doc.Pages)
	    {
		    var found = page.Text.Find("text for search", FindFlags.MatchWholeWord, 0);
		    if (found == null)
			    return; //nothing found
		    do
		    {
			    var textInfo = found.FoundText;
			    foreach(var rect in textInfo.Rects)
			    {
				    float x = rect.left;
				    float y = rect.top;
				    //...
			    }
		    } while (found.FindNext());

		    page.Dispose();
	    }
    }
}

В этом примере показано, как с помощью простого кода C# и библиотеки PDF можно искать текст в документе.

Как искать текст асинхронно (C#)

/// <summary>
/// Search for a Text Asynchronously in C# using PDF Library
/// </summary>
public void SearchAsync()
{
    //Open PDF document
    var doc = PdfDocument.Load(@"c:\test_big.pdf"); // C# Read PDF File
    PdfSearch search = new PdfSearch(doc);
    search.FoundTextAdded += (s, e) =>
	    {
		    var textInfo = doc.Pages[e.FoundText.PageIndex].Text.GetTextInfo(e.FoundText.CharIndex, e.FoundText.CharsCount);
		    foreach (var rect in textInfo.Rects)
		    {
			    float x = rect.left;
			    float y = rect.top;
			    Console.WriteLine(string.Format("Found text: {0}, Page = {1}, x= {2}, y={3}", textInfo.Text, e.FoundText.PageIndex, x, y));
			    //...
		    }
	    };
    search.SearchCompleted += (s, e) =>
	    {
		    doc.Dispose();
	    };
    search.SearchProgressChanged += (s, e) =>
	    {
		    Console.WriteLine(string.Format("Progress: {0}%", e.ProgressPercentage));
	    };
    search.Start("document", FindFlags.MatchWholeWord);
    Console.ReadLine();
}
 

В этом примере показано, как можно использовать C# PDF библиотеку для асинхронного поиска текста.

Как получить координаты извлеченного из PDF текста (C#)

/// <summary>
/// Extract Text Coordinates from Pdf in C# using PDF Library
/// </summary>
public void ExtractTextInfo()
{
    //Initialize the SDK library
    //You have to call this function before you can call any PDF processing functions.
    PdfCommon.Initialize();

    //Open and load a PDF document from a file.
    using (var doc = PdfDocument.Load(@"c:\test001.pdf")) // C# Read PDF File
    {
        //Get second page from document
        using (var page = doc.Pages[1])
        {
            //Extract text information structure from the page
            // 10 - Index for the start characters
            // 25 - Number of characters to be extracted
            var textInfo = page.Text.GetTextInfo(10, 25);

            //Gets text from textInfo strtucture
            string text = textInfo.Text;

            //Gets a collection of rectangular areas bounding specified text.
            var rects = textInfo.Rects;
        }
    }
}

Pdfium.Net SDK также позволяет разработчикам легко извлекать текстовые координаты из любого файла PDF.

Как извлечь изображения из документа PDF (C#)

/// <summary>
/// Extracting Images from Pdf File With .Net C# and PDF Library
/// </summary>
private int _writedImageIndex = 0;

public void ExtractAllImages()
{
    //Initialize the SDK library
    //You have to call this function before you can call any PDF processing functions.
    PdfCommon.Initialize();

    //Open and load a PDF document from a file.
    using (var doc = PdfDocument.Load(@"c:\test001.pdf")) // C# Read PDF File
    {
        //Enumerate all pages sequentially in a given document
        foreach (var page in doc.Pages)
        {
            //Extract and save images
            ExtractImagesFromPage(page);

            //dipose page object to unload it from memory
            page.Dispose();
        }
    }
}

private void ExtractImagesFromPage(PdfPage page)
{
    //Enumerate all objects on a page
    foreach (var obj in page.PageObjects)
    {
        var imageObject = obj as PdfImageObject;
        if (imageObject == null)
            continue; //if not an image object then nothing do

        //Save image to disk
        var path = string.Format(@"c:\\Images\\image_{0}.png", ++_writedImageIndex);
        imageObject.Bitmap.Image.Save(path, ImageFormat.Png);
    }
}
 

В примере показано извлечение изображений разного формата из файла PDF и их сохранение на диск.

Как разбить PDF-документ на отдельные документы (C#)

/// <summary>
/// Split PDF in C# using PDF Library
/// </summary>
public void SplitDocument()
{
    //Initialize the SDK library
    //You have to call this function before you can call any PDF processing functions.
    PdfCommon.Initialize();

    //Open and load a PDF document from a file.
    using (var sourceDoc = PdfDocument.Load(@"c:\test001.pdf")) // C# Read PDF File
    {
        //Create one PDF document for pages 1-5.
        using (var doc = PdfDocument.CreateNew())
        {
            //Import pages from source document
            doc.Pages.ImportPages(sourceDoc, "1-5", 0);
            //And save it to doc1.pdf
            doc.Save(@"c:\doc1.pdf", SaveFlags.Incremental);
        }

        //Create another PDF document for pages 5-10.
        using (var doc = PdfDocument.CreateNew())
        {
            //Also import pages
            doc.Pages.ImportPages(sourceDoc, "5-10", 0);
            //And save them too
            doc.Save(@"c:\doc2.pdf", SaveFlags.Incremental);
        }
    }
}
 

В следующем примере кода показано, как использовать PDF библиотеку для разделения документа на отдельные страницы.

Как объединить страницы из нескольких PDF в один документ (C#)

/// <summary>
/// Merge PDFs in C# using PDF Library
/// </summary>
public void MergePdf()
{
    //Initialize the SDK library
    //You have to call this function before you can call any PDF processing functions.
    PdfCommon.Initialize();

    //Open and load a PDF document in which will be merged other files
    using (var mainDoc = PdfDocument.Load(@"c:\test001.pdf")) // C# Read source PDF File #1
    {
        //Open one PDF document.
        using (var doc = PdfDocument.Load(@"c:\doc1.pdf")) //Read PDF File #2
        {
            //Import all pages from document
            mainDoc.Pages.ImportPages(
                doc,
                string.Format("1-{0}", doc.Pages.Count),
                mainDoc.Pages.Count
                );
        }

        //Open another PDF document.
        using (var doc = PdfDocument.Load(@"c:\doc2.pdf"))
        {
            //Import all pages from document
            mainDoc.Pages.ImportPages(
                doc,
                string.Format("1-{0}", doc.Pages.Count),
                mainDoc.Pages.Count
                );
        }

        mainDoc.Save(@"c:\ResultDocument.pdf", SaveFlags.NoIncremental);


    }
}
 

Используя C# PDF Library, вы можете выбрать определенные страницы из исходных файлов и объединить их в один PDF-документ.

Этот пример показывает, как это можно сделать с помощью операции ImportPages.

Source Code10

Source Code11

Как преобразовать каждую страницу документа PDF в изображение (C#)

/// <summary>
/// Render whole PDF document using C# PDF Library
/// </summary>
using (var doc = PdfDocument.Load(@"d:\0\test_big.pdf")) // C# Read PDF Document
{
    foreach (var page in doc.Pages)
    {
        int width = (int)(page.Width / 72.0 * 96);
        int height = (int)(page.Height / 72.0 * 96);
        using (var bitmap = new PdfBitmap(width, height, true))
        {
            bitmap.FillRect(0, 0, width, height, Color.White);
            page.Render(bitmap, 0, 0, width, height, PageRotate.Normal, RenderFlags.FPDF_LCD_TEXT);
            bitmap.Image.Save("...", ImageFormat.Png);
        }
    }
}

В этом примере создается растровое изображение каждой страницы, для чего необходимо вычислить ширину и высоту растрового изображения в пикселях.

Размер страницы PDF задается в точках (1 точка равна 1/72 дюйма). Поэтому DPI изображения (96 в этом примере), умножается на соответствующий размер в точках и делится на 72.

Как программно заполнять и извлекать данные из полей PDF

/// <summary>
/// Filling Editable PDF Fields and Extracting Data From Them using .Net PDF Library
/// </summary>
private void btnTest_Click(object sender, RoutedEventArgs e)
{
	var forms = new PdfForms();
	var doc = PdfDocument.Load(@"c:\test.pdf", forms); // C# Read PDF Document
	//doc.FormFill is equal to forms and can be used to get access to acro forms as well;

	int i = 0;
	foreach(var field in forms.InterForm.Fields)
	{
		if(field.FieldType == Patagames.Pdf.Enums.FormFieldTypes.FPDF_FORMFIELD_TEXTFIELD)
		{
			field.Value = "This is a field #" + (++i);
		}
	}
}

В этом примере показано, как программно заполнять редактируемые формы в документе PDF с помощью библиотеки .Net PDF.

 

Доступная поддержка от разработчиков

Приобретая лицензию на продукт, вы получаете больше, чем отличную библиотеку. Чтобы достичь максимальной отдачи, вы также получаете 12 месяцев бесплатной технической поддержки непосредственно от нашей команды разработчиков и бесплатные обновления в течении года.

I've tried your latest release and it works perfectly ― solves both my problems! Thanks for meeting my request ―it's much appreciated. We still use [other product] for some legacy projects, but we have dropped it for all new projects. Although the [other product] library itself is good, we found their support to be poor ― without doubt Pdfium.NET support has proven to be far better, both in speed and quality!
Again, many thanks for your first-rate service and excellent product. -Terry
The link is hidden due to ethical concerns.

Мы ориентируемся на простоту, чтобы вы могли сосредоточиться на своих приложениях

Основная цель разработки Pdfium.Net SDK — сделать вещи простыми и интуитивно понятными для разработчиков. Библиотека классов абстрагирует все детали использования базовой библиотеки pdfium и предоставляет интерфейс, основанный на объектах мира и других интуитивно понятных классах.

Кроме того, Pdfium.Net SDK хорошо документирован! Мы предоставляем обширную документацию, цель которой — дать новичкам и опытным пользователям обзор того, что возможно с Pdfium.Net SDK.

 

Оптимизировано для корпоративных и облачных сервисов

Одна из наших целей — предоставить разработчикам высококачественный инструмент для динамического создания PDF-файлов на любой серверной системе, такой как Microsoft Azure.

Я убедился, что ваш SDK работает при развертывании в Azure (несколько продуктов, которые я тестировал, не работали, - вы можете рекламировать это). Я сделал покупку.
Еще раз спасибо! -Cyberg
https://forum.patagames.com/posts/m1105-Workability-in-various-environments#post1105

Встраиваемый компонент для просмотра PDF

Отображение PDF-документов в приложениях .Net

Внедрите возможность просмотра файлов PDF в ваше приложение .Net! Благодаря нескольким режимам просмотра, тонкой настройке и полной поддержке форм средство просмотра PDF легко впишется в ваше приложение и адаптируется к вашему дизайну.

  • Полностью настраиваемый интерфейс
  • Поддержка интерактивных форм
  • Гибкая обработка событий
  • Простая интеграция
  • Открытый исходный код
WPF Viewer Winforms Viewer
C# PDF Viewer
Обратитесь к документациидля получения дополнительной информации о внешнем виде PdfViewer.

Pdfium.Net SDK

Скачать

Пакет NuGet доступен в официальном репозитории на nuget.org.

PM> Install-Package Pdfium.Net.SDK

Предназначен для

Microsoft .Net Framework 2.0+ Microsoft .Net Standard 2.0+ Microsoft Visual Studio NuGet Microsoft Azure