mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-27 13:48:51 +08:00
40 lines
8.9 KiB
Go
40 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 (_b "crypto/md5";_gb "encoding/hex";_ba "errors";_adg "fmt";_ab "github.com/unidoc/unipdf/v3/common";_ea "github.com/unidoc/unipdf/v3/core";_ge "image";_bc "image/png";_ca "io";_gg "os";_g "os/exec";_e "path/filepath";_ad "strings";
|
|
_c "testing";);func HashFile (file string )(string ,error ){_cb ,_dc :=_gg .Open (file );if _dc !=nil {return "",_dc ;};defer _cb .Close ();_cbd :=_b .New ();if _ ,_dc =_ca .Copy (_cbd ,_cb );_dc !=nil {return "",_dc ;};return _gb .EncodeToString (_cbd .Sum (nil )),nil ;
|
|
};func RunRenderTest (t *_c .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ){_da :=_ad .TrimSuffix (_e .Base (pdfPath ),_e .Ext (pdfPath ));t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_baf *_c .T ){_dae :=_e .Join (outputDir ,_da );
|
|
_dca :=_dae +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _ed :=RenderPDFToPNGs (pdfPath ,0,_dca );_ed !=nil {_baf .Skip (_ed );};for _df :=1;true ;_df ++{_ceaf :=_adg .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_dae ,_df );_fege :=_e .Join (baselineRenderPath ,_adg .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_da ,_df ));
|
|
if _ ,_ec :=_gg .Stat (_ceaf );_ec !=nil {break ;};_baf .Logf ("\u0025\u0073",_fege );if saveBaseline {_baf .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_ceaf ,_fege );_ef :=CopyFile (_ceaf ,_fege );if _ef !=nil {_baf .Fatalf ("\u0045\u0052\u0052OR\u0020\u0063\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0025\u0073\u003a\u0020\u0025\u0076",_fege ,_ef );
|
|
};continue ;};_baf .Run (_adg .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_df ),func (_bb *_c .T ){_bb .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_ceaf ,_fege );_eaad ,_gdd :=ComparePNGFiles (_ceaf ,_fege );
|
|
if _gg .IsNotExist (_gdd ){_bb .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_eaad {_bb .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");
|
|
};});};});};func ReadPNG (file string )(_ge .Image ,error ){_ead ,_ce :=_gg .Open (file );if _ce !=nil {return nil ,_ce ;};defer _ead .Close ();return _bc .Decode (_ead );};func CompareImages (img1 ,img2 _ge .Image )(bool ,error ){_ggf :=img1 .Bounds ();
|
|
_db :=0;for _ee :=0;_ee < _ggf .Size ().X ;_ee ++{for _fc :=0;_fc < _ggf .Size ().Y ;_fc ++{_fe ,_bae ,_fb ,_ :=img1 .At (_ee ,_fc ).RGBA ();_fbg ,_fcg ,_fa ,_ :=img2 .At (_ee ,_fc ).RGBA ();if _fe !=_fbg ||_bae !=_fcg ||_fb !=_fa {_db ++;};};};_gf :=float64 (_db )/float64 (_ggf .Dx ()*_ggf .Dy ());
|
|
if _gf > 0.0001{_adg .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_gf ,_db );return false ,nil ;};return true ,nil ;};func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_ff ,_eeg :=HashFile (file1 );
|
|
if _eeg !=nil {return false ,_eeg ;};_ac ,_eeg :=HashFile (file2 );if _eeg !=nil {return false ,_eeg ;};if _ff ==_ac {return true ,nil ;};_bd ,_eeg :=ReadPNG (file1 );if _eeg !=nil {return false ,_eeg ;};_dcc ,_eeg :=ReadPNG (file2 );if _eeg !=nil {return false ,_eeg ;
|
|
};if _bd .Bounds ()!=_dcc .Bounds (){return false ,nil ;};return CompareImages (_bd ,_dcc );};func ParseIndirectObjects (rawpdf string )(map[int64 ]_ea .PdfObject ,error ){_gc :=_ea .NewParserFromString (rawpdf );_gdg :=map[int64 ]_ea .PdfObject {};for {_eb ,_aa :=_gc .ParseIndirectObject ();
|
|
if _aa !=nil {if _aa ==_ca .EOF {break ;};return nil ,_aa ;};switch _gcb :=_eb .(type ){case *_ea .PdfIndirectObject :_gdg [_gcb .ObjectNumber ]=_eb ;case *_ea .PdfObjectStream :_gdg [_gcb .ObjectNumber ]=_eb ;};};for _ ,_fcc :=range _gdg {_dfb (_fcc ,_gdg );
|
|
};return _gdg ,nil ;};func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;};if _ ,_dcb :=_g .LookPath ("\u0067\u0073");_dcb !=nil {return ErrRenderNotSupported ;};return _g .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_adg .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run ();
|
|
};var (ErrRenderNotSupported =_ba .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 CopyFile (src ,dst string )error {_f ,_gd :=_gg .Open (src );if _gd !=nil {return _gd ;};defer _f .Close ();_d ,_gd :=_gg .Create (dst );if _gd !=nil {return _gd ;};defer _d .Close ();_ ,_gd =_ca .Copy (_d ,_f );return _gd ;};func _dfb (_bde _ea .PdfObject ,_gcbe map[int64 ]_ea .PdfObject )error {switch _gac :=_bde .(type ){case *_ea .PdfIndirectObject :_fd :=_gac ;
|
|
_dfb (_fd .PdfObject ,_gcbe );case *_ea .PdfObjectDictionary :_eee :=_gac ;for _ ,_ebe :=range _eee .Keys (){_be :=_eee .Get (_ebe );if _bf ,_ebb :=_be .(*_ea .PdfObjectReference );_ebb {_gaa ,_fbe :=_gcbe [_bf .ObjectNumber ];if !_fbe {return _ba .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");
|
|
};_eee .Set (_ebe ,_gaa );}else {_dfb (_be ,_gcbe );};};case *_ea .PdfObjectArray :_dad :=_gac ;for _adc ,_feb :=range _dad .Elements (){if _gdf ,_beg :=_feb .(*_ea .PdfObjectReference );_beg {_de ,_eag :=_gcbe [_gdf .ObjectNumber ];if !_eag {return _ba .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");
|
|
};_dad .Set (_adc ,_de );}else {_dfb (_feb ,_gcbe );};};};return nil ;};func CompareDictionariesDeep (d1 ,d2 *_ea .PdfObjectDictionary )bool {if len (d1 .Keys ())!=len (d2 .Keys ()){_ab .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 ()));
|
|
_ab .Log .Debug ("\u0057\u0061s\u0020\u0027\u0025s\u0027\u0020\u0076\u0073\u0020\u0027\u0025\u0073\u0027",d1 .WriteString (),d2 .WriteString ());return false ;};for _ ,_eg :=range d1 .Keys (){if _eg =="\u0050\u0061\u0072\u0065\u006e\u0074"{continue ;};
|
|
_edf :=_ea .TraceToDirectObject (d1 .Get (_eg ));_gea :=_ea .TraceToDirectObject (d2 .Get (_eg ));if _edf ==nil {_ab .Log .Debug ("\u00761\u0020\u0069\u0073\u0020\u006e\u0069l");return false ;};if _gea ==nil {_ab .Log .Debug ("\u00762\u0020\u0069\u0073\u0020\u006e\u0069l");
|
|
return false ;};switch _fce :=_edf .(type ){case *_ea .PdfObjectDictionary :_fea ,_ged :=_gea .(*_ea .PdfObjectDictionary );if !_ged {_ab .Log .Debug ("\u0054\u0079\u0070\u0065 m\u0069\u0073\u006d\u0061\u0074\u0063\u0068\u0020\u0025\u0054\u0020\u0076\u0073\u0020%\u0054",_edf ,_gea );
|
|
return false ;};if !CompareDictionariesDeep (_fce ,_fea ){return false ;};continue ;case *_ea .PdfObjectArray :_gfg ,_bafc :=_gea .(*_ea .PdfObjectArray );if !_bafc {_ab .Log .Debug ("\u00762\u0020n\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");
|
|
return false ;};if _fce .Len ()!=_gfg .Len (){_ab .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",_fce .Len (),_gfg .Len ());
|
|
return false ;};for _fef :=0;_fef < _fce .Len ();_fef ++{_fbed :=_ea .TraceToDirectObject (_fce .Get (_fef ));_bef :=_ea .TraceToDirectObject (_gfg .Get (_fef ));if _gcba ,_ecf :=_fbed .(*_ea .PdfObjectDictionary );_ecf {_dac ,_cc :=_bef .(*_ea .PdfObjectDictionary );
|
|
if !_cc {return false ;};if !CompareDictionariesDeep (_gcba ,_dac ){return false ;};}else {if _fbed .WriteString ()!=_bef .WriteString (){_ab .Log .Debug ("M\u0069\u0073\u006d\u0061tc\u0068 \u0027\u0025\u0073\u0027\u0020!\u003d\u0020\u0027\u0025\u0073\u0027",_fbed .WriteString (),_bef .WriteString ());
|
|
return false ;};};};continue ;};if _edf .String ()!=_gea .String (){_ab .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",_eg ,_edf .String (),_gea .String ());
|
|
_ab .Log .Debug ("\u0046o\u0072 \u0027\u0025\u0054\u0027\u0020\u002d\u0020\u0027\u0025\u0054\u0027",_edf ,_gea );_ab .Log .Debug ("\u0046\u006f\u0072\u0020\u0027\u0025\u002b\u0076\u0027\u0020\u002d\u0020'\u0025\u002b\u0076\u0027",_edf ,_gea );return false ;
|
|
};};return true ;}; |