84 lines
2.2 KiB
C++
84 lines
2.2 KiB
C++
#pragma once
|
|
|
|
#include <expected>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <cstdint>
|
|
|
|
namespace pdfengine {
|
|
|
|
enum class EngineError {
|
|
FileNotFound,
|
|
InvalidFormat,
|
|
PasswordRequired,
|
|
InvalidPassword,
|
|
PageOutOfBounds,
|
|
RenderFailed,
|
|
WriteFailed,
|
|
Unknown
|
|
};
|
|
|
|
struct DocumentMetadata {
|
|
std::string title;
|
|
std::string author;
|
|
std::string creator;
|
|
std::string producer;
|
|
std::string creationDate;
|
|
std::string modificationDate;
|
|
};
|
|
|
|
struct PageImage {
|
|
int width;
|
|
int height;
|
|
std::vector<uint8_t> data;
|
|
};
|
|
|
|
struct Point2D {
|
|
double x;
|
|
double y;
|
|
};
|
|
|
|
struct DevicePoint {
|
|
int x;
|
|
int y;
|
|
};
|
|
|
|
class PdfPage {
|
|
public:
|
|
virtual ~PdfPage() = default;
|
|
|
|
[[nodiscard]] virtual double width() const noexcept = 0;
|
|
[[nodiscard]] virtual double height() const noexcept = 0;
|
|
|
|
[[nodiscard]] virtual std::expected<PageImage, EngineError> render(int dpi = 96) const = 0;
|
|
|
|
[[nodiscard]] virtual std::expected<std::string, EngineError> extractText() const = 0;
|
|
|
|
[[nodiscard]] virtual DevicePoint pageToDevice(const Point2D& pagePoint, int deviceWidth, int deviceHeight, int rotate = 0) const noexcept = 0;
|
|
[[nodiscard]] virtual Point2D deviceToPage(const DevicePoint& devicePoint, int deviceWidth, int deviceHeight, int rotate = 0) const noexcept = 0;
|
|
};
|
|
|
|
class PdfDocument {
|
|
public:
|
|
virtual ~PdfDocument() = default;
|
|
|
|
[[nodiscard]] static std::expected<std::shared_ptr<PdfDocument>, EngineError>
|
|
loadFromFile(const std::string& path, const std::string& password = "");
|
|
|
|
[[nodiscard]] static std::expected<std::shared_ptr<PdfDocument>, EngineError>
|
|
loadFromMemory(const std::vector<uint8_t>& data, const std::string& password = "");
|
|
|
|
[[nodiscard]] virtual int pageCount() const noexcept = 0;
|
|
[[nodiscard]] virtual DocumentMetadata metadata() const noexcept = 0;
|
|
|
|
[[nodiscard]] virtual std::expected<std::shared_ptr<PdfPage>, EngineError>
|
|
getPage(int pageIndex) = 0;
|
|
|
|
virtual std::expected<void, EngineError> applyEdits(const std::string& editsJson) = 0;
|
|
|
|
[[nodiscard]] virtual std::expected<std::vector<uint8_t>, EngineError>
|
|
saveIncremental() const = 0;
|
|
};
|
|
|
|
} |