|  |  |  | @ -24,6 +24,7 @@ class Pdfium | 
			
		
	
		
			
				
					|  |  |  |  |   typedef :pointer, :FPDF_PAGE | 
			
		
	
		
			
				
					|  |  |  |  |   typedef :pointer, :FPDF_BITMAP | 
			
		
	
		
			
				
					|  |  |  |  |   typedef :pointer, :FPDF_FORMHANDLE | 
			
		
	
		
			
				
					|  |  |  |  |   typedef :pointer, :FPDF_TEXTPAGE | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   MAX_SIZE = 32_767 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -72,6 +73,11 @@ class Pdfium | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   attach_function :FPDF_RenderPageBitmap, %i[FPDF_BITMAP FPDF_PAGE int int int int int int], :void | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   attach_function :FPDFText_LoadPage, [:FPDF_PAGE], :FPDF_TEXTPAGE | 
			
		
	
		
			
				
					|  |  |  |  |   attach_function :FPDFText_ClosePage, [:FPDF_TEXTPAGE], :void | 
			
		
	
		
			
				
					|  |  |  |  |   attach_function :FPDFText_CountChars, [:FPDF_TEXTPAGE], :int | 
			
		
	
		
			
				
					|  |  |  |  |   attach_function :FPDFText_GetText, %i[FPDF_TEXTPAGE int int pointer], :int | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   typedef :int, :FPDF_BOOL | 
			
		
	
		
			
				
					|  |  |  |  |   typedef :pointer, :IPDF_JSPLATFORM | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -346,6 +352,40 @@ class Pdfium | 
			
		
	
		
			
				
					|  |  |  |  |       Pdfium.FPDFBitmap_Destroy(bitmap_ptr) if bitmap_ptr && !bitmap_ptr.null? | 
			
		
	
		
			
				
					|  |  |  |  |     end | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     def text | 
			
		
	
		
			
				
					|  |  |  |  |       return @text if @text | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       ensure_not_closed! | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       text_page = Pdfium.FPDFText_LoadPage(page_ptr) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       if text_page.null? | 
			
		
	
		
			
				
					|  |  |  |  |         Pdfium.check_last_error("Failed to load text page #{page_index}") | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         raise PdfiumError, "Failed to load text page #{page_index}, pointer is NULL." | 
			
		
	
		
			
				
					|  |  |  |  |       end | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       char_count = Pdfium.FPDFText_CountChars(text_page) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       return @text = '' if char_count.zero? | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       buffer_char_capacity = char_count + 1 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       buffer = FFI::MemoryPointer.new(:uint16, buffer_char_capacity) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       chars_written = Pdfium.FPDFText_GetText(text_page, 0, buffer_char_capacity, buffer) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       if chars_written <= 0 | 
			
		
	
		
			
				
					|  |  |  |  |         Pdfium.check_last_error("Failed to extract text from page #{page_index}") | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         return @text = '' | 
			
		
	
		
			
				
					|  |  |  |  |       end | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       @text = buffer.read_bytes((chars_written * 2) - 2).force_encoding('UTF-16LE').encode('UTF-8') | 
			
		
	
		
			
				
					|  |  |  |  |     ensure | 
			
		
	
		
			
				
					|  |  |  |  |       Pdfium.FPDFText_ClosePage(text_page) if text_page && !text_page.null? | 
			
		
	
		
			
				
					|  |  |  |  |     end | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     def close | 
			
		
	
		
			
				
					|  |  |  |  |       return if closed? | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |