Как да визуализирате pdf файлове с помощта на C#

Искам да зареждам и рисувам pdf файлове графично с помощта на C#. Не е необходимо да ги редактирам или нещо подобно, просто ги изобразявам на дадено ниво на увеличение.

PDF библиотеките, които открих, изглежда са фокусирани върху генерирането. Как да направя това?

Благодаря.


person Garth    schedule 06.02.2009    source източник


Отговори (12)


Има няколко други възможности за избор, в случай че Adobe ActiveX не е това, което търсите (тъй като Acrobat трябва да присъства на машината на потребителя и не можете да го изпратите сами).

За да създадете визуализация на PDF, първо разгледайте някои други дискусии по темата в StackOverflow:

В последните две говоря за няколко неща, които можете да опитате:

  • Можете да получите комерсиален рендър (PDFViewForNet, PDFRasterizer.NET, ABCPDF, ActivePDF, XpdfRasterizer и други в другите отговори...).
    Повечето обаче са доста скъпи, особено ако всичко, което ви интересува, е да направите обикновен преглед/миниатюри.

  • В допълнение към кодовия фрагмент на Омар Шахин, има статия за CodeProject, която показва как да използвате Adobe ActiveX, но той може да е остарял, лесно да се разбива от нови версии и неговата законност е мътна (по принцип е добре за вътрешна употреба, но не можете да го изпратите и не можете да го използвате на сървър за създаване на изображения в PDF).

  • Можете да погледнете изходния код за SumatraPDF, OpenSource PDF визуализатор за Windows.

  • Има и Poppler, машина за изобразяване, която използва Xpdf като машина за изобразяване. Всички те са страхотни, но ще изискват доста голям ангажимент, за да работят и взаимодействат с .Net и обикновено се разпространяват под GPL.

  • Може да обмислите използването на GhostScript като интерпретатор, защото изобразяването на страници е доста прост процес.
    Недостатъкът е, че ще трябва или да го опаковате отново, за да го инсталирате с приложението си, или да го направите предпоставка (или поне част от процеса на инсталиране).
    Не е голямо предизвикателство , и със сигурност е по-лесно, отколкото да се налага да принуждавате другите машини за изобразяване да си сътрудничат с .Net.
    Направих малък проект, който ще намерите на Форуми на Developer Express като прикачен файл.
    Внимавайте с изискванията за лиценз за GhostScript чрез.
    Ако не можете да излезете с че тогава комерсиалният софтуер вероятно е единственият ви избор.

person Renaud Bompuis    schedule 17.02.2009
comment
Опцията Poppler може лесно да се използва от .NET приложения, когато инструментът се изпълнява като помощна програма от командния ред със System.Diagnostics.Process - и в този случай GPL лицензът не е блокер за използване на poppler в проекти със затворен код. Наскоро създадох C# обвивка за poppler, която предоставя много прост API за изобразяване на PDF . - person Vitaliy Fedorchenko; 07.03.2017

Google отвори кода на своята отлична машина за изобразяване на PDF файлове - PDFium - която написа със софтуера Foxit.

Има пакет C# nuget, наречен PdfiumViewer, който дава C# обвивка около PDFium и позволява показването и отпечатването на PDF файлове .

Използвал съм го и бях много впечатлен от качеството на изобразяването.


PDFium работи директно с потоци, така че не изисква никакви данни да бъдат записвани на диск.

Това е моят пример от приложение WinForms

    public void LoadPdf(byte[] pdfBytes)
    {
        var stream = new MemoryStream(pdfBytes);
        LoadPdf(stream)
    }

    public void LoadPdf(Stream stream)
    {
        // Create PDF Document
        var pdfDocument = PdfDocument.Load(stream);

        // Load PDF Document into WinForms Control
        pdfRenderer.Load(pdfDocument);
    }

Редактиране: За да получите контролата pdfRenderer в WinForm: Добавете пакета PdfiumViewer NuGet към проекта; отворете папката с пакети на проекти в Windows Explorer и плъзнете файла PdfiumViewer.dll върху прозореца Toolbox; Контрола, наречена PdfRenderer, ще бъде достъпна за добавяне:

„Добавяне

