除了 Cairo,还有其他库可以用来将图像输出为 PDF,并设置分辨率。常用的库之一是 **PoDoFo** 和 **Poppler**。不过,如果您需要相对简单的解决方案,我建议使用 **libharu**,它是一个轻量级且易于使用的 PDF 库。
下面是一个使用 libharu 库将二值图像输出为 PDF 的示例:
### 使用 libharu 库
1. **安装 libharu**:首先,下载并安装 libharu。可以在其 [GitHub页面](https://github.com/libharu/libharu)上找到相关信息。
2. **使用 libharu 创建 PDF**:
#include <hpdf.h>
#include <opencv2/opencv.hpp>
#include <iostream>
void error_handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void *user_data) {
std::cerr << "Error: " << std::hex << error_no << ", detail: " << detail_no << std::endl;
}
void saveImageAsPDF(const cv::Mat& image, const std::string& filename, int dpi) {
// 初始化 libharu
HPDF_Doc pdf = HPDF_New(error_handler, nullptr);
if (!pdf) {
std::cerr << "Failed to create PDF object." << std::endl;
return;
}
// 创建页面
HPDF_Page page = HPDF_AddPage(pdf);
HPDF_Page_SetWidth(page, image.cols * 72.0 / dpi);
HPDF_Page_SetHeight(page, image.rows * 72.0 / dpi);
// 遍历图像并绘制
for (int y = 0; y < image.rows; ++y) {
for (int x = 0; x < image.cols; ++x) {
uchar pixel = image.at<uchar>(y, x);
double gray = pixel / 255.0;
HPDF_Page_SetRGBFill(page, gray, gray, gray);
HPDF_Page_Rectangle(page, x * 72.0 / dpi, (image.rows - y - 1) * 72.0 / dpi, 1 * 72.0 / dpi, 1 * 72.0 / dpi);
HPDF_Page_Fill(page);
}
}
// 保存 PDF
HPDF_SaveToFile(pdf, filename.c_str());
HPDF_Free(pdf);
}
int main() {
cv::Mat image = cv::imread("binary_image.png", cv::IMREAD_GRAYSCALE);
if (image.empty()) {
std::cerr << "Failed to load image." << std::endl;
return -1;
}
saveImageAsPDF(image, "output.pdf", 1200);
return 0;
}
### 注意事项:
- 确保图像是二值的,这样可以在 PDF 中保持简单。
- `libharu`默认情况下不支持压缩。如果需要压缩功能,可能需要手动实现压缩或考虑其他库。
- 使用上述代码时,请确保正确配置OpenCV和libharu的开发环境。
这将帮助您将二值图像转换为具有特定DPI的PDF。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |