/*
http://www.cgsoso.com/forum-211-1.html
CG搜搜 Unity3d 每日Unity3d插件免费更新 更有VIP资源!
CGSOSO 主打游戏开发,影视设计等CG资源素材。
插件如若商用,请务必官网购买!
daily assets update for try.
U should buy the asset from home store if u use it in your project!
*/
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
#if NETFX_CORE && !UNITY_WSA_10_0
using WinRTLegacy.Text;
#else
using System.Text;
#endif
namespace Paroxe.PdfRenderer
{
#if !UNITY_WEBGL
///
/// This class allow to access the text of a page.
///
public class PDFTextPage : IDisposable, IEquatable
{
private bool m_Disposed;
private IntPtr m_NativePointer;
private PDFPage m_Page;
private static Dictionary s_InstanceMap = new Dictionary();
public PDFTextPage(PDFPage page)
{
if (page == null)
throw new NullReferenceException();
PDFLibrary.AddRef("PDFTextPage");
m_Page = page;
m_NativePointer = FPDFText_LoadPage(m_Page.NativePointer);
if (m_NativePointer != IntPtr.Zero)
{
if (s_InstanceMap.ContainsKey(m_NativePointer))
{
s_InstanceMap[m_NativePointer] = s_InstanceMap[m_NativePointer] + 1;
}
else
s_InstanceMap[m_NativePointer] = 1;
}
}
~PDFTextPage()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!m_Disposed)
{
lock (PDFLibrary.nativeLock)
{
if (m_NativePointer != IntPtr.Zero)
{
s_InstanceMap[m_NativePointer] = s_InstanceMap[m_NativePointer] - 1;
if (s_InstanceMap[m_NativePointer] == 0)
{
if (m_Page.NativePointer != IntPtr.Zero && m_Page.Document.NativePointer != IntPtr.Zero)
FPDFText_ClosePage(m_NativePointer);
s_InstanceMap.Remove(m_NativePointer);
m_NativePointer = IntPtr.Zero;
}
}
}
PDFLibrary.RemoveRef("PDFTextPage");
m_Disposed = true;
}
}
public IntPtr NativePointer
{
get { return m_NativePointer; }
}
///
/// Return a refence to the page.
///
public PDFPage Page
{
get { return m_Page; }
}
///
/// Return the page index of the text.
///
public int PageIndex
{
get { return m_Page.PageIndex; }
}
///
/// Return the number of character in the page.
///
///
public int CountChars()
{
return FPDFText_CountChars(m_NativePointer);
}
///
/// Count number of rectangular areas occupied by a segment of texts.
///
///
///
///
public int CountRects(int startIndex, int count)
{
return FPDFText_CountRects(m_NativePointer, startIndex, count);
}
///
/// Extract text within a rectangular boundary on the page.
///
///
///
///
///
///
///
public string GetBoundedText(float left, float top, float right, float bottom, int charCount)
{
byte[] textBuffer = new byte[(charCount + 1) * 2];
FPDFText_GetBoundedText(m_NativePointer, left, top, right, bottom, textBuffer, textBuffer.Length);
return Encoding.Unicode.GetString(textBuffer);
}
///
/// Get bounding box of a particular character.
///
///
///
public Rect GetCharBox(int charIndex)
{
double left;
double right;
double bottom;
double top;
FPDFText_GetCharBox(m_NativePointer, charIndex, out left, out right, out bottom, out top);
return new Rect((float) left, (float) top, Mathf.Abs((float) right - (float) left),
Mathf.Abs((float) bottom - (float) top));
}
///
/// Get the index of a character at or nearby a certain position on the page.
///
///
///
///
public int GetCharIndexAtPos(Vector2 pos, Vector2 tolerance)
{
/*Vector2 pagePos = m_Page.ConvertUnityUIDevicePositionToPagePosition(pos,
m_Page.Document.GetPageSize(m_Page.PageIndex));*/
return FPDFText_GetCharIndexAtPos(m_NativePointer, pos.x, pos.y, tolerance.x, tolerance.y);
}
///
/// Get the font size of a particular character.
///
///
///
public double GetFontSize(int charIndex)
{
return FPDFText_GetFontSize(m_NativePointer, charIndex);
}
///
/// Get a rectangular area from the result generated by CountRects
///
///
///
public Rect GetRect(int rectIndex)
{
double left;
double right;
double bottom;
double top;
FPDFText_GetRect(m_NativePointer, rectIndex, out left, out top, out right, out bottom);
return new Rect((float) left, (float) top, Mathf.Abs((float) right - (float) left),
Mathf.Abs((float) bottom - (float) top));
}
///
/// Extract text string from the page.
///
///
///
///
public string GetText(int startIndex, int count)
{
byte[] textBuffer = new byte[(count + 1)*2];
FPDFText_GetText(m_NativePointer, startIndex, count, textBuffer);
return Encoding.Unicode.GetString(textBuffer);
}
///
/// Get a character in the page.
///
///
///
public string GetChar(int charIndex)
{
return char.ConvertFromUtf32((int) FPDFText_GetUnicode(m_NativePointer, charIndex));
}
public IList Search(string findWhat,
PDFSearchHandle.MatchOption flags = PDFSearchHandle.MatchOption.NONE, int startIndex = 0)
{
if (string.IsNullOrEmpty(findWhat.Trim()))
return new List();
return Search(Encoding.Unicode.GetBytes(findWhat.Trim() + "\0"), flags, startIndex);
}
public IList Search(byte[] findWhatUnicode,
PDFSearchHandle.MatchOption flags = PDFSearchHandle.MatchOption.NONE, int startIndex = 0)
{
List searchResults = new List();
if (findWhatUnicode == null)
return searchResults;
using (PDFSearchHandle searchHandle = new PDFSearchHandle(this, findWhatUnicode, startIndex, flags))
{
foreach (PDFSearchResult result in searchHandle.EnumerateSearchResults())
{
searchResults.Add(result);
}
}
return searchResults;
}
public bool Equals(PDFTextPage other)
{
return (m_NativePointer != IntPtr.Zero && m_NativePointer == other.m_NativePointer);
}
#region NATIVE
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern IntPtr FPDFText_LoadPage(IntPtr page);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern void FPDFText_ClosePage(IntPtr text_page);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern int FPDFText_CountChars(IntPtr text_page);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern int FPDFText_CountRects(IntPtr text_page, int start_index, int count);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern int FPDFText_GetBoundedText(IntPtr text_page, double left, double top, double right,
double bottom, [In, Out] byte[] buffer, int buflen);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern void FPDFText_GetCharBox(IntPtr text_page, int index, out double left, out double right,
out double bottom, out double top);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern int FPDFText_GetCharIndexAtPos(IntPtr text_page, double x, double y, double xTolerance,
double yTolerance);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern double FPDFText_GetFontSize(IntPtr text_page, int index);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern void FPDFText_GetRect(IntPtr text_page, int rect_index, out double left, out double top,
out double right, out double bottom);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern int FPDFText_GetText(IntPtr text_page, int start_index, int count, [In, Out] byte[] buffer);
[DllImport(PDFLibrary.PLUGIN_ASSEMBLY)]
private static extern uint FPDFText_GetUnicode(IntPtr text_page, int index);
#endregion
}
#endif
}