Libraries

PDFium 라이브러리 삽질기 - 7

respiro 2019. 12. 30. 17:32

PDFium 라이브러리 삽질기 - 7

윈도우에서 사용하기 (2)

작성일자: 2019년 12월 30일

작성자: N3




앞에서 Windows DLL 을 빌드하는 방법을 다루어보았다.

이번에는 PDFium.dll 을 실제 사용하는 예제를 함께 빌드해서, 제대로 동작하는지 테스트해 본다.


1. PDFium Viewer

PDFium 라이브러리를 사용하는 C# 으로 작성된 라이브러리다.


Pdfium Viewer 는 현재 개발은 중단되었으며, 사용하기 위해서는 pdfiumviewer.cpp 를 pdfium 빌드에 추가해야 한다.


위 소스를 pdfium/fpdfsdk 폴더에 복사하고, 해당 폴더의 BUILD.gn 파일에 다음을 추가한다.


source_set("fpdfsdk") {

  sources = [

    "cpdfsdk_actionhandler.cpp",

    "cpdfsdk_actionhandler.h",

    "cpdfsdk_annot.cpp",

...

    "ipdfsdk_annothandler.h",

    "pdfiumviewer.cpp",

  ]



Dynamic DLL 을 새로 만든다.

  • FPDF_EXPORT void FPDF_CALLCONV FPDF_AddRef()
  • FPDF_EXPORT void FPDF_CALLCONV FPDF_Release()
두 개의 함수가 Export 되어서 보인다.


Github 에서 소스를 내려받으면, 빌드된 DLL 이 packages 폴더에 있다.

PDFiumViewer 는 DLL 이며, 실행 프로그램은 아니다.


이 프로젝트에는 두 개의 Viewer 샘플 프로그램이 들어 있다. WPF 와 일반 C# 데모 뷰어다.

소스의 Packages 폴더에 이미 빌드된 DLL 이 들어 있으며, 프로젝트 파일에서 해당 DLL 을 데모 프로그램의 폴더에 복사하도록 되어 있다.


해당 DLL 을 바꿔치거나 알아서 적당히 사용하면 된다.


private static bool TryLoadNativeLibrary(string path)

        {

            if (path == null)

                return false;


            path = Path.Combine(path, IntPtr.Size == 4 ? "x86" : "x64");

            path = Path.Combine(path, "Pdfium.dll");


            // 테스트를 위한 임의 수정

            if (!File.Exists(path))

                return false;

            IntPtr handle = LoadLibrary(path);

            if (handle == IntPtr.Zero)

            {

                return false;

            }

            return true;

        }

실행 플랫폼에 따라 x86 폴더와 x64 에서 DLL 을 찾고 있다.


참고로, x64 윈도우에서 아래 옵션을 추가해서 x86 DLL 을 빌드하면 된다.

target_cpu = "x86"


혹시  DLL 파일을 찾았는데 DLL 을 찾지 못해 오류가 나는 경우,

D:\PDF\pdfium\out\viewer>dumpbin /DEPENDENTS pdfium.dll

Microsoft (R) COFF/PE Dumper Version 14.24.28314.0

Copyright (C) Microsoft Corporation.  All rights reserved.



Dump of file pdfium.dll


File Type: DLL


  Image has the following dependencies:


    ADVAPI32.dll

    GDI32.dll

    USER32.dll

    KERNEL32.dll

    icuuc.dll

    zlib.dll

    MSVCP140.dll

    VCRUNTIME140.dll

    api-ms-win-crt-runtime-l1-1-0.dll

    api-ms-win-crt-string-l1-1-0.dll

    api-ms-win-crt-stdio-l1-1-0.dll

    api-ms-win-crt-math-l1-1-0.dll

    api-ms-win-crt-convert-l1-1-0.dll

    api-ms-win-crt-time-l1-1-0.dll

    api-ms-win-crt-utility-l1-1-0.dll

    api-ms-win-crt-heap-l1-1-0.dll

    api-ms-win-crt-environment-l1-1-0.dll

    api-ms-win-crt-filesystem-l1-1-0.dll

위 4개의 DLL 을 추가 복사해서 사용한다.

API-MS 로 시작하는 것들은 대개 재배포 패키지를 설치하면 될 것이다.


데모 프로그램을 실행해서, PDF 를 열면 다음과 같이 PDF 내용을 읽을 수 있다.




3. PDFium Editor 


PDFium Editor 는 위의 PDFium Viewer 를 개선한 버전이다.

이름에서 보듯, Editor  기능을 추가했다.

소스를 내려받고, 설루션 파일을 열어서 빌드해 본다.


nuget 으로 DataMatrix 를 설치해 준다.

그리고, 파일이 존재하지 않는 두 개의 파일(GMsign.pfx, key) 은 프로젝트에서 제거한다.


대충 빌드하고 나니, 예제 프로그램이 아니라, Dynamic Library 만 생성하고 만다.

예제는 어디에 있는가?


4. PDFiumSharp Library


검색결과 PDFium 을 사용하는 두 개의 닷넷 프로그램을 찾았다. 220달러 이상의 상용 라이브러리와  MS-RL 라이센스의 오픈소스 라이브러리다.


빌드하기 전에 두 개의 텍스트 템플릿 파일(tt) 을 먼저 실행해야 한다.

  • PDFiumSharp\Types\FPDF_Typedefs.tt
  • PDFiumSharp\PDFium.tt
솔루션 탐색기에서 오른쪽 마우스로 선택한 후,  run(사용자 지정도구 실행) 한다.

만약, 새로 빌드한 DLL 을 사용할려면, 아래 코드를 맞게 수정하거나, 빌드된 DLL 을 덮어씌워준다.

const string DllName32 = "pdfium_x86";
const string DllName64 = "pdfium_x64";


  • PDFiumSharp.dll
  • PDFiumSharp.GdiPlus.dll
  • PDFiumSharp.Wpf.dll
  • PDFiumSharp.Xwt.dll
4개의 DLL 을 빌드할 수 있다.

테스트는 samples 폴더의 프로그램을 사용하면 된다.