person Paddy    schedule 19.01.2015
comment
Знам, че темата е стара, но си заслужава коментара. Ако работите върху проект с близък код и трябва да работите с pdf файлове, това е библиотеката, която искате. всичко останало изисква платен лиценз за използване. - person ScarletMerlin; 15.10.2015
comment
Това определено е най-добрият отговор на въпроси относно програмите за преглед на pdf в приложенията winforms. Чудя се защо не е отбелязано като отговор на този пост! Благодаря @Paddy, това беше голяма помощ! - person aubykhan; 31.01.2016
comment
Забележка: Текущият pdfium.dll не може да бъде зареден в .NET 4.0 проект - person CZahrobsky; 24.08.2016
comment
Коя контрола е този pdfRenderer? - person V K; 30.01.2017
comment
потвърждавайки, че това все още работи дори в архивирано състояние, с пакети, които получих от NuGet (pdfiumViewer & pdfvium native) - в WPF приложение (има пример в кода на GitHub, който ме накара да се натъкна на изключения по време на изпълнение поради pdfium.dll - но родното изтегляне на NuGet го пакетира добре за вас - и кодът в примера работи) - person hello_earth; 29.04.2020
comment
потвърждавайки, че дори опаковането в един изпълним файл по .Net Core начин работи! това е твърде хубаво, за да е истина - person hello_earth; 29.04.2020
comment
За да накарам това да работи на winforms, трябваше да инсталирам пакетите nuget.org/packages/PdfiumViewer.Native.x86_64.v8-xfa и nuget.org/packages/PdfiumViewer.Native.x86.v8-xfa и след това копирайте папките /bin/debug/x86 и /bin/debug/x64 в главната папка, съгласно дискусията тук: github.com/pvginkel/PdfiumViewer/issues/83 - person Jack; 16.06.2020

Ето отговора ми от различен въпрос.

Първо трябва да препратите към Adobe Reader ActiveX Control

Adobe Acrobat Browser Control Type Library 1.0

%programfiles&\Common Files\Adobe\Acrobat\ActiveX\AcroPDF.dll

След това просто го плъзнете във вашия формуляр на Windows от кутията с инструменти.

И използвайте някакъв код като този, за да инициализирате ActiveX Control.

private void InitializeAdobe(string filePath)
{
    try
    {
        this.axAcroPDF1.LoadFile(filePath);
        this.axAcroPDF1.src = filePath;
        this.axAcroPDF1.setShowToolbar(false);
        this.axAcroPDF1.setView("FitH");
        this.axAcroPDF1.setLayoutMode("SinglePage");
        this.axAcroPDF1.Show();
    }
    catch (Exception ex)
    {
        throw;
    }
}

Уверете се, че когато вашият формуляр се затвори, изхвърляте ActiveX контролата

this.axAcroPDF1.Dispose();
this.axAcroPDF1 = null;

в противен случай Acrobat може да остане да лежи наоколо.

person Omar Shahine    schedule 17.02.2009
comment
Само предупреждение за всеки друг, който се натъкне на това - github.com/pvginkel/PdfiumViewer вече не е поддържан. - person Chris Owens; 03.10.2019
comment
за тези, които използват WPF - за съжаление, въпреки че има урок за това как да вградите ActiveX контроли в WPF, ако имате 64-битово приложение, не можах да го накарам да работи, защото 32-битовата версия на контролата винаги ще се извиква , причинявайки System.BadImageFormatException - person hello_earth; 29.04.2020
comment
отговаряйки на състоянието на поддръжка на PdfiumViewer - въпреки че е архивиран, той все още работи дори с компилация .Net Core 3.1 (WPF), върху която работя. и повтарям коментарите за другия отговор - това е единственият пакет с отворен код, който използва Apache 2.0 лиценз, който не е ограничителен като GPL и т.н. - все пак не съм пробвал PDFiumSharp - може би си струва да опитате! - person hello_earth; 29.04.2020

PdfiumViewer е страхотен, но сравнително тясно свързан с System.Drawing и WinForms. Поради тази причина създадох моя собствена обвивка около PDFium: PDFiumSharp

Страниците могат да бъдат изобразени в PDFiumBitmap, който от своя страна може да бъде записан на диск или изложен като поток. По този начин всяка рамка, способна да зареди изображение във формат BMP от поток, може да използва тази библиотека за показване на pdf страници.

Например в WPF приложение можете да използвате следния метод за изобразяване на pdf страница:

using System.Linq;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using PDFiumSharp;

