|
@@ -20,16 +20,25 @@ using PDF_Office.Helper;
|
|
|
using PDF_Office.Model.Dialog.HomePageToolsDialogs.HomePagePrinter;
|
|
|
using System.Drawing;
|
|
|
using System.Windows;
|
|
|
+using ComPDFKitViewer;
|
|
|
+using Size = System.Windows.Size;
|
|
|
|
|
|
namespace PDF_Office.ViewModels.EditTools.Watermark
|
|
|
{
|
|
|
- public class WatermarkDocumentContentViewModel : BindableBase,INavigationAware
|
|
|
+ public class WatermarkDocumentContentViewModel : BindableBase, INavigationAware
|
|
|
{
|
|
|
|
|
|
public IEventAggregator eventAggregator;
|
|
|
+ public IRegionManager regionManager;
|
|
|
public CPDFViewer PDFViewer;
|
|
|
- public CPDFDocument document;
|
|
|
+ public CPDFDocument Document;
|
|
|
private CPDFWatermark watermark;
|
|
|
+ private WatermarkInfo watermarkInfo;
|
|
|
+
|
|
|
+
|
|
|
+ public bool firstin = true;
|
|
|
+
|
|
|
+ public string ViwerRegionName { get; set; }
|
|
|
|
|
|
private ImageSource _imageSource = null;
|
|
|
public ImageSource ImageSource
|
|
@@ -41,56 +50,63 @@ namespace PDF_Office.ViewModels.EditTools.Watermark
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public WatermarkDocumentContentViewModel(IEventAggregator eventAggregator)
|
|
|
+ public WatermarkDocumentContentViewModel(IEventAggregator eventAggregator, IRegionManager regionManager)
|
|
|
{
|
|
|
+ this.regionManager = regionManager;
|
|
|
this.eventAggregator = eventAggregator;
|
|
|
eventAggregator.GetEvent<SetWatermarkEvent>().Subscribe(SetWatermark);
|
|
|
+ ViwerRegionName = RegionNames.WatermarkViwerRegionName;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
public void SetWatermark(WatermarkInfo watermarkInfo)
|
|
|
{
|
|
|
- CreateWatermark(watermarkInfo);
|
|
|
+ this.watermarkInfo = watermarkInfo;
|
|
|
|
|
|
- document.PdfToImage("0-1", "D:\\");
|
|
|
- document.WriteToFilePath("D:\\sb22222.pdf");
|
|
|
- AwaitRenderBitmap(document);
|
|
|
+ //document.PdfToImage("0-1", "D:\\");
|
|
|
+ //document.WriteToFilePath("D:\\sb22222.pdf");
|
|
|
+ PDFViewer.InvalidateVisual();
|
|
|
}
|
|
|
|
|
|
- public void CreateWatermark(WatermarkInfo watermarkInfo)
|
|
|
+ public void CreateWatermark(CPDFDocument document)
|
|
|
{
|
|
|
- if (watermarkInfo.WatermarkType == C_Watermark_Type.WATERMARK_TYPE_TEXT)
|
|
|
+ if (watermarkInfo != null)
|
|
|
{
|
|
|
- watermark = document.InitWatermark(C_Watermark_Type.WATERMARK_TYPE_TEXT);
|
|
|
- watermark.SetText(watermarkInfo.Text);
|
|
|
- if (watermarkInfo.TextSize == null)
|
|
|
+ document.DeleteWatermarks();
|
|
|
+ if (watermarkInfo.WatermarkType == C_Watermark_Type.WATERMARK_TYPE_TEXT)
|
|
|
{
|
|
|
- watermarkInfo.TextSize = "6";
|
|
|
+ watermark = document.InitWatermark(C_Watermark_Type.WATERMARK_TYPE_TEXT);
|
|
|
+ watermark.SetText(watermarkInfo.Text);
|
|
|
+ if (watermarkInfo.TextSize == null)
|
|
|
+ {
|
|
|
+ watermarkInfo.TextSize = "6";
|
|
|
+ }
|
|
|
+ watermark.SetFontName(watermarkInfo.FontName);
|
|
|
+ watermark.SetScale(float.Parse(watermarkInfo.TextSize));
|
|
|
+ watermark.SetTextRGBColor(watermarkInfo.TextColor);
|
|
|
}
|
|
|
- watermark.SetFontName(watermarkInfo.FontName);
|
|
|
- watermark.SetScale(float.Parse(watermarkInfo.TextSize));
|
|
|
- watermark.SetTextRGBColor(watermarkInfo.TextColor);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- watermark = document.InitWatermark(C_Watermark_Type.WATERMARK_TYPE_IMG);
|
|
|
- watermark.SetImage(watermarkInfo.ImageArray, watermarkInfo.ImageWidth, watermarkInfo.ImageHeight);
|
|
|
- watermark.SetScale(0.1f);
|
|
|
+ else
|
|
|
+ {
|
|
|
+ watermark = document.InitWatermark(C_Watermark_Type.WATERMARK_TYPE_IMG);
|
|
|
+ watermark.SetImage(watermarkInfo.ImageArray, watermarkInfo.ImageWidth, watermarkInfo.ImageHeight);
|
|
|
+ watermark.SetScale(0.1f);
|
|
|
+ }
|
|
|
+ watermark.SetRotation(watermarkInfo.Rotation);
|
|
|
+ watermark.SetOpacity(watermarkInfo.Opacity);
|
|
|
+ watermark.SetFront(watermarkInfo.IsFront);
|
|
|
+ watermark.SetVertalign(watermarkInfo.WatermarkVertalign);
|
|
|
+ watermark.SetHorizalign(watermarkInfo.WatermarkHorizalign);
|
|
|
+ watermark.SetFullScreen(watermarkInfo.Isfull);
|
|
|
+ watermark.SetVertOffset(watermarkInfo.VertOffset);
|
|
|
+ watermark.SetHorizOffset(watermarkInfo.HorizOffset);
|
|
|
+ watermark.SetHorizontalSpacing(watermarkInfo.HorizontalSpacing);
|
|
|
+ watermark.SetVerticalSpacing(watermarkInfo.VerticalSpacing);
|
|
|
+ watermark.SetPages(watermarkInfo.PageRange);
|
|
|
+ watermark.CreateWatermark();
|
|
|
+ watermark.UpdateWatermark();
|
|
|
}
|
|
|
- watermark.SetRotation(watermarkInfo.Rotation);
|
|
|
- watermark.SetOpacity(watermarkInfo.Opacity);
|
|
|
- watermark.SetFront(watermarkInfo.IsFront);
|
|
|
- watermark.SetVertalign(watermarkInfo.WatermarkVertalign);
|
|
|
- watermark.SetHorizalign(watermarkInfo.WatermarkHorizalign);
|
|
|
- watermark.SetFullScreen(true);
|
|
|
- watermark.SetVertOffset(watermarkInfo.VertOffset);
|
|
|
- watermark.SetHorizOffset(watermarkInfo.HorizOffset);
|
|
|
- watermark.SetHorizontalSpacing(watermarkInfo.HorizontalSpacing);
|
|
|
- watermark.SetVerticalSpacing(watermarkInfo.VerticalSpacing);
|
|
|
- watermark.SetPages("0");
|
|
|
- watermark.CreateWatermark();
|
|
|
- watermark.UpdateWatermark();
|
|
|
-
|
|
|
}
|
|
|
+
|
|
|
public BitmapSource ToBitmapSource(System.Drawing.Bitmap image)
|
|
|
{
|
|
|
IntPtr ptr = image.GetHbitmap();//obtain the Hbitmap
|
|
@@ -107,17 +123,48 @@ namespace PDF_Office.ViewModels.EditTools.Watermark
|
|
|
|
|
|
public async Task RenderBitmap(CPDFDocument doc)
|
|
|
{
|
|
|
-
|
|
|
- CPDFPage page = doc.PageAtIndex(0,true);
|
|
|
+
|
|
|
+ CPDFPage page = doc.PageAtIndex(0, true);
|
|
|
byte[] bmp_data = new byte[(int)page.PageSize.Width * (int)page.PageSize.Height * 4];
|
|
|
- Bitmap bitmap = await ToolMethod.RenderPageBitmap(document, (int)(page.PageSize.Width * 1 * 1.4), (int)(page.PageSize.Height * 1 * 1.4), 0, true, true);
|
|
|
+ Bitmap bitmap = await ToolMethod.RenderPageBitmap(Document, (int)(page.PageSize.Width * 1 * 1.4), (int)(page.PageSize.Height * 1 * 1.4), 0, true, true);
|
|
|
ImageSource = ToBitmapSource(bitmap);
|
|
|
doc.ReleasePages();
|
|
|
|
|
|
}
|
|
|
- public async void AwaitRenderBitmap(CPDFDocument doc)
|
|
|
+
|
|
|
+ private void UndoManager_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ private void CurrentViewer_CustomDrawHandler(object sender, CustomDrawData e)
|
|
|
+ {
|
|
|
+ if (e.DrawPages.Count > 0 && e.DrawContext != null)
|
|
|
+ {
|
|
|
+ foreach (DrawPageData drawPageData in e.DrawPages)
|
|
|
+ {
|
|
|
+ WriteableBitmap waterMarkBitmap = GetWaterMark(PDFViewer.Document, e.Zoom, drawPageData.PageIndex);
|
|
|
+ e.DrawContext.DrawImage(waterMarkBitmap, drawPageData.PageBound);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ private WriteableBitmap GetWaterMark(CPDFDocument oldDoc, double zoom, int pageIndex)
|
|
|
{
|
|
|
- await RenderBitmap(doc);
|
|
|
+ Size pageSize = oldDoc.GetPageSize(pageIndex);
|
|
|
+
|
|
|
+ CPDFDocument newDoc = CPDFDocument.CreateDocument();
|
|
|
+ newDoc.InsertPage(0, pageSize.Width, pageSize.Height, null);
|
|
|
+
|
|
|
+ CreateWatermark(newDoc);
|
|
|
+ CPDFPage newPage = newDoc.PageAtIndex(0);
|
|
|
+ double scale = 96.0 / 72.0;
|
|
|
+ zoom = zoom * scale;
|
|
|
+ Rect renderRect = new Rect(0, 0, (int)(pageSize.Width * scale), (int)(pageSize.Height * scale));
|
|
|
+ byte[] imageArray = new byte[(int)(renderRect.Width * renderRect.Height * 4)];
|
|
|
+
|
|
|
+ newPage.RenderPageBitmapWithMatrix((float)zoom, renderRect, 0x00FFFFFF, imageArray, 1, true);
|
|
|
+ WriteableBitmap WirteBitmap = new WriteableBitmap((int)renderRect.Width, (int)renderRect.Height, 96, 96, PixelFormats.Bgra32, null);
|
|
|
+ WirteBitmap.WritePixels(new Int32Rect(0, 0, (int)renderRect.Width, (int)renderRect.Height), imageArray, WirteBitmap.BackBufferStride, 0);
|
|
|
+ return WirteBitmap;
|
|
|
}
|
|
|
|
|
|
public bool IsNavigationTarget(NavigationContext navigationContext)
|
|
@@ -133,8 +180,20 @@ namespace PDF_Office.ViewModels.EditTools.Watermark
|
|
|
public void OnNavigatedTo(NavigationContext navigationContext)
|
|
|
{
|
|
|
navigationContext.Parameters.TryGetValue<CPDFViewer>(ParameterNames.PDFViewer, out PDFViewer);
|
|
|
- document = PDFViewer.Document;
|
|
|
- AwaitRenderBitmap(PDFViewer.Document);
|
|
|
+ if (PDFViewer != null)
|
|
|
+ {
|
|
|
+ Document = PDFViewer.Document;
|
|
|
+ if (!regionManager.Regions[ViwerRegionName].Views.Contains(PDFViewer))
|
|
|
+ {
|
|
|
+ PDFViewer.CustomDrawHandler += CurrentViewer_CustomDrawHandler;
|
|
|
+ PDFViewer.UndoManager.PropertyChanged += UndoManager_PropertyChanged;
|
|
|
+ regionManager.AddToRegion(ViwerRegionName, PDFViewer);
|
|
|
+ PDFViewer.SetAnnotInteraction(!PDFViewer.GetAnnotInteraction());
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|