mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-27 13:48:51 +08:00
12 lines
8.7 KiB
Go
12 lines
8.7 KiB
Go
//
|
|
// Copyright 2020 FoxyUtils ehf. All rights reserved.
|
|
//
|
|
// This is a commercial product and requires a license to operate.
|
|
// A trial license can be obtained at https://unidoc.io
|
|
//
|
|
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
|
|
//
|
|
// Use of this source code is governed by the UniDoc End User License Agreement
|
|
// terms that can be accessed at https://unidoc.io/eula/
|
|
|
|
package testutils ;import (_e "crypto/md5";_ae "encoding/hex";_de "errors";_fc "fmt";_b "github.com/unidoc/unipdf/v3/common";_eg "github.com/unidoc/unipdf/v3/core";_ce "image";_ea "image/png";_fa "io";_fb "os";_f "os/exec";_c "path/filepath";_aa "strings";_a "testing";);func HashFile (file string )(string ,error ){_bgf ,_aca :=_fb .Open (file );if _aca !=nil {return "",_aca ;};defer _bgf .Close ();_bf :=_e .New ();if _ ,_aca =_fa .Copy (_bf ,_bgf );_aca !=nil {return "",_aca ;};return _ae .EncodeToString (_bf .Sum (nil )),nil ;};func CompareImages (img1 ,img2 _ce .Image )(bool ,error ){_cf :=img1 .Bounds ();_aae :=0;for _bfd :=0;_bfd < _cf .Size ().X ;_bfd ++{for _bgc :=0;_bgc < _cf .Size ().Y ;_bgc ++{_ga ,_cea ,_fd ,_ :=img1 .At (_bfd ,_bgc ).RGBA ();_bb ,_bfa ,_ca ,_ :=img2 .At (_bfd ,_bgc ).RGBA ();if _ga !=_bb ||_cea !=_bfa ||_fd !=_ca {_aae ++;};};};_eac :=float64 (_aae )/float64 (_cf .Dx ()*_cf .Dy ());if _eac > 0.0001{_fc .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_eac ,_aae );return false ,nil ;};return true ,nil ;};func RunRenderTest (t *_a .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ){_eaf :=_aa .TrimSuffix (_c .Base (pdfPath ),_c .Ext (pdfPath ));t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_ff *_a .T ){_fae :=_c .Join (outputDir ,_eaf );_cec :=_fae +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _cfg :=RenderPDFToPNGs (pdfPath ,0,_cec );_cfg !=nil {_ff .Skip (_cfg );};for _af :=1;true ;_af ++{_fcb :=_fc .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_fae ,_af );_gg :=_c .Join (baselineRenderPath ,_fc .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_eaf ,_af ));if _ ,_cdb :=_fb .Stat (_fcb );_cdb !=nil {break ;};_ff .Logf ("\u0025\u0073",_gg );if _ ,_afc :=_fb .Stat (_gg );_fb .IsNotExist (_afc ){if saveBaseline {_ff .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_fcb ,_gg );CopyFile (_fcb ,_gg );continue ;};break ;};_ff .Run (_fc .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_af ),func (_afe *_a .T ){_afe .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_fcb ,_gg );_ffa ,_gd :=ComparePNGFiles (_fcb ,_gg );if _fb .IsNotExist (_gd ){_afe .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_ffa {_afe .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");};});};});};func ParseIndirectObjects (rawpdf string )(map[int64 ]_eg .PdfObject ,error ){_bgcf :=_eg .NewParserFromString (rawpdf );_fca :=map[int64 ]_eg .PdfObject {};for {_aed ,_fce :=_bgcf .ParseIndirectObject ();if _fce !=nil {if _fce ==_fa .EOF {break ;};return nil ,_fce ;};switch _fab :=_aed .(type ){case *_eg .PdfIndirectObject :_fca [_fab .ObjectNumber ]=_aed ;case *_eg .PdfObjectStream :_fca [_fab .ObjectNumber ]=_aed ;};};for _ ,_ad :=range _fca {_eae (_ad ,_fca );};return _fca ,nil ;};func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_bd ,_df :=HashFile (file1 );if _df !=nil {return false ,_df ;};_gaf ,_df :=HashFile (file2 );if _df !=nil {return false ,_df ;};if _bd ==_gaf {return true ,nil ;};_fdf ,_df :=ReadPNG (file1 );if _df !=nil {return false ,_df ;};_cac ,_df :=ReadPNG (file2 );if _df !=nil {return false ,_df ;};if _fdf .Bounds ()!=_cac .Bounds (){return false ,nil ;};return CompareImages (_fdf ,_cac );};func ReadPNG (file string )(_ce .Image ,error ){_cd ,_g :=_fb .Open (file );if _g !=nil {return nil ,_g ;};defer _cd .Close ();return _ea .Decode (_cd );};var (ErrRenderNotSupported =_de .New ("\u0072\u0065\u006e\u0064\u0065r\u0069\u006e\u0067\u0020\u0050\u0044\u0046\u0020\u0066\u0069\u006c\u0065\u0073 \u0069\u0073\u0020\u006e\u006f\u0074\u0020\u0073\u0075\u0070\u0070\u006f\u0072\u0074\u0065\u0064\u0020\u006f\u006e\u0020\u0074\u0068\u0069\u0073\u0020\u0073\u0079\u0073\u0074\u0065m"););func _eae (_fcg _eg .PdfObject ,_ab map[int64 ]_eg .PdfObject )error {switch _cc :=_fcg .(type ){case *_eg .PdfIndirectObject :_abe :=_cc ;_eae (_abe .PdfObject ,_ab );case *_eg .PdfObjectDictionary :_dfa :=_cc ;for _ ,_ag :=range _dfa .Keys (){_adf :=_dfa .Get (_ag );if _gdb ,_dbg :=_adf .(*_eg .PdfObjectReference );_dbg {_cb ,_adb :=_ab [_gdb .ObjectNumber ];if !_adb {return _de .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");};_dfa .Set (_ag ,_cb );}else {_eae (_adf ,_ab );};};case *_eg .PdfObjectArray :_dbe :=_cc ;for _abg ,_be :=range _dbe .Elements (){if _ffaa ,_agc :=_be .(*_eg .PdfObjectReference );_agc {_cda ,_cad :=_ab [_ffaa .ObjectNumber ];if !_cad {return _de .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");};_dbe .Set (_abg ,_cda );}else {_eae (_be ,_ab );};};};return nil ;};func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;};if _ ,_bba :=_f .LookPath ("\u0067\u0073");_bba !=nil {return ErrRenderNotSupported ;};return _f .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_fc .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run ();};func CompareDictionariesDeep (d1 ,d2 *_eg .PdfObjectDictionary )bool {if len (d1 .Keys ())!=len (d2 .Keys ()){_b .Log .Debug ("\u0044\u0069\u0063\u0074\u0020\u0065\u006e\u0074\u0072\u0069\u0065\u0073\u0020\u006d\u0069s\u006da\u0074\u0063\u0068\u0020\u0028\u0025\u0064\u0020\u0021\u003d\u0020\u0025\u0064\u0029",len (d1 .Keys ()),len (d2 .Keys ()));_b .Log .Debug ("\u0057\u0061s\u0020\u0027\u0025s\u0027\u0020\u0076\u0073\u0020\u0027\u0025\u0073\u0027",d1 .WriteString (),d2 .WriteString ());return false ;};for _ ,_acg :=range d1 .Keys (){if _acg =="\u0050\u0061\u0072\u0065\u006e\u0074"{continue ;};_fced :=_eg .TraceToDirectObject (d1 .Get (_acg ));_bgb :=_eg .TraceToDirectObject (d2 .Get (_acg ));if _fced ==nil {_b .Log .Debug ("\u00761\u0020\u0069\u0073\u0020\u006e\u0069l");return false ;};if _bgb ==nil {_b .Log .Debug ("\u00762\u0020\u0069\u0073\u0020\u006e\u0069l");return false ;};switch _egc :=_fced .(type ){case *_eg .PdfObjectDictionary :_fdfc ,_gb :=_bgb .(*_eg .PdfObjectDictionary );if !_gb {_b .Log .Debug ("\u0054\u0079\u0070\u0065 m\u0069\u0073\u006d\u0061\u0074\u0063\u0068\u0020\u0025\u0054\u0020\u0076\u0073\u0020%\u0054",_fced ,_bgb );return false ;};if !CompareDictionariesDeep (_egc ,_fdfc ){return false ;};continue ;case *_eg .PdfObjectArray :_deg ,_def :=_bgb .(*_eg .PdfObjectArray );if !_def {_b .Log .Debug ("\u00762\u0020n\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");return false ;};if _egc .Len ()!=_deg .Len (){_b .Log .Debug ("\u0061\u0072\u0072\u0061\u0079\u0020\u006c\u0065\u006e\u0067\u0074\u0068\u0020\u006d\u0069s\u006da\u0074\u0063\u0068\u0020\u0028\u0025\u0064\u0020\u0021\u003d\u0020\u0025\u0064\u0029",_egc .Len (),_deg .Len ());return false ;};for _eafg :=0;_eafg < _egc .Len ();_eafg ++{_ffc :=_eg .TraceToDirectObject (_egc .Get (_eafg ));_fac :=_eg .TraceToDirectObject (_deg .Get (_eafg ));if _cada ,_gc :=_ffc .(*_eg .PdfObjectDictionary );_gc {_bgg ,_abd :=_fac .(*_eg .PdfObjectDictionary );if !_abd {return false ;};if !CompareDictionariesDeep (_cada ,_bgg ){return false ;};}else {if _ffc .WriteString ()!=_fac .WriteString (){_b .Log .Debug ("M\u0069\u0073\u006d\u0061tc\u0068 \u0027\u0025\u0073\u0027\u0020!\u003d\u0020\u0027\u0025\u0073\u0027",_ffc .WriteString (),_fac .WriteString ());return false ;};};};continue ;};if _fced .String ()!=_bgb .String (){_b .Log .Debug ("\u006b\u0065y\u003d\u0025\u0073\u0020\u004d\u0069\u0073\u006d\u0061\u0074\u0063\u0068\u0021\u0020\u0027\u0025\u0073\u0027\u0020\u0021\u003d\u0020'%\u0073\u0027",_acg ,_fced .String (),_bgb .String ());_b .Log .Debug ("\u0046o\u0072 \u0027\u0025\u0054\u0027\u0020\u002d\u0020\u0027\u0025\u0054\u0027",_fced ,_bgb );_b .Log .Debug ("\u0046\u006f\u0072\u0020\u0027\u0025\u002b\u0076\u0027\u0020\u002d\u0020'\u0025\u002b\u0076\u0027",_fced ,_bgb );return false ;};};return true ;};func CopyFile (src ,dst string )error {_bg ,_dg :=_fb .Open (src );if _dg !=nil {return _dg ;};defer _bg .Close ();_ac ,_dg :=_fb .Create (dst );if _dg !=nil {return _dg ;};defer _ac .Close ();_ ,_dg =_fa .Copy (_ac ,_bg );return _dg ;}; |