static class PdfRenderer
{
    public static ImageSource RenderPage(string filename, int pageIndex, string password = null, bool withTransparency = true)
    {
        using (var doc = new PdfDocument(filename, password))
        {
            var page = doc.Pages[pageIndex];
            using (var bitmap = new PDFiumBitmap((int)page.Width, (int)page.Height, withTransparency))
            {
                page.Render(bitmap);
                return new BmpBitmapDecoder(bitmap.AsBmpStream(), BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames.First();
            }
        }
    }
}
person ArgusMagnus    schedule 10.04.2017
comment
Бихте ли дали пример за това как да създадете/използвате PDFiumBitmap с по-ниска дълбочина на цвета? Ако задам withTransparency на false, в крайна сметка се използва BGRx и 32-битова дълбочина на цвета, когато искам да използва BGR и 24-битова дълбочина на цвета. - person Ryan Thomas; 30.08.2019
comment
Всъщност успях да намеря коментарите към документацията в основния код на pdfium и да го разбера. var pdfiumBitmap = new PDFiumBitmap((int)scaledWidth, (int)scaledHeight, BitmapFormats.FPDFBitmap_BGR, IntPtr.Zero, 0); cs.chromium.org/chromium /src/third_party/pdfium/public/ - person Ryan Thomas; 30.08.2019

ABCpdf ще направи това и много други неща вместо вас.

Не само той ще рендира вашия PDF файл в различни формати (напр. JPEG, GIF, PNG, TIFF, JPEG 2000; векторни EPS, SVG, Flash и PostScript), но може да го направи и в различни цветови пространства (напр. сиво, RGB, CMYK) и битови дълбочини (напр. 1, 8, 16 бита на компонент).

И това е само част от това, което ще направи!

За повече подробности вижте:

http://www.websupergoo.com/abcpdf-8.htm

О, можете да получите безплатни лицензи чрез схемата за безплатни лицензи.

Има проблеми с EULA при използването на Acrobat за изобразяване на PDF. Ако искате да тръгнете по този маршрут, първо проверете много внимателно законността.

person user81888    schedule 24.03.2009

Използвайте контрола на уеб браузъра. Това изисква Adobe reader да бъде инсталиран, но най-вероятно все пак го имате. Задайте UrL на контролата на местоположението на файла.

person Sesh    schedule 06.02.2009
comment
Не виждам защо трябва да използвате контролата на браузъра, тъй като самата тя използва приставката Adobe ActiveX, която е достъпна директно. Вие просто добавяте слой сложност и потенциални проблеми без очевидно никаква основателна причина. - person Renaud Bompuis; 07.02.2011
comment
от друга страна контролът на браузъра е изключително лесен за използване и е готов за работа. - person aiodintsov; 08.06.2019

Можете да добавите NuGet пакет CefSharp.WinForms към вашето приложение и след това да добавите контрола ChromiumWebBroweser към вашия формуляр. В кода можете да напишете:

chromiumWebBrowser1.Load(filePath);

Това е най-лесното решение, което съм намирал, то е напълно безплатно и независимо от настройките на компютъра на потребителя, както би било при използване на контрола на уеб браузъра по подразбиране.

person TK-421    schedule 30.04.2020

Dynamic PDF Viewer от софтуера ceTe може да направи това, което търсите. Използвах техния генераторен софтуер и бях доста доволен от него.

http://www.dynamicpdf.com/

person Paul Lefebvre    schedule 06.02.2009

Най-лесният lib, който съм използвал, е библиотеката на Paolo Gios. По принцип е

Create GiosPDFDocument object
Create TextArea object
Add text, images, etc to TextArea object
Add TextArea object to PDFDocument object
Write to stream

Това е чудесен урок, за да започнете.

person Community    schedule 06.02.2009
comment
Мисля, че това, което Гарт иска, е просто да рендира pdf файлове; не това, което показахте по-горе. - person MarlonRibunal; 06.02.2009

Това изглежда като правилното нещо: http://code.google.com/p/lib-pdf/

person DenNukem    schedule 05.02.2013

Тук бих искал да спомена библиотеката Docotic.Pdf. Може да конвертира PDF в изображение в C# и VB.NET . Освен това може да изобразява и отпечатва PDF документи.

Библиотеката се управлява 100% без външни зависимости. Не зависи от System.Drawing.dll или GDI+. Ще получите последователен изход на Windows, Linux, macOS, iOS и Android.

Аз съм един от разработчиците на Docotic.Pdf, така че наистина ми харесва. Моля, опитайте и вероятно ще ви хареса.

person Bobrovsky    schedule 19.03.2021

Можете да потърсите в Google компонент за преглед на PDF файлове, и измислете повече от няколко попадения.

Ако обаче наистина не е необходимо да ги вграждате в приложението си - можете просто да изисквате Acrobat Reader или FoxIt (или да го обедините, ако отговаря на съответните им лицензионни условия) и платете за него. Не е толкова готино, но върши работата безплатно.

person Mark Brackett    schedule 06.02.2009