FOSSredder 0.5.0
Loading...
Searching...
No Matches
PopplerPdfRendererAdapter.cpp
Go to the documentation of this file.
1
5
6#include "pdf-rendering/pch.h"
12#include <nlohmann/json.hpp>
13#include <chrono>
14#include <fstream>
15#include <iterator>
16#include <filesystem>
17#include <sstream>
18
20 public:
21 PopplerPdfRendererAdapter(std::shared_ptr<core::ports::diagnostics::IDiagnostics> dbg = nullptr) : debugger(std::move(dbg)) {}
22
23 void writeDebugTextSafe(const std::string& path, const std::string& text) const {
24 if (!debugger || !debugger->enabled()) return;
25 try {
26 debugger->writeText(path, text);
27 } catch (...) {
28 return;
29 }
30 }
31
34 try {
35 writeDebugTextSafe("poppler/log", std::string("render:start ") + req.pdfPath.string());
36
37 auto t0 = std::chrono::steady_clock::now();
38 auto pages = PopplerCore::renderDocument(req.pdfPath.string(), req.dpi, req.outputDir, req.uniqIdPrefix, req.filePrefix, debugger, req.cancelFlag);
39 auto t1 = std::chrono::steady_clock::now();
40 std::chrono::duration<double> dur = t1 - t0;
41
42 out.images.clear();
43 out.imageBytes.clear();
44 out.images.reserve(pages.size());
45 out.imageBytes.reserve(pages.size());
46 for (const auto& p : pages) {
47 out.images.push_back(p.imagePath.empty() ? std::filesystem::path() : std::filesystem::path(p.imagePath));
48 out.imageBytes.push_back(p.imageBytes);
49 }
50
51 std::ostringstream oss;
52 oss << "render:done " << req.pdfPath.string() << " pages=" << out.images.size() << " duration=" << dur.count();
53 writeDebugTextSafe("poppler/log", oss.str());
54 } catch (const std::exception& ex) {
55 writeDebugTextSafe("poppler/log", std::string("render:error ") + ex.what());
56 throw;
57 }
58 return out;
59 }
60
63 try {
64 writeDebugTextSafe("poppler/log", std::string("extract:start ") + req.pdfPath.string());
65 auto t0 = std::chrono::steady_clock::now();
66 auto pages = PopplerCore::extractDocumentMeta(req.pdfPath.string(), req.dpi, req.outputDir, req.uniqIdPrefix, req.filePrefix, debugger, req.cancelFlag);
67 auto t1 = std::chrono::steady_clock::now();
68 std::chrono::duration<double> dur = t1 - t0;
69
70 out.pages = std::move(pages);
71
72 std::ostringstream oss;
73 oss << "extract:done " << req.pdfPath.string() << " pages=" << out.pages.size() << " duration=" << dur.count();
74 writeDebugTextSafe("poppler/log", oss.str());
75 } catch (const std::exception& ex) {
76 writeDebugTextSafe("poppler/log", std::string("extract:error ") + ex.what());
77 throw;
78 }
79 return out;
80 }
81
82 private:
83 std::shared_ptr<core::ports::diagnostics::IDiagnostics> debugger;
84};
85
86std::shared_ptr<core::ports::pdf_rendering::IPdfRenderer> createPdfRendererAdapter(std::shared_ptr<core::ports::diagnostics::IDiagnostics> debugger) {
87 return std::make_shared<PopplerPdfRendererAdapter>(std::move(debugger));
88}
89
Declares the diagnostics artifact writing port.
PDF rendering port for import workflows.
Request types for PDF rendering operations.
Result types for PDF rendering operations.
Declares the Poppler implementation helpers used by the import workflow.
std::shared_ptr< core::ports::pdf_rendering::IPdfRenderer > createPdfRendererAdapter(std::shared_ptr< core::ports::diagnostics::IDiagnostics > debugger)
static std::vector< core::ports::pdf_rendering::RenderedPage > renderDocument(const std::string &path, double dpi, const std::filesystem::path &outputDir=std::filesystem::path(), const std::string &uniqIdPrefix="", const std::string &filePrefix="", std::shared_ptr< core::ports::diagnostics::IDiagnostics > dbg=nullptr, std::shared_ptr< std::atomic< bool > > cancelFlag=nullptr)
Extracts document metadata and page text elements from a PDF file.
static std::vector< core::ports::pdf_rendering::RenderedPage > extractDocumentMeta(const std::string &path, double dpi, const std::filesystem::path &outputDir=std::filesystem::path(), const std::string &uniqIdPrefix="", const std::string &filePrefix="", std::shared_ptr< core::ports::diagnostics::IDiagnostics > dbg=nullptr, std::shared_ptr< std::atomic< bool > > cancelFlag=nullptr)
Extracts page metadata without rendering the page bitmap.
core::ports::pdf_rendering::ExtractResult extract(const core::ports::pdf_rendering::ExtractRequest &req) override
Extracts page content from a PDF.
core::ports::pdf_rendering::RenderResult render(const core::ports::pdf_rendering::RenderRequest &req) override
Renders a PDF into images.
PopplerPdfRendererAdapter(std::shared_ptr< core::ports::diagnostics::IDiagnostics > dbg=nullptr)
void writeDebugTextSafe(const std::string &path, const std::string &text) const
Renders and extracts PDF content.
Precompiled header for the pdf-rendering infrastructure module.
std::shared_ptr< std::atomic< bool > > cancelFlag
std::shared_ptr< std::atomic< bool > > cancelFlag
std::vector< std::vector< uint8_t > > imageBytes
std::vector< std::filesystem::path > images