Podofo는 PDF 파일 형식과 함께 작동하는 무료 휴대용 C ++ 라이브러리입니다.
Podofo는 PDF 파일을 구문 분석하고 컨텐츠를 메모리로 수정하는 클래스를 제공합니다. 변경 사항은 디스크에 쉽게 다시 작성할 수 있습니다. PDF Parsing Podofo 외에도 처음부터 자신의 PDF 파일을 만들 수있는 시설도 제공합니다. 현재 PDF 컨텐츠 렌더링을 지원하지 않습니다.
Podofo Lib을 구축하려면 C ++ 17 컴파일러, CMake 3.16 및 다음 라이브러리가 필요합니다 (잠재적 최소 버전이 표시됨).
가장 인기있는 도구 체인의 경우 Podofo는 다음과 같은 최소 버전이 필요합니다.
다음 IDE/Toolchains 버전으로 정기적으로 테스트됩니다.
GCC 8.X 지원은 최근에 파산되었지만 재개 할 수 있습니다.
Podofo Library는 LGPL 2.0 이상에 따라 라이센스가 부여됩니다. Podofo 도구는 GPL 2.0 이상에 따라 라이센스가 부여됩니다.
Podofo는 수많은 패키지 관리자 ( apt-get , Brew, VCPKG, Conan 포함)를 통해 컴파일하는 것으로 알려져 있으며 Ubuntu Linux, MacOS 및 Windows에서 공개적으로 지속적인 통합이 작동하며 CMAKE 프로젝트를 부트 스트랩하고 라이브러리를 구축 및 테스트합니다. 이러한 패키지 관리자를 사용하여 Podofo를 구축하는 것이 좋습니다.
저장소에는 일부 인기있는 아키텍처/운영 체제에 대한 사전 건축 의존성에 액세스 할 수있는 놀이터 공간이 있습니다. 놀이터는 라이브러리를 개발하고 버그를 재현하는 것이 권장되는 반면, Podofo를 사용하여 응용 프로그램을 배포하는 데 권장되지 않습니다. 거기에있는 readme를 살펴보십시오.
경고 : Podofo는 크로스 컴파일 툴 체인 (예 : Android/IOS 개발)에서 작동하는 것으로 알려져 있지만 그러한 시나리오에서는 지원이 제공되지 않을 수 있습니다. 수동으로 의존성을 구축하기로 결정한 경우 가능한 라이브러리 충돌/불일치를 신원화하는 방법과 시스템에서 발생할 수있는 컴파일/링크 문제를 처리하는 방법을 알고 있습니다.
소스 루트 실행에서 :
sudo apt-get install -y libfontconfig1-dev libfreetype-dev libxml2-dev libssl-dev libjpeg-dev libpng-dev libtiff-dev libidn11-dev
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
소스 루트 실행에서 Brew를 설치 한 다음 :
brew install fontconfig freetype openssl libxml2 jpeg-turbo libpng libtiff libidn cmake
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_FIND_FRAMEWORK=NEVER -DCMAKE_PREFIX_PATH=`brew --prefix` -DFontconfig_INCLUDE_DIR=`brew --prefix fontconfig`/include -DOPENSSL_ROOT_DIR=`brew --prefix openssl@3` ..
cmake --build . --config Debug
Conan을 설치 한 다음 소스 루트 실행에서 :
mkdir build
cd build
conan install ..
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
VCPKG QuickStart 안내서를 따라 패키지 관리자 저장소를 먼저 설정하십시오. Windows에서는 환경 변수 VCPKG_DEFAULT_TRIPLET x64-windows 로 설정하여 64 비트 종속성을 설치하고 QuickStart에서 생성 된 리포지토리 위치와 VCPKG_INSTALLATION_ROOT 변수를 기본값으로 설정하는 것이 유용 할 수 있습니다.
그런 다음 소스 루트 실행에서 :
vcpkg install fontconfig freetype libxml2 openssl libjpeg-turbo libpng tiff zlib
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=C:vcpkgscriptsbuildsystemsvcpkg.cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
PODOFO_BUILD_TEST : 단위 테스트, 기본값을 true로 구축하십시오.
PODOFO_BUILD_EXAMPLES : 예제를 작성하고 기본값을 true;
PODOFO_BUILD_UNSUPPORTED_TOOLS : podofo 도구, 기본값을 거짓으로 만듭니다. readme의 관련 섹션을 참조하십시오.
PODOFO_BUILD_LIB_ONLY : true 인 경우 라이브러리 구성 요소 만 빌드합니다. 이것은 무조건 구축 테스트, 예제 및 도구를 비활성화합니다.
PODOFO_BUILD_STATIC : 사실이라면, 정적 객체로서 라이브러리를 구축하고 테스트, 예제 및 도구에 사용하십시오. 기본적으로 공유 라이브러리가 구축됩니다.
Podofo의 정적 빌드를 사용하려면 Podofo Cmake 프로젝트를 포함하고 있다면 매우 간단합니다. CMAKE 프로젝트에서 다음과 같은 일을하십시오.
set(PODOFO_BUILD_LIB_ONLY TRUE CACHE BOOL "" FORCE)
set(PODOFO_BUILD_STATIC TRUE CACHE BOOL "" FORCE)
add_subdirectory(podofo)
# ...
target_link_libraries(MyTarget podofo::podofo)
Podofo의 사전 컴파일 된 정적 빌드와 연결하는 경우 링크 오류를 식별하고 수정할 수 있기 때문에 지원이 제한되는 시나리오입니다. 일반적인 단계는 다음과 같습니다.
PODOFO_STATIC 컴파일 정의를 프로젝트에 또는 podofo.h 포함시키기 전에 추가하십시오.podofo.a , podofo_private.a (또는 MSVC를 사용하여 podofo.lib , podofo_private.lib )와 모든 종속 라이브러리를 연결하십시오. API 문서는 https://podofo.github.io/podofo/documentation/에서 찾을 수 있습니다.
전제 조건 : 컴퓨터에 독소력이 설치되어 있는지 확인하십시오. 그렇지 않은 경우 Doxygen의 공식 웹 사이트를 방문하여 다운로드하여 설치하십시오.
문서 생성 : Development QuickStart 장에 자세히 설명 된 빌드 프로세스를 완료 한 후 Podofo 소스 코드의 루트 디렉토리로 이동하십시오. 터미널 또는 명령 프롬프트를 열고 다음 명령을 실행하십시오.
doxygen build/Doxyfile 문서보기 : 문서 생성이 완료되면 생성 된 문서가 포함 된 documentation 디렉토리가 있습니다. 좋아하는 웹 브라우저에서 index.html 열어 API 문서를보십시오.
cd build/doxygen/documentation
open index.html 라이브러리의 모든 std::strings 또는 std::string_view UTF-8 인코딩 된 문자열 컨텐츠를 보유하기위한 것입니다. PdfString 및 PdfName 생성자는 기본적으로 UTF-8 인코딩 된 문자열을 허용합니다 ( PdfName PdfDocEncoding char set에서 문자 만 허용). charbuff abd bufferview 대신 일반 옥넷 버퍼를 나타냅니다.
Podofo는 Podofo 0.9.x에 대한 광범위한 API 검토의 결과 인 불안정한 API를 가지고 있습니다. 이 링크에서는 0.9.8 코드를 0.10.0으로 마이그레이션하는 것에 대한 불완전한 안내서를 찾을 수 있습니다. Podofo는 검토 프로세스가 완료 되 자마자 안정적인 API로 수렴 될 것으로 예상됩니다. 자세한 내용은 API 안정성을 참조하십시오.
경고 : 도구는 현재 지원 되지 않고 테스트되지 않은 상태로 유지됩니다 .
Podofo 도구는 소스 트리에서 여전히 사용할 수 있지만 해당 컴파일은 기본적으로 비활성화되어 있으며, 유지되지 않으므로 상태가 지워질 때까지 지원을받지 않습니다. 소프트웨어 배포에 포함시키는 것이 좋습니다. 구축하려면 -DPODOFO_BUILD_UNSUPPORTED_TOOLS=TRUE 로 cmake 프로젝트를 부트 스트랩하십시오. 도서관 변경이 편집을 중단하지 않도록 최소한 놀이터에서 도구가 편리하게 활성화됩니다.
TODO 목록이 있거나 문제 추적기를보십시오.
Q : 문서에 어떻게 서명합니까?
A : Podofo Head는 이제 매우 강력한 높은 수준의 서명 절차를 제공하며 CMS 구조를 수동으로 제공하지 않고도 문서에 서명 할 수 있습니다. 기본적으로 최신 PAdES-B Compliance 프로파일로 문서에 서명하는 것이 지원되지만 레거시 PKCS7 서명에 대한 지원도 있습니다. ASN.1 인코딩 된 X509 인증서와 RSA 개인 키를 모두 제공하면 다음 코드로 문서에 서명 할 수 있습니다.
auto inputOutput = std::make_shared<FileStreamDevice>(filepath, FileMode::Open);
PdfMemDocument doc;
doc.Load(inputOutput);
auto & page = doc.GetPages().GetPageAt( 0 );
auto & signature = page.CreateField<PdfSignature>( " Signature " , Rect ());
auto signer = PdfSignerCms(x509certbuffer, pkeybuffer);
PoDoFo::SignDocument (doc, *inputOutput, signer, signature);외부 서명 서비스 및/또는 메모리 버퍼에 문서에 서명하는 지원도 있습니다. 단위 테스트의 다양한 서명 예제를 참조하십시오.
Q : 이벤트 기반 절차를 사용하여 문서에 서명 할 수 있습니까?
예, 기존 저급 절차는 변경되지 않았으며 여전히 사용할 수 있습니다. 절차를 간략하게 설명하려면 PdfSigner 완전히 구현하고 PdfSignature 필드를 검색하거나 작성하고 출력 장치를 작성하고 (다음 질문 참조) PoDoFo::SignDocument(doc, device, signer, signature) 사용해야합니다. 서명 할 때 PdfSignature 의 호출 순서는 다음과 같은 방식으로 작동합니다. 메소드 PdfSigner::Reset() 먼저 호출됩니다. 그런 다음 PdfSigner::ComputeSignature(buffer, dryrun) 빈 완충제로 호출되고 dryrun Argument가 true 로 설정됩니다. 이 호출에서 하나는 서명에 필요한 크기를 과대 평가하는 버퍼 크기를 조정하거나 버퍼에 저장 해야하는 가짜 서명을 계산할 수 있습니다. 그런 다음 PdfSigner::AppendData(buffer) 시퀀스가 호출되어 서명 할 모든 문서 데이터를 수신합니다. 최종 PdfSigner::ComputeSignature(buffer, dryrun) 호출되며 dryrun 매개 변수는 false 로 설정됩니다. 이 호출의 버퍼는 PdfSigner::SkipBufferClear() 의 값에 따라 지워 지거나 (용량이 변경되지 않음) 지워집니다.
Q : PdfMemDocument::SaveUpdate() 또는 PoDoFo::SignDocument() 부분 파일 만 쓰기 : podofo 0.9.x에서와 같이 증분 업데이트를 원활하게 처리하는 메커니즘이없는 이유는 무엇입니까? 문서를 올바르게 업데이트/서명하려면 어떻게해야합니까?
A : Podofo 0.9.x의 이전 메커니즘은 증분 업데이트를위한 문서를 활성화해야했으며, 이는 불필요하다고 생각하는 결정 단계입니다. 또한:
문서가로드 된 위치와 동일한 파일에서 증분 업데이트를 수행해야한다는 사실을 더 명확하게하는 대안 전략 또는 버퍼로드 된 문서의 경우 후속 작업 후에 기본 버퍼가 밈 소비를 늘릴 것이라는 사실을 명확하게합니다. 파일 또는 버퍼에서로드 된 문서를 업데이트하기 위해 올바른 작업을 보여주는 몇 가지 예를 따릅니다.
auto inputOutput = std::make_shared<FileStreamDevice>(filename, FileMode::Open);
PdfMemDocument doc;
doc.Load(inputOutput);
doc.SaveUpdate(*inputOutput);charbuff outputBuffer;
FileStreamDevice input (filepath);
auto inputOutput = std::make_shared<BufferStreamDevice>(outputBuffer);
input.CopyTo(*inputOutput);
PdfMemDocument doc;
doc.Load(inputOutput);
doc.SaveUpdate(*inputOutput);서명 문서는 동일한 기술로 수행 할 수 있으며 더 많은 예를 보려면 다른 질문을 읽으십시오.
Q : 문서에 두 번째 서명 할 수 있습니까?
A : 그렇습니다. 이것은 테스트되었지만, 이미로드 된 문서를 재사용하는 것이 아직 테스트되지 않았기 때문에이 문서를 다시 시작할 수 있도록 작동합니다 (나중에 변경 될 수 있음). 예를 들어 다음과 같이 할 수 있습니다.
auto inputOutput = std::make_shared<FileStreamDevice>(filepath, FileMode::Open);
{
PdfMemDocument doc;
doc. Load (inputOutput);
auto & page = doc. GetPages (). GetPageAt ( 0 );
auto & signature = page. CreateField <PdfSignature>( " Signature1 " , Rect ());
PdfSignerCms signer (x509certbuffer, pkeybuffer);
PoDoFo::SignDocument (doc, *inputOutput, signer, signature);
}
{
PdfMemDocument doc;
doc. Load (inputOutput);
auto & page = doc. GetPages (). GetPageAt ( 0 );
auto & signature = page. CreateField <PdfSignature>( " Signature2 " , Rect ());
PdfSignerCms signer (x509certbuffer, pkeybuffer);
PoDoFo::SignDocument (doc, *inputOutput, signer, signature);
}Podofo는 귀하의 요구에 맞게 작동하거나 작동하지 않을 수도 있으며 보증이 전혀 없습니다. 보안 결함을 포함한 심각한 버그는 임의의 기간으로 고정되거나 전혀 고정되지 않을 수 있습니다. 새로운 기능 및 버그 수정을 구현하는 우선 순위는 관리자의 관심사와 개인 선호도에 따라 결정됩니다. 워크 플로에 중요한 기능 또는 버그 수정을 통합하기 위해 Podofo가 필요한 경우, 가장 환영 받고 빠른 접근 방식은 고품질 패치를 제공하는 것입니다.
Podofo의 원래 개발자 중 일부가 여전히 프로젝트 메일 링리스트를 구독하십시오. 더 비공식적 인 채터를 완화하기 위해 Gitter 커뮤니티가 만들어졌습니다. 버그를 찾아서 수정하는 방법을 알고 있거나 작은 기능을 추가하려면 PULL 요청을 보내 프로젝트의 코딩 스타일을 따르는 것이 좋습니다. 최소한의 필수 조건으로 모든 기여는 다음과 같습니다.
풀 요청의 거부 또는 보유에 대한 다른 이유는 다음과 같습니다.
더 큰 기능이나 리팩터를 구현 해야하는 경우 먼저 계획되었는지 먼저 문의하십시오. 이 기능은 횡령에 적합 할 수 있으며, 이는 외부 기여에 열려 있음을 의미합니다. 피드백/조정을 받으려면 작업을 시작한 관련 문제를 작성하십시오. 그렇지 않은 경우 리팩토러/기능이 관리자가 나중에 구현할 계획을 의미합니다. 기능이 문제에 나열되지 않은 경우이를 추가하거나 토론을 만들어 피드백을 받고 몇 가지 기본 설계 선택을 논의하십시오.
경고 : 기술 지원을 위해 개인 이메일 주소를 사용하지 말고 대신 GitHub 문제를 만듭니다.
Podofo는 현재 Francesco Pretto와 Dominik Seichter 및 기타와 함께 개발 및 유지 관리됩니다. 자세한 내용은 audrors.md를 참조하십시오.