注册 登录
编程论坛 VFP论坛

将水印绘制为轮廓图形路径,有谁用过这种方法吗?

iswith 发布于 2023-11-11 15:39, 375 次点击
迟迟找不到原因所以,为啥绘制不了。。。。
*PdfSharp 类,将水印绘制为轮廓图形路径
*使用PdfSharp,与VFP 的GDI+类似,XGraphics
*提供XColor(颜色)            string
*    XPen  (画笔)            string
*    XBrush(画刷)            object
*    XFont  (字体)             object
*    XPoint (位置)             string
*    XImage (图片)             object  BMP GIF PNG JPEG TIFF
*    XStringFormat(格式)    object
   
Local lcPath
If _vfp.StartMode = 0 Then
   m.lcPath = Addbs( Justpath( _vfp.ActiveProject.Name  ))
Else
   m.lcPath = Addbs( Justpath( sys(16,0) )  )
Endif  

Set Default To ( m.lcPath )

Set Procedure To netsuite.reg.prg   Additive

*--载入H文件
#INCLUDE Netsuite.H


Public oPdfSharp
m.oPdfSharp = Createobjects ( "Netsuite.PdfSharp" )


*1--打开一个PDF文档对象
Local loDocument    ;
    , lcErrMsg        ;
    , lnPageCount    ;
    , lcPDFFilename

m.lcPDFFilename = Getfile( "PDF" )   
If Empty( m.lcPDFFilename )  Then  
   Return
Endif

m.lcPassword  = ""

Clear
?"打开文档:"
??m.lcPDFFilename

Do While (.T.)
   
   m.lcErrMsg    = ""

   *--如果设置有拥有者密码与打开密码时,当前文档需要修改,所以优先使用拥有者密码,否侧会一直循环
   m.loDocument    = m.oPdfSharp.OpenPdf( m.lcPDFFilename , @lcErrMsg , m.lcPassword , PdfDocumentOpenMode_Modify )
   
   If  Isnull( m.loDocument )Then

       *该方式就表示打开需要密码
       If "password" $ Lower( m.lcErrMsg ) && And "open"  $ Lower( m.lcErrMsg ) Then
           
           *弹出密码打开对话框
           Local lofrm_pdfpassword ;
               , loPDFOpenPassword
                    
           Do Form frm_pdfpassword.scx Name m.lofrm_pdfpassword With Justfname( m.lcPDFFilename ) ;
                                                                      ,Null  To m.loPDFOpenPassword
           
           If !Type("m.loPDFOpenPassword"  ) == "O"  Or Isnull( m.loPDFOpenPassword)  Then
               Exit
           Endif

           *--取消
           If !m.loPDFOpenPassword.Result == "OK" Then  
              Exit  
           Else
                 m.lcPassword = m.loPDFOpenPassword.Password
           Endif     
                        
       Endif

  Else
       Exit
  Endif

EndDo

If !Type( "m.loDocument" ) == "O" Or  Isnull( m.loDocument )Then
   Return
Endif


?"总页数:"
m.lnPageCount   = m.oPdfSharp.GetPageCount( m.loDocument )
??m.lnPageCount

IF !Empty( m.lcErrMsg ) Then
   Messagebox( m.lcErrMsg , 16 )
   Return
Endif

*2.--获取 PdfPage 对象(注意第一页从0开始)
Local loPage ;
    , lnPage ;
    , lnPageWidth;
    , lnPageHeight
   
m.lnPage       = 0
m.loPage       = m.oPdfSharp.Getpage( m.loDocument , m.lnPage)
 
?"页宽(以点为单位):"
m.lnPageWidth  = m.oPdfSharp.GetpageSize( m.loPage, 1 )
??m.lnPageWidth

?"页高(以点为单位):"
m.lnPageHeight = m.oPdfSharp.GetpageSize( m.loPage , 2 )
??m.lnPageHeight


*--添加水印----------------------------------------------------------------
*  说明:使用XGraphicsPdfPageOptions.Prepend,水印将绘制在原始PDF页面下方.
*  大多数PDF文件由透明背景上的黑色文本组成,
*  水印将在那里可见(您可以通过在Adobe Reader中激活透明网格来检查).
*  对于具有纯背景的PDF页面(例如图像,具有背景颜色的表格,……),水印将不可见时,请偿试方法二

If m.oPdfSharp.GetVer( m.loDocument ) < 14 Then
   m.oPdfSharp.SetVer( m.loDocument , 14 )
Endif


Local lcWaterString
m.lcWaterString = "水印测试PDFSharp V1.0 For ZHZ 2023"


?"创建红色笔"  &&int alpha, int red, int green, int blue,double width = 0.5
Local loXPen
m.loXPen = m.oPdfSharp.newXPen(128, 255, 0, 0 , 2 )

*--XStringFormat(格式)
?"创建 XStringFormat(格式)"
Local loXStringFormat
m.loXStringFormat = m.oPdfSharp.newXStringFormat( XStringAlignment_Near, XLineAlignment_Near )

