/// <summary> /// <inheritdoc/> /// </summary> public void RenderPageBitmap(double zoomFactor, int startX, int startY, int sizeX, int sizeY, int width, int height, BitmapFormat format, IntPtr buffer, int stride) { var bmp = new PDFBitmap(_mainComponent); bmp.Create(width, height, format, buffer, stride); var pageHandle = _mainComponent.PDFiumBridge.FPDF_LoadPage(_mainComponent.PDFiumDocument, PageIndex); bmp.RenderWithTransformation( pageHandle, zoomFactor, startX, startY, sizeX, sizeY, _mainComponent.PageComponent.IsAnnotationToRender ? FPDF_RENDERING_FLAGS.FPDF_ANNOT : FPDF_RENDERING_FLAGS.FPDF_NONE); _mainComponent.PDFiumBridge.FPDF_ClosePage(pageHandle); if (_mainComponent.PageComponent is PDFPageComponent pageComponent && pageComponent.PageIndexWithSelections == PageIndex && pageComponent.SelectionRectangles.Count != 0) { foreach (var rect in pageComponent.SelectionRectangles) { bmp.RenderSelectionRectangle(zoomFactor, startX, startY, sizeY, rect.Left, rect.Top, rect.Width, rect.Height); } } bmp.Destroy(); }
protected virtual void Dispose(bool disposing) { if (!m_Disposed) { if (disposing) { #if !UNITY_WEBGL || UNITY_EDITOR m_Bitmap.Dispose(); m_Bitmap = null; #endif } PDFLibrary.RemoveRef("PDFRenderer"); m_Disposed = true; } }
/// <summary> /// <inheritdoc/> /// </summary> public void RenderThumbnailBitmap(BitmapFormat format, IntPtr buffer, int stride) { var bmp = new PDFBitmap(_mainComponent); bmp.Create((int)ThumbnailWidth, (int)ThumbnailHeight, format, buffer, stride); var pageHandle = _mainComponent.PDFiumBridge.FPDF_LoadPage(_mainComponent.PDFiumDocument, PageIndex); bmp.RenderWithoutTransformation( pageHandle, 0, 0, (int)ThumbnailWidth, (int)ThumbnailHeight, FPDF_RENDERING_FLAGS.FPDF_NONE); _mainComponent.PDFiumBridge.FPDF_ClosePage(pageHandle); bmp.Destroy(); }
byte[] RenderPageToByteArray(PDFPage page, int width, int height, IPDFColoredRectListProvider rectsProvider, RenderSettings settings) { if (m_Bitmap == null || !m_Bitmap.HasSameSize(width, height)) { if (m_Bitmap != null) { m_Bitmap.Dispose(); } m_Bitmap = new PDFBitmap(width, height, false); } m_Bitmap.FillRect(0, 0, width, height, int.MaxValue); int flags = settings == null ? RenderSettings.defaultRenderSettings.ComputeRenderingFlags() : settings.ComputeRenderingFlags(); FPDF_RenderPageBitmap(m_Bitmap.NativePointer, page.NativePointer, 0, 0, width, height, 0, flags); IntPtr bufferPtr = m_Bitmap.GetBuffer(); if (bufferPtr == IntPtr.Zero) { return(null); } int length = width * height * 4; if (m_IntermediateBuffer == null || m_IntermediateBuffer.Length < length) { m_IntermediateBuffer = new byte[width * height * 4]; } Marshal.Copy(bufferPtr, m_IntermediateBuffer, 0, width * height * 4); #if !UNITY_WEBGL IList <PDFColoredRect> coloredRects = rectsProvider != null ? rectsProvider.GetBackgroundColoredRectList(page) : null; if (coloredRects != null && coloredRects.Count > 0) { foreach (PDFColoredRect coloredRect in coloredRects) { var r = (int)(coloredRect.color.r * 255) & 0xFF; var g = (int)(coloredRect.color.g * 255) & 0xFF; var b = (int)(coloredRect.color.b * 255) & 0xFF; var a = (int)(coloredRect.color.a * 255) & 0xFF; float alpha = (a / (float)255); float reverseAlpha = 1.0f - alpha; Rect deviceRect = page.ConvertPageRectToDeviceRect(coloredRect.pageRect, new Vector2(width, height)); for (int y = 0; y < -(int)deviceRect.height; ++y) { for (int x = 0; x < (int)deviceRect.width; ++x) { int s = (((int)deviceRect.y + y + (int)deviceRect.height) * width + (int)deviceRect.x + x) * 4; var sr = m_IntermediateBuffer[s]; var sg = m_IntermediateBuffer[s + 1]; var sb = m_IntermediateBuffer[s + 2]; m_IntermediateBuffer[s] = (byte)Mathf.Clamp(alpha * r + (reverseAlpha * sr), 0, 255); m_IntermediateBuffer[s + 1] = (byte)Mathf.Clamp(alpha * g + (reverseAlpha * sg), 0, 255); m_IntermediateBuffer[s + 2] = (byte)Mathf.Clamp(alpha * b + (reverseAlpha * sb), 0, 255); m_IntermediateBuffer[s + 3] = 0xFF; } } } } #endif return(m_IntermediateBuffer); }