mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-26 13:48:55 +08:00
39 lines
8.9 KiB
Go
39 lines
8.9 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 (_dd "crypto/md5";_ae "encoding/hex";_db "errors";_ce "fmt";_fc "github.com/unidoc/unipdf/v3/common";_fce "github.com/unidoc/unipdf/v3/core";_aa "image";_b "image/png";_f "io";_g "os";_a "os/exec";_df "path/filepath";_c "strings";
|
|
_ddb "testing";);func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;};if _ ,_aec :=_a .LookPath ("\u0067\u0073");_aec !=nil {return ErrRenderNotSupported ;};return _a .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_ce .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run ();
|
|
};func CopyFile (src ,dst string )error {_gd ,_ac :=_g .Open (src );if _ac !=nil {return _ac ;};defer _gd .Close ();_af ,_ac :=_g .Create (dst );if _ac !=nil {return _ac ;};defer _af .Close ();_ ,_ac =_f .Copy (_af ,_gd );return _ac ;};func ReadPNG (file string )(_aa .Image ,error ){_acf ,_ad :=_g .Open (file );
|
|
if _ad !=nil {return nil ,_ad ;};defer _acf .Close ();return _b .Decode (_acf );};func RunRenderTest (t *_ddb .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ){_aae :=_c .TrimSuffix (_df .Base (pdfPath ),_df .Ext (pdfPath ));t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_dbg *_ddb .T ){_gc :=_df .Join (outputDir ,_aae );
|
|
_cg :=_gc +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _dac :=RenderPDFToPNGs (pdfPath ,0,_cg );_dac !=nil {_dbg .Skip (_dac );};for _bc :=1;true ;_bc ++{_cf :=_ce .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_gc ,_bc );_eb :=_df .Join (baselineRenderPath ,_ce .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_aae ,_bc ));
|
|
if _ ,_ecf :=_g .Stat (_cf );_ecf !=nil {break ;};_dbg .Logf ("\u0025\u0073",_eb );if saveBaseline {_dbg .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_cf ,_eb );_bde :=CopyFile (_cf ,_eb );if _bde !=nil {_dbg .Fatalf ("\u0045\u0052\u0052OR\u0020\u0063\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0025\u0073\u003a\u0020\u0025\u0076",_eb ,_bde );
|
|
};continue ;};_dbg .Run (_ce .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_bc ),func (_dcd *_ddb .T ){_dcd .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_cf ,_eb );_fca ,_bdc :=ComparePNGFiles (_cf ,_eb );
|
|
if _g .IsNotExist (_bdc ){_dcd .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_fca {_dcd .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");
|
|
};});};});};func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_gdf ,_bbc :=HashFile (file1 );if _bbc !=nil {return false ,_bbc ;};_cc ,_bbc :=HashFile (file2 );if _bbc !=nil {return false ,_bbc ;};if _gdf ==_cc {return true ,nil ;};_bbf ,_bbc :=ReadPNG (file1 );
|
|
if _bbc !=nil {return false ,_bbc ;};_beb ,_bbc :=ReadPNG (file2 );if _bbc !=nil {return false ,_bbc ;};if _bbf .Bounds ()!=_beb .Bounds (){return false ,nil ;};return CompareImages (_bbf ,_beb );};func CompareDictionariesDeep (d1 ,d2 *_fce .PdfObjectDictionary )bool {if len (d1 .Keys ())!=len (d2 .Keys ()){_fc .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 ()));
|
|
_fc .Log .Debug ("\u0057\u0061s\u0020\u0027\u0025s\u0027\u0020\u0076\u0073\u0020\u0027\u0025\u0073\u0027",d1 .WriteString (),d2 .WriteString ());return false ;};for _ ,_cd :=range d1 .Keys (){if _cd =="\u0050\u0061\u0072\u0065\u006e\u0074"{continue ;};
|
|
_cca :=_fce .TraceToDirectObject (d1 .Get (_cd ));_aab :=_fce .TraceToDirectObject (d2 .Get (_cd ));if _cca ==nil {_fc .Log .Debug ("\u00761\u0020\u0069\u0073\u0020\u006e\u0069l");return false ;};if _aab ==nil {_fc .Log .Debug ("\u00762\u0020\u0069\u0073\u0020\u006e\u0069l");
|
|
return false ;};switch _abg :=_cca .(type ){case *_fce .PdfObjectDictionary :_ca ,_acca :=_aab .(*_fce .PdfObjectDictionary );if !_acca {_fc .Log .Debug ("\u0054\u0079\u0070\u0065 m\u0069\u0073\u006d\u0061\u0074\u0063\u0068\u0020\u0025\u0054\u0020\u0076\u0073\u0020%\u0054",_cca ,_aab );
|
|
return false ;};if !CompareDictionariesDeep (_abg ,_ca ){return false ;};continue ;case *_fce .PdfObjectArray :_cgb ,_afe :=_aab .(*_fce .PdfObjectArray );if !_afe {_fc .Log .Debug ("\u00762\u0020n\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");
|
|
return false ;};if _abg .Len ()!=_cgb .Len (){_fc .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",_abg .Len (),_cgb .Len ());
|
|
return false ;};for _aba :=0;_aba < _abg .Len ();_aba ++{_ag :=_fce .TraceToDirectObject (_abg .Get (_aba ));_gcd :=_fce .TraceToDirectObject (_cgb .Get (_aba ));if _edd ,_dab :=_ag .(*_fce .PdfObjectDictionary );_dab {_fde ,_bfc :=_gcd .(*_fce .PdfObjectDictionary );
|
|
if !_bfc {return false ;};if !CompareDictionariesDeep (_edd ,_fde ){return false ;};}else {if _ag .WriteString ()!=_gcd .WriteString (){_fc .Log .Debug ("M\u0069\u0073\u006d\u0061tc\u0068 \u0027\u0025\u0073\u0027\u0020!\u003d\u0020\u0027\u0025\u0073\u0027",_ag .WriteString (),_gcd .WriteString ());
|
|
return false ;};};};continue ;};if _cca .String ()!=_aab .String (){_fc .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",_cd ,_cca .String (),_aab .String ());
|
|
_fc .Log .Debug ("\u0046o\u0072 \u0027\u0025\u0054\u0027\u0020\u002d\u0020\u0027\u0025\u0054\u0027",_cca ,_aab );_fc .Log .Debug ("\u0046\u006f\u0072\u0020\u0027\u0025\u002b\u0076\u0027\u0020\u002d\u0020'\u0025\u002b\u0076\u0027",_cca ,_aab );return false ;
|
|
};};return true ;};func HashFile (file string )(string ,error ){_fd ,_da :=_g .Open (file );if _da !=nil {return "",_da ;};defer _fd .Close ();_ge :=_dd .New ();if _ ,_da =_f .Copy (_ge ,_fd );_da !=nil {return "",_da ;};return _ae .EncodeToString (_ge .Sum (nil )),nil ;
|
|
};func _fcf (_ab _fce .PdfObject ,_acb map[int64 ]_fce .PdfObject )error {switch _bbfa :=_ab .(type ){case *_fce .PdfIndirectObject :_fa :=_bbfa ;_fcf (_fa .PdfObject ,_acb );case *_fce .PdfObjectDictionary :_fb :=_bbfa ;for _ ,_adfc :=range _fb .Keys (){_aad :=_fb .Get (_adfc );
|
|
if _gg ,_dgf :=_aad .(*_fce .PdfObjectReference );_dgf {_acc ,_bgf :=_acb [_gg .ObjectNumber ];if !_bgf {return _db .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");
|
|
};_fb .Set (_adfc ,_acc );}else {_fcf (_aad ,_acb );};};case *_fce .PdfObjectArray :_dcg :=_bbfa ;for _ff ,_dfae :=range _dcg .Elements (){if _bf ,_aca :=_dfae .(*_fce .PdfObjectReference );_aca {_bca ,_aef :=_acb [_bf .ObjectNumber ];if !_aef {return _db .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");
|
|
};_dcg .Set (_ff ,_bca );}else {_fcf (_dfae ,_acb );};};};return nil ;};var (ErrRenderNotSupported =_db .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 ParseIndirectObjects (rawpdf string )(map[int64 ]_fce .PdfObject ,error ){_ee :=_fce .NewParserFromString (rawpdf );_feg :=map[int64 ]_fce .PdfObject {};for {_afg ,_fgg :=_ee .ParseIndirectObject ();if _fgg !=nil {if _fgg ==_f .EOF {break ;};return nil ,_fgg ;
|
|
};switch _dfb :=_afg .(type ){case *_fce .PdfIndirectObject :_feg [_dfb .ObjectNumber ]=_afg ;case *_fce .PdfObjectStream :_feg [_dfb .ObjectNumber ]=_afg ;};};for _ ,_fdb :=range _feg {_fcf (_fdb ,_feg );};return _feg ,nil ;};func CompareImages (img1 ,img2 _aa .Image )(bool ,error ){_be :=img1 .Bounds ();
|
|
_beg :=0;for _bd :=0;_bd < _be .Size ().X ;_bd ++{for _dg :=0;_dg < _be .Size ().Y ;_dg ++{_ga ,_gf ,_fdf ,_ :=img1 .At (_bd ,_dg ).RGBA ();_dgb ,_dc ,_fg ,_ :=img2 .At (_bd ,_dg ).RGBA ();if _ga !=_dgb ||_gf !=_dc ||_fdf !=_fg {_beg ++;};};};_bb :=float64 (_beg )/float64 (_be .Dx ()*_be .Dy ());
|
|
if _bb > 0.0001{_ce .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_bb ,_beg );return false ,nil ;};return true ,nil ;}; |