| Index: samples/pdfium_test.cc
|
| diff --git a/samples/pdfium_test.cc b/samples/pdfium_test.cc
|
| index f8e567349beb0ba8c98450dbaef88894fb7ee014..9a6513dc101080c89f2a9d6d439d4ecbb0745754 100644
|
| --- a/samples/pdfium_test.cc
|
| +++ b/samples/pdfium_test.cc
|
| @@ -22,8 +22,19 @@
|
| #define snprintf _snprintf
|
| #endif
|
|
|
| -static void WritePpm(const char* pdf_name, int num,
|
| - const char* buffer, int stride, int width, int height) {
|
| +enum OutputFormat {
|
| + OUTPUT_NONE,
|
| + OUTPUT_PPM,
|
| +#ifdef _WIN32
|
| + OUTPUT_BMP,
|
| + OUTPUT_EMF,
|
| +#endif
|
| +};
|
| +
|
| +static void WritePpm(const char* pdf_name, int num, const void* buffer_void,
|
| + int stride, int width, int height) {
|
| + const char* buffer = reinterpret_cast<const char*>(buffer_void);
|
| +
|
| if (stride < 0 || width < 0 || height < 0)
|
| return;
|
| if (height > 0 && width > INT_MAX / height)
|
| @@ -61,6 +72,68 @@ static void WritePpm(const char* pdf_name, int num,
|
| fclose(fp);
|
| }
|
|
|
| +#ifdef _WIN32
|
| +static void WriteBmp(const char* pdf_name, int num, const void* buffer,
|
| + int stride, int width, int height) {
|
| + if (stride < 0 || width < 0 || height < 0)
|
| + return;
|
| + if (height > 0 && width > INT_MAX / height)
|
| + return;
|
| + int out_len = stride * height;
|
| + if (out_len > INT_MAX / 3)
|
| + return;
|
| +
|
| + char filename[256];
|
| + snprintf(filename, sizeof(filename), "%s.%d.bmp", pdf_name, num);
|
| + FILE* fp = fopen(filename, "wb");
|
| + if (!fp)
|
| + return;
|
| +
|
| + BITMAPINFO bmi = {0};
|
| + bmi.bmiHeader.biSize = sizeof(bmi) - sizeof(RGBQUAD);
|
| + bmi.bmiHeader.biWidth = width;
|
| + bmi.bmiHeader.biHeight = -height; // top-down image
|
| + bmi.bmiHeader.biPlanes = 1;
|
| + bmi.bmiHeader.biBitCount = 32;
|
| + bmi.bmiHeader.biCompression = BI_RGB;
|
| + bmi.bmiHeader.biSizeImage = 0;
|
| +
|
| + BITMAPFILEHEADER file_header = {0};
|
| + file_header.bfType = 0x4d42;
|
| + file_header.bfSize = sizeof(file_header) + bmi.bmiHeader.biSize + out_len;
|
| + file_header.bfOffBits = file_header.bfSize - out_len;
|
| +
|
| + fwrite(&file_header, sizeof(file_header), 1, fp);
|
| + fwrite(&bmi, bmi.bmiHeader.biSize, 1, fp);
|
| + fwrite(buffer, out_len, 1, fp);
|
| + fclose(fp);
|
| +}
|
| +
|
| +void WriteEmf(FPDF_PAGE page, const char* pdf_name, int num) {
|
| + int width = static_cast<int>(FPDF_GetPageWidth(page));
|
| + int height = static_cast<int>(FPDF_GetPageHeight(page));
|
| +
|
| + char filename[256];
|
| + snprintf(filename, sizeof(filename), "%s.%d.emf", pdf_name, num);
|
| +
|
| + HDC dc = CreateEnhMetaFileA(NULL, filename, NULL, NULL);
|
| +
|
| + HRGN rgn = CreateRectRgn(0, 0, width, height);
|
| + SelectClipRgn(dc, rgn);
|
| + DeleteObject(rgn);
|
| +
|
| + SelectObject(dc, GetStockObject(NULL_PEN));
|
| + SelectObject(dc, GetStockObject(WHITE_BRUSH));
|
| + // If a PS_NULL pen is used, the dimensions of the rectangle are 1 pixel less.
|
| + Rectangle(dc, 0, 0, width + 1, height + 1);
|
| +
|
| + FPDF_RenderPage(dc, page, 0, 0, width, height, 0,
|
| + FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH);
|
| +
|
| + DeleteEnhMetaFile(CloseEnhMetaFile(dc));
|
| +}
|
| +#endif
|
| +
|
| int Form_Alert(IPDF_JSPLATFORM*, FPDF_WIDESTRING, FPDF_WIDESTRING, int, int) {
|
| printf("Form_Alert called.\n");
|
| return 0;
|
| @@ -110,15 +183,21 @@ void Unsupported_Handler(UNSUPPORT_INFO*, int type) {
|
| printf("Unsupported feature: %s.\n", feature.c_str());
|
| }
|
|
|
| -bool ParseCommandLine(int argc, const char* argv[], bool* write_images,
|
| +bool ParseCommandLine(int argc, const char* argv[], OutputFormat* output_format,
|
| std::list<const char*>* files) {
|
| - *write_images = false;
|
| + *output_format = OUTPUT_NONE;
|
| files->clear();
|
|
|
| int cur_arg = 1;
|
| - if (cur_arg < argc &&
|
| - strcmp(argv[cur_arg], "--write_images") == 0) {
|
| - *write_images = true;
|
| + if (cur_arg < argc) {
|
| + if (strcmp(argv[cur_arg], "--ppm") == 0)
|
| + *output_format = OUTPUT_PPM;
|
| +#ifdef _WIN32
|
| + if (strcmp(argv[cur_arg], "--emf") == 0)
|
| + *output_format = OUTPUT_EMF;
|
| + if (strcmp(argv[cur_arg], "--bmp") == 0)
|
| + *output_format = OUTPUT_BMP;
|
| +#endif
|
| cur_arg++;
|
| }
|
|
|
| @@ -159,7 +238,7 @@ void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {
|
| }
|
|
|
| void RenderPdf(const char* name, const char* pBuf, size_t len,
|
| - bool write_images) {
|
| + OutputFormat format) {
|
| printf("Rendering PDF file %s.\n", name);
|
|
|
| IPDF_JSPLATFORM platform_callbacks;
|
| @@ -234,11 +313,25 @@ void RenderPdf(const char* name, const char* pBuf, size_t len,
|
|
|
| FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0);
|
| FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, 0);
|
| - if (write_images) {
|
| - const char* buffer = reinterpret_cast<const char*>(
|
| - FPDFBitmap_GetBuffer(bitmap));
|
| - int stride = FPDFBitmap_GetStride(bitmap);
|
| - WritePpm(name, i, buffer, stride, width, height);
|
| + int stride = FPDFBitmap_GetStride(bitmap);
|
| + const char* buffer =
|
| + reinterpret_cast<const char*>(FPDFBitmap_GetBuffer(bitmap));
|
| +
|
| + switch (format) {
|
| +#ifdef _WIN32
|
| + case OUTPUT_BMP:
|
| + WriteBmp(name, i, buffer, stride, width, height);
|
| + break;
|
| +
|
| + case OUTPUT_EMF:
|
| + WriteEmf(page, name, i);
|
| + break;
|
| +#endif
|
| + case OUTPUT_PPM:
|
| + WritePpm(name, i, buffer, stride, width, height);
|
| + break;
|
| + default:
|
| + break;
|
| }
|
|
|
| FPDFBitmap_Destroy(bitmap);
|
| @@ -259,11 +352,15 @@ void RenderPdf(const char* name, const char* pBuf, size_t len,
|
|
|
| int main(int argc, const char* argv[]) {
|
| v8::V8::InitializeICU();
|
| - bool write_images = false;
|
| + OutputFormat format = OUTPUT_NONE;
|
| std::list<const char*> files;
|
| - if (!ParseCommandLine(argc, argv, &write_images, &files)) {
|
| - printf("Usage is: test [--write_images] /path/to/pdf\n");
|
| - printf("--write_images - to write page images <pdf-name>.<page-number>.ppm\n");
|
| + if (!ParseCommandLine(argc, argv, &format, &files)) {
|
| + printf("Usage: pdfium_test [OPTIONS] [FILE]\n");
|
| + printf("--ppm write page images <pdf-name>.<page-number>.ppm\n");
|
| +#ifdef _WIN32
|
| + printf("--bmp write page images <pdf-name>.<page-number>.bmp\n");
|
| + printf("--emf write page meta files <pdf-name>.<page-number>.emf\n");
|
| +#endif
|
| return 1;
|
| }
|
|
|
| @@ -293,7 +390,7 @@ int main(int argc, const char* argv[]) {
|
| if (ret != len) {
|
| fprintf(stderr, "Failed to read: %s\n", filename);
|
| } else {
|
| - RenderPdf(filename, pBuf, len, write_images);
|
| + RenderPdf(filename, pBuf, len, format);
|
| }
|
| free(pBuf);
|
| }
|
| @@ -302,4 +399,3 @@ int main(int argc, const char* argv[]) {
|
|
|
| return 0;
|
| }
|
| -
|
|
|