Podofo é uma biblioteca C ++ portátil gratuita para trabalhar com o formato de arquivo PDF.
O Podofo fornece classes para analisar um arquivo PDF e modificar seu conteúdo na memória. As alterações podem ser escritas de volta facilmente no disco. Além do PDF Parsing Podofo, também fornece instalações para criar seus próprios arquivos PDF a partir do zero. Atualmente, não suporta renderizar conteúdo em PDF.
Para construir o Podofo Lib, você precisará de um compilador C ++ 17, CMake 3.16 e as seguintes bibliotecas (versões mínimas provisórias indicadas):
Para as cadeias de ferramentas mais populares, o Podofo requer as seguintes versões mínimas:
É testado regularmente com as seguintes versões IDE/ToolChains:
O suporte do GCC 8.x quebrou recentemente, mas pode ser reinstido.
A biblioteca Podofo é licenciada nos termos LGPL 2.0 ou posteriores. As ferramentas podofo são licenciadas nos termos GPL 2.0 ou posteriores.
Sabe-se que o Podofo compilar através de uma infinidade de gerentes de pacotes (incluindo apt-get , Brew, VCPKG, Conan) e tem integração contínua pública trabalhando no Ubuntu Linux, MacOS e Windows, Bootstrapping do projeto CMake, construindo e testando a biblioteca. É altamente recomendável construir o Podofo usando esses gerentes de pacotes.
Há também uma área de playground no repositório, onde você pode ter acesso a dependências pré-construção para alguns arquiteturas/sistemas operacionais populares: o playground é a configuração recomendada para desenvolver a biblioteca e reproduzir bugs, embora não seja recomendado para a implantação do seu aplicativo usando o Podofo. Dê uma olhada no ReadMe lá.
Aviso : o Podofo é conhecido por trabalhar em cadeias de ferramentas de compilação cruzada (por exemplo, desenvolvimento do Android/iOS), mas o suporte pode não ser fornecido em tais cenários. Se você decidir criar manualmente dependências, supõe -se que saiba como identidade possíveis confrontos/incompatibilidades da biblioteca e como lidar com problemas de compilação/vinculação que podem surgir no seu sistema.
Da execução da raiz da fonte:
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
Instale a Brew, depois a partir da execução da raiz de origem:
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
Instale Conan, depois da ROOT ROOT ORON:
mkdir build
cd build
conan install ..
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
Siga o guia VCPKG QuickStart para configurar o repositório do gerenciador de pacotes primeiro. No Windows, também pode ser útil definir a variável de ambiente VCPKG_DEFAULT_TRIPLET como x64-windows para padrão instalar dependências de 64 bits e definir uma variável VCPKG_INSTALLATION_ROOT com a localização do repositório, conforme criado no Quickstart.
Então da ROOT ROOT ORONCE:
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 : construir os testes de unidade, padrão para true;
PODOFO_BUILD_EXAMPLES : construa os exemplos, padrão para true;
PODOFO_BUILD_UNSUPPORTED_TOOLS : construa as ferramentas do podofo, padrão para false. Veja a seção relevante no ReadMe;
PODOFO_BUILD_LIB_ONLY : se true, ele criará apenas o componente da biblioteca. Isso desabilita incondicionalmente testes, exemplos e ferramentas;
PODOFO_BUILD_STATIC : se true, construa a biblioteca como um objeto estático e use -o em testes, exemplos e ferramentas. Por padrão, uma biblioteca compartilhada é construída.
Se você deseja usar uma construção estática do Podofo e está incluindo o projeto Podofo CMake, é muito simples. Faça algo como o seguinte em seu projeto 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)
Se você estiver ligando contra uma construção estática pré -compilada do Podofo, este é um cenário em que o suporte é limitado, pois você realmente deve ser capaz de identificar e corrigir erros de vinculação. As etapas gerais são:
PODOFO_STATIC ao seu projeto, ou antes de incluir podofo.h ;podofo.a , podofo_private.a (ou podofo.lib , podofo_private.lib com MSVC) e todas as bibliotecas dependentes. A documentação da API pode ser encontrada em https://podofo.github.io/podofo/documentation/.
Pré -requisito : verifique se você tem doxygen instalado em sua máquina. Caso contrário, visite o site oficial da Doxygen para baixá -lo e instalá -lo.
Gerando documentação : Após concluir o processo de compilação detalhado no capítulo do Development QuickStart, navegue até o diretório raiz do código -fonte do Podofo. Abra um terminal ou prompt de comando e execute o seguinte comando:
doxygen build/Doxyfile Visualizando a documentação : Após a conclusão da geração de documentação, você encontrará um diretório documentation que contém a documentação gerada. Open index.html em seu navegador favorito para visualizar a documentação da API.
cd build/doxygen/documentation
open index.html Todas std::strings ou std::string_view na biblioteca destinam-se a manter o conteúdo da String codificada UTF-8. Os construtores PdfString e PdfName aceitam strings codificados UTF-8 por padrão (no entanto, PdfName aceita caracteres apenas no conjunto de char PdfDocEncoding ). charbuff Abd bufferview representa um buffer de octeto genérico.
O Podofo possui uma API instável que é o resultado de uma extensa revisão da API do PodOFO 0.9.x. Neste link, você pode encontrar um guia incompleto sobre a migração de 0,9.8 código para 0,10.0. Espera -se que o Podofo converja para uma API estável assim que o processo de revisão for concluído. Veja a estabilidade da API para obter mais detalhes.
AVISO : Atualmente, as ferramentas não são suportadas, não testadas e sem manutenção .
As ferramentas de podofo ainda estão disponíveis na árvore de origem, mas sua compilação é desativada por padrão porque não é definida/sem manutenção e não receberá suporte até que seu status seja limpo. Não é recomendável incluí -los em distribuições de software. Se você deseja construí -los, certifique -se de inicializar o projeto CMake com -DPODOFO_BUILD_UNSUPPORTED_TOOLS=TRUE . As ferramentas estão convenientemente ativadas no playground, pelo menos para garantir que as alterações da biblioteca não quebrem sua compilação.
Há uma lista de tarefas ou observe o rastreador de edição.
P: Como assino um documento?
R: O Podofo Head agora fornece um procedimento de assinatura de alto nível que é muito poderoso e permite assinar um documento sem precisar fornecer uma estrutura CMS manualmente. Por padrão, ele suporta a assinatura de um documento com os perfis modernos de conformidade PAdES-B , mas também há um suporte para as assinaturas Legacy PKCS7. Desde que você tenha o certificado X509 codificado ASN.1 e a chave privada da RSA, você pode assinar um documento com o seguinte código:
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);Há também um suporte para serviços de assinatura externa e/ou assinando o documento em buffers de memória. Veja os vários exemplos de assinatura nos testes de unidade.
P: Ainda posso usar um procedimento baseado em evento para assinar o documento?
Sim, o procedimento de baixo nível antigo não mudou e ainda está disponível. Para descrever o procedimento brevemente, é preciso implementar totalmente um PdfSigner , recuperar ou criar um campo PdfSignature , criar um dispositivo de saída (consulte a próxima pergunta) e use PoDoFo::SignDocument(doc, device, signer, signature) . Ao assinar, a sequência de chamadas de PdfSignature funciona dessa maneira: Method PdfSigner::Reset() é chamado primeiro, depois o PdfSigner::ComputeSignature(buffer, dryrun) é chamado com um buffer vazio e o argumento dryrun definido como true . Nesta chamada, pode -se redimensionar o buffer superestimando o tamanho necessário para a assinatura ou apenas calcular uma assinatura falsa que deve ser salva no buffer. Em seguida, uma sequência de PdfSigner::AppendData(buffer) é chamada, recebendo todos os dados do documento a serem assinados. Um PdfSigner::ComputeSignature(buffer, dryrun) é chamado, com o parâmetro dryrun definido como false . O buffer nesta chamada é limpo (a capacidade não é alterada) ou, de acordo com o valor do PdfSigner::SkipBufferClear() .
P: PdfMemDocument::SaveUpdate() ou PoDoFo::SignDocument() Escreva apenas um arquivo parcial: Por que não há mecanismo para lidar perfeitamente com a atualização incremental como estava no podofo 0.9.x? O que deve ser feito para atualizar/assinar corretamente o documento?
R: O mecanismo anterior no Podofo 0.9.x exigiu a ativação do documento para atualizações incrementais, que é uma etapa de decisão que acredito que deve ser desnecessária. Também:
Uma estratégia alternativa que torna mais claro o fato de que a atualização incremental deve ser executada no mesmo arquivo de onde o documento foi carregado ou que o buffer subjacente aumentará seu consumo de memórias após operações subsequentes em caso de documentos carregados de buffer, está disponível. Segue alguns exemplos mostrando as operações corretas para atualizar um documento, carregado de arquivo ou buffer:
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);Os documentos de assinatura podem ser feitos com a mesma técnica, leia as outras perguntas para obter mais exemplos.
P: Posso assinar um documento pela segunda vez?
R: Sim, isso é testado, mas para garantir que isso funcione, você fará novamente o documento pela segunda vez, pois reutilizar o documento já carregado ainda não é testado (isso pode mudar mais tarde). Por exemplo, você pode fazer o que se segue:
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);
}O Podofo pode ou não funcionar para suas necessidades e vem com absolutamente nenhuma garantia. Bugs graves, incluindo falhas de segurança, podem ser corrigidos em prazos arbitrários, ou não corrigidos. A prioridade da implementação de novos recursos e a correção de bugs é decidida de acordo com os interesses e as preferências pessoais dos mantenedores. Se você precisar de podofo para integrar um recurso ou correção de bugs que é fundamental para o seu fluxo de trabalho, a abordagem mais bem-vinda e rápida é contribuir com patches de alta qualidade.
Por favor, assine a lista de discussão do projeto, que ainda é seguida por vários desenvolvedores originais do Podofo. Também foi criada uma comunidade de gitores para facilitar algumas conversas mais informais. Se você encontrar um bug e saber como corrigi -lo, ou deseja adicionar um pequeno recurso, poderá enviar uma solicitação de tração, desde que ele segue o estilo de codificação do projeto. Como um requisito mínimo, qualquer contribuição deve ser:
Outras razões para a rejeição, ou Hold, de uma solicitação de tração podem ser:
Se você precisar implementar um recurso ou refator maior, pergunte primeiro se ele já foi planejado. O recurso pode estar em disputa, o que significa que está aberto para contribuições externas. Escreva na questão relevante que você começou a trabalhar nisso, para receber algum feedback/coordenação. Caso contrário, significa que o refattor/recurso está planejado para ser implementado posteriormente pelo (s) mantenedor (s). Se o recurso não estiver listado nos problemas, adicione -o e/ou crie uma discussão para receber algum feedback e discutir algumas opções básicas de design.
AVISO : Por favor, não use endereços de email pessoais para obter informações sobre suporte técnico, mas crie problemas do GitHub.
O Podofo é atualmente desenvolvido e mantido por Francesco Pretto, juntamente com Dominik Seichter e outros. Consulte o arquivo autores.md para obter mais detalhes.