?"创建 XFont(字体):"
Local loFont     ;
    , lnFontSize;
    , lcFontName;
    , logfx     ;
    , loXPen    ;
    , lcXPoint  ;
    , loXGraphicsPath
   
   
m.lnFontSize   = 30  
m.lcFontName   = "SimHei"
m.loXFont       = m.oPdfSharp.newxFont( m.lcFontName , m.lnFontSize , XFontStyle_Bold)


?"创建 XGraphicsPath(图形路径):"
m.loXGraphicsPath = m.oPdfSharp.newxGraphicsPath()


?"循环整个文档页,绘每页水印"
For m.lnCount = 0 To m.lnPageCount-1
    With m.oPdfSharp
         
         *--获取 页面 XGRAPHICS对象,以便在现有内容上方绘制
         m.logfx      = .FromPdfPage2( m.oPdfSharp.Getpage( m.loDocument , m.lnCount ) , XGraphicsPdfPageOptions_Prepend ) &&考虑到层次
         
         *--获取文本的大小(以点为单位) 测量该XFont在oRenderer(XGraphics)中的宽高
         m.lnFontWidth    = .GetFontSize( m.lcWaterString , m.logfx  , m.loXFont , 1    )
         m.lnFontHeight    = .GetFontSize( m.lcWaterString , m.logfx  , m.loXFont , 2    )
         
         *--在页面中心定义旋转转换 转换角度
         *旋转有两个主要函数TranslateTransform(int x,int y)及RotateTransform(int angle)
         *用TranslateTransform() 函数,参数x,y设置为待旋转椭圆中心,则坐标原点会移到(x,y)
         *使用RotateTransform()函数,angle设置为希望旋转的整数角度,旋转方向是顺时针
         m.logfx.TranslateTransform( m.lnPageWidth / 2 , m.lnPageHeight /2 )
         *m.logfx .RotateTransform( -TAN( m.lnPageHeight / m.lnPageWidth) * 180 / Pi()   )
         m.logfx.RotateTransform( -45 )
         m.logfx.TranslateTransform( -m.lnPageWidth / 2, -m.lnPageHeight /2  )

         
         *--xPoint(位置) 必须以","为分隔符
         m.lcxPoint     =  Alltrim( Transform( (m.lnPageWidth  - m.lnFontWidth  ) / 2 ) ) + "," +;
                         Alltrim( Transform( (m.lnPageHeight - m.lnFontHeight ) / 2  ) )

         *--将文本添加到路径
         If !.AddString( m.loXGraphicsPath  ;
                        , m.lcWaterString      ;
                        , m.loXFont            ;
                        , m.lcXPoint            ;
                        , m.loXStringFormat     ;
                        , @lcErrMsg ) Then
                        
             MESSAGEBOX( m.lcErrMsg  , 16 )
             Exit
         Endif                 


         *--划出路径的轮廓
         If !.DrawPath( m.logfx              ;
                       , m.loXPen           ;
                       , m.loXGraphicsPath ;
                       , @lcErrMsg ) Then


             MESSAGEBOX( m.lcErrMsg  , 16 )
             Exit
         Endif
    Endwith
Endfor

*--另存
m.lcPDFFilename = Addbs( m.lcPath) + [testdata\ConvertPDF\] + Justfname(  m.lcPDFFilename )

*--保存(若文件与打开文件名一样就覆盖保存)
m.oPdfSharp.Save( m.loDocument , m.lcPDFFilename , @lcErrMsg  )
IF !Empty( m.lcErrMsg ) Then
   m.oPdfSharp.PdfClose( m.loDocument  )
   Messagebox( m.lcErrMsg , 16 )
   Return
Endif

*--关闭PDF
m.oPdfSharp.PdfClose( m.loDocument  )

*--预览PDF
Do Form frm_pdfmain_demo.scx with m.lcPDFFilename
6 回复
#2
sam_jiang2023-11-11 18:44
水印是不是可以看成是一张半透明的图片???
#3
sych2023-11-11 19:30
你自己玩的东西,拿出来问别人为什么?这谁能猜出来呀
#4
sostemp2023-11-12 08:51
就只看看

[此贴子已经被作者于2023-11-12 08:52编辑过]

#5
pvm20002023-11-12 15:06
你这将水印绘制为轮廓图形路径,到底是什么含义
#6
iswith2023-11-13 13:34
对于具有纯背景的PDF页面(例如图像,具有背景颜色的表格,……),水印将不可见时,我需要这种方法,一般PDF图文情况比复杂。有些是背景透明,采用直接写出文字放置在图层下方就可以得到水印,当然我也可以放置在上面让水印文字透明,绘制一个文字路径,多个方法而以。。。。
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-11-13 13:47编辑过]

#7
chengduy2023-11-13 19:58
回复 楼主 iswith
111222333ABC
1