#2
sam_jiang2023-11-11 18:44
|
迟迟找不到原因所以,为啥绘制不了。。。。
*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