Criar Documento PDF
Estamos sempre procurando uma maneira de gerar documentos PDF e trabalhar com eles em projetos C++ de forma mais exata, precisa e eficaz. Ter funções fáceis de usar de uma biblioteca nos permite focar mais no trabalho, e menos nos detalhes demorados de tentar gerar PDFs, seja em C++.
Gerar PDF usando C++
A API Aspose.PDF para C++ permite criar e ler arquivos PDF usando C++. A API pode ser utilizada em uma variedade de aplicações C++ incluindo WinForms, e várias outras. Neste artigo, vamos mostrar como usar a API Aspose.PDF para C++ para facilmente gerar e ler arquivos PDF em aplicações C++.
Como Criar um Arquivo PDF Simples
Para criar um arquivo PDF usando C++, os seguintes passos podem ser usados.
- Crie um objeto da classe Document
- Adicione um objeto Page à coleção ‘Pages’ do objeto Document
- Adicione TextFragment à coleção Paragraphs da página
- Salve o documento PDF resultante
using namespace System;
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Text;
void CreateDocument() {
// String para nome do caminho.
String _dataDir("C:\\Samples\\");
// String para nome do arquivo.
String outputFileName("HelloWorld_out.pdf");
auto document = MakeObject<Document>();
auto page = document->get_Pages()->Add();
// Adicione texto à nova página
auto text = MakeObject<TextFragment>(u"Hello world!");
auto paragraphs = page->get_Paragraphs();
paragraphs->Add(text);
// Salve o PDF atualizado
document->Save(_dataDir + outputFileName);
}
Criar um documento PDF pesquisável
Aspose.PDF para C++ permite que você crie PDFs do zero e manipule os existentes. Quando você adiciona elementos de texto a um PDF, o PDF resultante é pesquisável. No entanto, se convertermos uma imagem contendo texto para um arquivo PDF, o conteúdo dentro do PDF não é pesquisável. No entanto, como solução alternativa, podemos usar OCR no arquivo resultante para torná-lo pesquisável. Portanto, primeiro você precisa instalar o Tesseract-OCR no seu sistema, e você terá um aplicativo de console tesseract.
Segue o código completo para atender a esse requisito:
void CreateSearchableDocument() {
// String para nome do caminho.
String _dataDir("C:\\Samples\\");
// String para nome do arquivo.
String inputFileName("sample.pdf");
auto document = MakeObject<Document>(inputFileName);
bool convertResult = false;
try
{
convertResult = document->Convert(CallBackGetHocr);
}
catch (Exception ex)
{
std::cerr << ex->get_Message() << std::endl;
}
document->Dispose();
}
static String CallBackGetHocr(System::SharedPtr<System::Drawing::Image> img)
{
String tmpFile = System::IO::Path::GetTempFileNameSafe();
auto bmp = MakeObject<System::Drawing::Bitmap>(img);
bmp->Save(tmpFile, System::Drawing::Imaging::ImageFormat::get_Bmp());
String inputFile = String::Format(u"\"{0}\"", tmpFile);
String outputFile = String::Format(u"\"{0}\"", tmpFile);
String arguments = inputFile + u" " + outputFile + u" -l eng hocr";
String tesseractProcessName = u"C:\\Program Files\\Tesseract-OCR\\Tesseract.exe";
auto psi = MakeObject<System::Diagnostics::ProcessStartInfo>(tesseractProcessName, arguments);
psi->set_UseShellExecute(true);
psi->set_CreateNoWindow(true);
psi->set_WindowStyle(System::Diagnostics::ProcessWindowStyle::Hidden);
psi->set_WorkingDirectory(System::IO::Path::GetDirectoryName(tesseractProcessName));
auto p = MakeObject<System::Diagnostics::Process>(psi);
p->Start();
p->WaitForExit();
auto streamReader = MakeObject<System::IO::StreamReader>(tmpFile + u".hocr");
String text = streamReader->ReadToEnd();
streamReader->Close();
if (System::IO::File::Exists(tmpFile))
System::IO::File::Delete(tmpFile);
if (System::IO::File::Exists(tmpFile + u".hocr"))
System::IO::File::Delete(tmpFile + u".hocr");
return text;
}