1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <limits.h> 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <stdio.h> 7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <stdlib.h> 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <string.h> 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <list> 11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <sstream> 12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <string> 13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <utility> 14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <vector> 15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "image_diff_png.h" 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdf_dataavail.h" 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdf_edit.h" 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdf_ext.h" 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdf_formfill.h" 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdf_text.h" 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdfview.h" 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "testing/test_support.h" 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_V8 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "v8/include/libplatform/libplatform.h" 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "v8/include/v8.h" 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // PDF_ENABLE_V8 29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef _WIN32 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define snprintf _snprintf 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovenum OutputFormat { 35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OUTPUT_NONE, 36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OUTPUT_PPM, 37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OUTPUT_PNG, 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef _WIN32 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OUTPUT_BMP, 40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OUTPUT_EMF, 41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct Options { 45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov Options() : output_format(OUTPUT_NONE) { } 46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OutputFormat output_format; 48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov std::string scale_factor_as_string; 49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov std::string exe_path; 50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov std::string bin_directory; 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::string font_directory; 52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic bool CheckDimensions(int stride, int width, int height) { 55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (stride < 0 || width < 0 || height < 0) 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return false; 57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (height > 0 && width > INT_MAX / height) 58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return false; 59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return true; 60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic void WritePpm(const char* pdf_name, int num, const void* buffer_void, 63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int stride, int width, int height) { 64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const char* buffer = reinterpret_cast<const char*>(buffer_void); 65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!CheckDimensions(stride, width, height)) 67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int out_len = width * height; 70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (out_len > INT_MAX / 3) 71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov out_len *= 3; 73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov char filename[256]; 75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov snprintf(filename, sizeof(filename), "%s.%d.ppm", pdf_name, num); 76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FILE* fp = fopen(filename, "wb"); 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!fp) 78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(fp, "P6\n# PDF test render\n%d %d\n255\n", width, height); 80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov // Source data is B, G, R, unused. 81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov // Dest data is R, G, B. 82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov char* result = new char[out_len]; 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int h = 0; h < height; ++h) { 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const char* src_line = buffer + (stride * h); 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann char* dest_line = result + (width * h * 3); 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int w = 0; w < width; ++w) { 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // R 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_line[w * 3] = src_line[(w * 4) + 2]; 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // G 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_line[(w * 3) + 1] = src_line[(w * 4) + 1]; 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // B 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_line[(w * 3) + 2] = src_line[w * 4]; 93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fwrite(result, out_len, 1, fp); 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete[] result; 97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fclose(fp); 98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic void WritePng(const char* pdf_name, int num, const void* buffer_void, 101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int stride, int width, int height) { 102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!CheckDimensions(stride, width, height)) 103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov std::vector<unsigned char> png_encoding; 106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const unsigned char* buffer = static_cast<const unsigned char*>(buffer_void); 107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!image_diff_png::EncodeBGRAPNG( 108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov buffer, width, height, stride, false, &png_encoding)) { 109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Failed to convert bitmap to PNG\n"); 110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov char filename[256]; 114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int chars_formatted = snprintf( 115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov filename, sizeof(filename), "%s.%d.png", pdf_name, num); 116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (chars_formatted < 0 || 117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov static_cast<size_t>(chars_formatted) >= sizeof(filename)) { 118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Filname %s is too long\n", filename); 119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FILE* fp = fopen(filename, "wb"); 123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!fp) { 124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Failed to open %s for output\n", filename); 125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov size_t bytes_written = fwrite( 129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &png_encoding.front(), 1, png_encoding.size(), fp); 130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bytes_written != png_encoding.size()) 131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Failed to write to %s\n", filename); 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (void)fclose(fp); 134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef _WIN32 137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic void WriteBmp(const char* pdf_name, int num, const void* buffer, 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int stride, int width, int height) { 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!CheckDimensions(stride, width, height)) 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int out_len = stride * height; 143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (out_len > INT_MAX / 3) 144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov char filename[256]; 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov snprintf(filename, sizeof(filename), "%s.%d.bmp", pdf_name, num); 148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FILE* fp = fopen(filename, "wb"); 149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!fp) 150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann BITMAPINFO bmi = {}; 153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bmi.bmiHeader.biSize = sizeof(bmi) - sizeof(RGBQUAD); 154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bmi.bmiHeader.biWidth = width; 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bmi.bmiHeader.biHeight = -height; // top-down image 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bmi.bmiHeader.biPlanes = 1; 157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bmi.bmiHeader.biBitCount = 32; 158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bmi.bmiHeader.biCompression = BI_RGB; 159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bmi.bmiHeader.biSizeImage = 0; 160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann BITMAPFILEHEADER file_header = {}; 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov file_header.bfType = 0x4d42; 163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov file_header.bfSize = sizeof(file_header) + bmi.bmiHeader.biSize + out_len; 164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov file_header.bfOffBits = file_header.bfSize - out_len; 165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fwrite(&file_header, sizeof(file_header), 1, fp); 167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fwrite(&bmi, bmi.bmiHeader.biSize, 1, fp); 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fwrite(buffer, out_len, 1, fp); 169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fclose(fp); 170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid WriteEmf(FPDF_PAGE page, const char* pdf_name, int num) { 173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int width = static_cast<int>(FPDF_GetPageWidth(page)); 174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int height = static_cast<int>(FPDF_GetPageHeight(page)); 175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov char filename[256]; 177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov snprintf(filename, sizeof(filename), "%s.%d.emf", pdf_name, num); 178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann HDC dc = CreateEnhMetaFileA(nullptr, filename, nullptr, nullptr); 180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov HRGN rgn = CreateRectRgn(0, 0, width, height); 182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov SelectClipRgn(dc, rgn); 183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov DeleteObject(rgn); 184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov SelectObject(dc, GetStockObject(NULL_PEN)); 186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov SelectObject(dc, GetStockObject(WHITE_BRUSH)); 187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov // If a PS_NULL pen is used, the dimensions of the rectangle are 1 pixel less. 188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov Rectangle(dc, 0, 0, width + 1, height + 1); 189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_RenderPage(dc, page, 0, 0, width, height, 0, 191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); 192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov DeleteEnhMetaFile(CloseEnhMetaFile(dc)); 194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint ExampleAppAlert(IPDF_JSPLATFORM*, FPDF_WIDESTRING msg, FPDF_WIDESTRING, 198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int, int) { 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::wstring platform_string = GetPlatformWString(msg); 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann printf("Alert: %ls\n", platform_string.c_str()); 201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 0; 202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid ExampleDocGotoPage(IPDF_JSPLATFORM*, int pageNumber) { 205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov printf("Goto Page: %d\n", pageNumber); 206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid ExampleUnsupportedHandler(UNSUPPORT_INFO*, int type) { 209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov std::string feature = "Unknown"; 210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (type) { 211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_DOC_XFAFORM: 212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov feature = "XFA"; 213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_DOC_PORTABLECOLLECTION: 215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov feature = "Portfolios_Packages"; 216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_DOC_ATTACHMENT: 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_ANNOT_ATTACHMENT: 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov feature = "Attachment"; 220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_DOC_SECURITY: 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov feature = "Rights_Management"; 223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_DOC_SHAREDREVIEW: 225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov feature = "Shared_Review"; 226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_DOC_SHAREDFORM_ACROBAT: 228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM: 229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_DOC_SHAREDFORM_EMAIL: 230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov feature = "Shared_Form"; 231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_ANNOT_3DANNOT: 233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov feature = "3D"; 234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_ANNOT_MOVIE: 236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov feature = "Movie"; 237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_ANNOT_SOUND: 239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov feature = "Sound"; 240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_ANNOT_SCREEN_MEDIA: 242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA: 243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov feature = "Screen"; 244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case FPDF_UNSP_ANNOT_SIG: 246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov feature = "Digital_Signature"; 247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov printf("Unsupported feature: %s.\n", feature.c_str()); 250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovbool ParseCommandLine(const std::vector<std::string>& args, 253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov Options* options, std::list<std::string>* files) { 254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (args.empty()) { 255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return false; 256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov options->exe_path = args[0]; 258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov size_t cur_idx = 1; 259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (; cur_idx < args.size(); ++cur_idx) { 260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const std::string& cur_arg = args[cur_idx]; 261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cur_arg == "--ppm") { 262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (options->output_format != OUTPUT_NONE) { 263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Duplicate or conflicting --ppm argument\n"); 264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return false; 265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov options->output_format = OUTPUT_PPM; 267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (cur_arg == "--png") { 268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (options->output_format != OUTPUT_NONE) { 269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Duplicate or conflicting --png argument\n"); 270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return false; 271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov options->output_format = OUTPUT_PNG; 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (cur_arg.size() > 11 && 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann cur_arg.compare(0, 11, "--font-dir=") == 0) { 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!options->font_directory.empty()) { 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "Duplicate --font-dir argument\n"); 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return false; 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann options->font_directory = cur_arg.substr(11); 280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef _WIN32 282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (cur_arg == "--emf") { 283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (options->output_format != OUTPUT_NONE) { 284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Duplicate or conflicting --emf argument\n"); 285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return false; 286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov options->output_format = OUTPUT_EMF; 288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (cur_arg == "--bmp") { 290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (options->output_format != OUTPUT_NONE) { 291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Duplicate or conflicting --bmp argument\n"); 292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return false; 293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov options->output_format = OUTPUT_BMP; 295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif // _WIN32 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_V8 298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef V8_USE_EXTERNAL_STARTUP_DATA 299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (cur_arg.size() > 10 && cur_arg.compare(0, 10, "--bin-dir=") == 0) { 300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!options->bin_directory.empty()) { 301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Duplicate --bin-dir argument\n"); 302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return false; 303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov options->bin_directory = cur_arg.substr(10); 305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif // V8_USE_EXTERNAL_STARTUP_DATA 307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // PDF_ENABLE_V8 308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (cur_arg.size() > 8 && cur_arg.compare(0, 8, "--scale=") == 0) { 309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!options->scale_factor_as_string.empty()) { 310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Duplicate --scale argument\n"); 311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return false; 312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov options->scale_factor_as_string = cur_arg.substr(8); 314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cur_idx >= args.size()) { 319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "No input files.\n"); 320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return false; 321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (size_t i = cur_idx; i < args.size(); i++) { 323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov files->push_back(args[i]); 324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return true; 326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { 329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return true; 330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) { 333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool RenderPage(const std::string& name, 336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FPDF_DOCUMENT& doc, 337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FPDF_FORMHANDLE& form, 338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const int page_index, 339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const Options& options) { 340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_PAGE page = FPDF_LoadPage(doc, page_index); 341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!page) { 342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return false; 343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page); 345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FORM_OnAfterLoadPage(page, form); 346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN); 347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann double scale = 1.0; 349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!options.scale_factor_as_string.empty()) { 350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::stringstream(options.scale_factor_as_string) >> scale; 351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int width = static_cast<int>(FPDF_GetPageWidth(page) * scale); 353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int height = static_cast<int>(FPDF_GetPageHeight(page) * scale); 354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int alpha = FPDFPage_HasTransparency(page) ? 1 : 0; 355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, alpha); 356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bitmap) { 357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "Page was too large to be rendered.\n"); 358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return false; 359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_DWORD fill_color = alpha ? 0x00000000 : 0xFFFFFFFF; 361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDFBitmap_FillRect(bitmap, 0, 0, width, height, fill_color); 362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0); 363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, 0); 365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int stride = FPDFBitmap_GetStride(bitmap); 366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const char* buffer = 367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann reinterpret_cast<const char*>(FPDFBitmap_GetBuffer(bitmap)); 368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (options.output_format) { 370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef _WIN32 371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case OUTPUT_BMP: 372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann WriteBmp(name.c_str(), page_index, buffer, stride, width, height); 373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case OUTPUT_EMF: 376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann WriteEmf(page, name.c_str(), page_index); 377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case OUTPUT_PNG: 380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann WritePng(name.c_str(), page_index, buffer, stride, width, height); 381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case OUTPUT_PPM: 384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann WritePpm(name.c_str(), page_index, buffer, stride, width, height); 385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann default: 388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDFBitmap_Destroy(bitmap); 392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE); 393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FORM_OnBeforeClosePage(page, form); 394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDFText_ClosePage(text_page); 395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_ClosePage(page); 396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return true; 397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid RenderPdf(const std::string& name, const char* pBuf, size_t len, 400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const Options& options) { 401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Rendering PDF file %s.\n", name.c_str()); 402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_JSPLATFORM platform_callbacks; 404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov memset(&platform_callbacks, '\0', sizeof(platform_callbacks)); 405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann platform_callbacks.version = 3; 406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov platform_callbacks.app_alert = ExampleAppAlert; 407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov platform_callbacks.Doc_gotoPage = ExampleDocGotoPage; 408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_FORMFILLINFO form_callbacks; 410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov memset(&form_callbacks, '\0', sizeof(form_callbacks)); 411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_XFA 412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann form_callbacks.version = 2; 413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else // PDF_ENABLE_XFA 414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov form_callbacks.version = 1; 415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // PDF_ENABLE_XFA 416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov form_callbacks.m_pJsPlatform = &platform_callbacks; 417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov TestLoader loader(pBuf, len); 419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_FILEACCESS file_access; 420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov memset(&file_access, '\0', sizeof(file_access)); 421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov file_access.m_FileLen = static_cast<unsigned long>(len); 422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann file_access.m_GetBlock = TestLoader::GetBlock; 423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov file_access.m_Param = &loader; 424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FILEAVAIL file_avail; 426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov memset(&file_avail, '\0', sizeof(file_avail)); 427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov file_avail.version = 1; 428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov file_avail.IsDataAvail = Is_Data_Avail; 429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DOWNLOADHINTS hints; 431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov memset(&hints, '\0', sizeof(hints)); 432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov hints.version = 1; 433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov hints.AddSegment = Add_Segment; 434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_DOCUMENT doc; 436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nRet = PDF_DATA_NOTAVAIL; 437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bool bIsLinearized = false; 438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_AVAIL pdf_avail = FPDFAvail_Create(&file_avail, &file_access); 439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (FPDFAvail_IsLinearized(pdf_avail) == PDF_LINEARIZED) { 441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Linearized path...\n"); 442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann doc = FPDFAvail_GetDocument(pdf_avail, nullptr); 443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (doc) { 444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (nRet == PDF_DATA_NOTAVAIL) { 445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nRet = FPDFAvail_IsDocAvail(pdf_avail, &hints); 446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nRet == PDF_DATA_ERROR) { 448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "Unknown error in checking if doc was available.\n"); 449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nRet = FPDFAvail_IsFormAvail(pdf_avail, &hints); 452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nRet == PDF_FORM_ERROR || nRet == PDF_FORM_NOTAVAIL) { 453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, 454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "Error %d was returned in checking if form was available.\n", 455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nRet); 456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bIsLinearized = true; 459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "Non-linearized path...\n"); 462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann doc = FPDF_LoadCustomDocument(&file_access, nullptr); 463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!doc) { 466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann unsigned long err = FPDF_GetLastError(); 467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "Load pdf docs unsuccessful: "); 468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (err) { 469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FPDF_ERR_SUCCESS: 470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "Success"); 471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FPDF_ERR_UNKNOWN: 473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "Unknown error"); 474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FPDF_ERR_FILE: 476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "File not found or could not be opened"); 477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FPDF_ERR_FORMAT: 479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "File not in PDF format or corrupted"); 480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FPDF_ERR_PASSWORD: 482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "Password required or incorrect password"); 483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FPDF_ERR_SECURITY: 485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "Unsupported security scheme"); 486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FPDF_ERR_PAGE: 488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "Page not found or content error"); 489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann default: 491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "Unknown error %ld", err); 492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, ".\n"); 494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDFAvail_Destroy(pdf_avail); 496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (void)FPDF_GetDocPermissions(doc); 500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks); 502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_XFA 503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int docType = DOCTYPE_PDF; 504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (FPDF_HasXFAField(doc, &docType) && docType != DOCTYPE_PDF && 505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !FPDF_LoadXFA(doc)) { 506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "LoadXFA unsuccessful, continuing anyway.\n"); 507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // PDF_ENABLE_XFA 509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD); 510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_SetFormFieldHighlightAlpha(form, 100); 511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FORM_DoDocumentJSAction(form); 513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FORM_DoDocumentOpenAction(form); 514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int page_count = FPDF_GetPageCount(doc); 516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int rendered_pages = 0; 517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int bad_pages = 0; 518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (int i = 0; i < page_count; ++i) { 519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bIsLinearized) { 520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nRet = PDF_DATA_NOTAVAIL; 521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (nRet == PDF_DATA_NOTAVAIL) { 522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nRet = FPDFAvail_IsPageAvail(pdf_avail, i, &hints); 523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nRet == PDF_DATA_ERROR) { 525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fprintf(stderr, "Unknown error in checking if page %d is available.\n", 526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i); 527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (RenderPage(name, doc, form, i, options)) { 531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ++rendered_pages; 532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ++bad_pages; 534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC); 538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_XFA 540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // Note: The shut down order here is the reverse of the non-XFA branch order. 541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // Need to work out if this is required, and if it is, the lifetimes of 542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // objects owned by |doc| that |form| reference. 543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_CloseDocument(doc); 544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDFDOC_ExitFormFillEnvironment(form); 545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else // PDF_ENABLE_XFA 546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDFDOC_ExitFormFillEnvironment(form); 547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_CloseDocument(doc); 548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // PDF_ENABLE_XFA 549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDFAvail_Destroy(pdf_avail); 551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Rendered %d pages.\n", rendered_pages); 553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "Skipped %d bad pages.\n", bad_pages); 554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic const char usage_string[] = 557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "Usage: pdfium_test [OPTION] [FILE]...\n" 558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann " --bin-dir=<path> - override path to v8 external data\n" 559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann " --font-dir=<path> - override path to external fonts\n" 560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann " --scale=<number> - scale output size by number (e.g. 0.5)\n" 561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef _WIN32 562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov " --bmp - write page images <pdf-name>.<page-number>.bmp\n" 563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov " --emf - write page meta files <pdf-name>.<page-number>.emf\n" 564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // _WIN32 565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov " --png - write page images <pdf-name>.<page-number>.png\n" 566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov " --ppm - write page images <pdf-name>.<page-number>.ppm\n"; 567e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 568e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint main(int argc, const char* argv[]) { 569e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov std::vector<std::string> args(argv, argv + argc); 570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov Options options; 571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov std::list<std::string> files; 572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!ParseCommandLine(args, &options, &files)) { 573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fprintf(stderr, "%s", usage_string); 574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 1; 575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_V8 578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann v8::Platform* platform; 579e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef V8_USE_EXTERNAL_STARTUP_DATA 580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov v8::StartupData natives; 581e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov v8::StartupData snapshot; 582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann InitializeV8ForPDFium(options.exe_path, options.bin_directory, &natives, 583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann &snapshot, &platform); 584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else // V8_USE_EXTERNAL_STARTUP_DATA 585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann InitializeV8ForPDFium(&platform); 586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif // V8_USE_EXTERNAL_STARTUP_DATA 587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // PDF_ENABLE_V8 588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_LIBRARY_CONFIG config; 590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann config.version = 2; 591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann config.m_pUserFontPaths = nullptr; 592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann config.m_pIsolate = nullptr; 593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann config.m_v8EmbedderSlot = 0; 594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const char* path_array[2]; 596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!options.font_directory.empty()) { 597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann path_array[0] = options.font_directory.c_str(); 598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann path_array[1] = nullptr; 599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann config.m_pUserFontPaths = path_array; 600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_InitLibraryWithConfig(&config); 602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 603e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov UNSUPPORT_INFO unsuppored_info; 604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov memset(&unsuppored_info, '\0', sizeof(unsuppored_info)); 605e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov unsuppored_info.version = 1; 606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov unsuppored_info.FSDK_UnSupport_Handler = ExampleUnsupportedHandler; 607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FSDK_SetUnSpObjProcessHandler(&unsuppored_info); 609e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 610e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (!files.empty()) { 611e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov std::string filename = files.front(); 612e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov files.pop_front(); 613e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov size_t file_length = 0; 614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<char, pdfium::FreeDeleter> file_contents = 615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann GetFileContents(filename.c_str(), &file_length); 616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (file_contents) 617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann RenderPdf(filename, file_contents.get(), file_length, options); 618e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 619e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 620e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_DestroyLibrary(); 621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_V8 622e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov v8::V8::ShutdownPlatform(); 623e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete platform; 624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // PDF_ENABLE_V8 625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 0; 627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 628