mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-27 13:48:51 +08:00
39 lines
8.8 KiB
Go
39 lines
8.8 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 (_c "crypto/md5";_ce "encoding/hex";_ff "errors";_cb "fmt";_gg "github.com/unidoc/unipdf/v3/common";_gc "github.com/unidoc/unipdf/v3/core";_fc "image";_a "image/png";_gd "io";_fb "os";_e "os/exec";_ge "path/filepath";_fe "strings";
|
|
_f "testing";);func _dcfg (_dca _gc .PdfObject ,_dg map[int64 ]_gc .PdfObject )error {switch _fbfd :=_dca .(type ){case *_gc .PdfIndirectObject :_fde :=_fbfd ;_dcfg (_fde .PdfObject ,_dg );case *_gc .PdfObjectDictionary :_aag :=_fbfd ;for _ ,_bce :=range _aag .Keys (){_dade :=_aag .Get (_bce );
|
|
if _efd ,_agd :=_dade .(*_gc .PdfObjectReference );_agd {_fbfc ,_ba :=_dg [_efd .ObjectNumber ];if !_ba {return _ff .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");
|
|
};_aag .Set (_bce ,_fbfc );}else {_dcfg (_dade ,_dg );};};case *_gc .PdfObjectArray :_dce :=_fbfd ;for _cg ,_dac :=range _dce .Elements (){if _def ,_ead :=_dac .(*_gc .PdfObjectReference );_ead {_dcd ,_efdb :=_dg [_def .ObjectNumber ];if !_efdb {return _ff .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");
|
|
};_dce .Set (_cg ,_dcd );}else {_dcfg (_dac ,_dg );};};};return nil ;};func ReadPNG (file string )(_fc .Image ,error ){_cd ,_dc :=_fb .Open (file );if _dc !=nil {return nil ,_dc ;};defer _cd .Close ();return _a .Decode (_cd );};var (ErrRenderNotSupported =_ff .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 CompareDictionariesDeep (d1 ,d2 *_gc .PdfObjectDictionary )bool {if len (d1 .Keys ())!=len (d2 .Keys ()){_gg .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 ()));
|
|
_gg .Log .Debug ("\u0057\u0061s\u0020\u0027\u0025s\u0027\u0020\u0076\u0073\u0020\u0027\u0025\u0073\u0027",d1 .WriteString (),d2 .WriteString ());return false ;};for _ ,_ggff :=range d1 .Keys (){if _ggff =="\u0050\u0061\u0072\u0065\u006e\u0074"{continue ;
|
|
};_fac :=_gc .TraceToDirectObject (d1 .Get (_ggff ));_gdc :=_gc .TraceToDirectObject (d2 .Get (_ggff ));if _fac ==nil {_gg .Log .Debug ("\u00761\u0020\u0069\u0073\u0020\u006e\u0069l");return false ;};if _gdc ==nil {_gg .Log .Debug ("\u00762\u0020\u0069\u0073\u0020\u006e\u0069l");
|
|
return false ;};switch _ca :=_fac .(type ){case *_gc .PdfObjectDictionary :_gad ,_dea :=_gdc .(*_gc .PdfObjectDictionary );if !_dea {_gg .Log .Debug ("\u0054\u0079\u0070\u0065 m\u0069\u0073\u006d\u0061\u0074\u0063\u0068\u0020\u0025\u0054\u0020\u0076\u0073\u0020%\u0054",_fac ,_gdc );
|
|
return false ;};if !CompareDictionariesDeep (_ca ,_gad ){return false ;};continue ;case *_gc .PdfObjectArray :_df ,_fee :=_gdc .(*_gc .PdfObjectArray );if !_fee {_gg .Log .Debug ("\u00762\u0020n\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");
|
|
return false ;};if _ca .Len ()!=_df .Len (){_gg .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",_ca .Len (),_df .Len ());
|
|
return false ;};for _ccg :=0;_ccg < _ca .Len ();_ccg ++{_bg :=_gc .TraceToDirectObject (_ca .Get (_ccg ));_bcge :=_gc .TraceToDirectObject (_df .Get (_ccg ));if _dfa ,_gf :=_bg .(*_gc .PdfObjectDictionary );_gf {_aeg ,_gca :=_bcge .(*_gc .PdfObjectDictionary );
|
|
if !_gca {return false ;};if !CompareDictionariesDeep (_dfa ,_aeg ){return false ;};}else {if _bg .WriteString ()!=_bcge .WriteString (){_gg .Log .Debug ("M\u0069\u0073\u006d\u0061tc\u0068 \u0027\u0025\u0073\u0027\u0020!\u003d\u0020\u0027\u0025\u0073\u0027",_bg .WriteString (),_bcge .WriteString ());
|
|
return false ;};};};continue ;};if _fac .String ()!=_gdc .String (){_gg .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",_ggff ,_fac .String (),_gdc .String ());
|
|
_gg .Log .Debug ("\u0046o\u0072 \u0027\u0025\u0054\u0027\u0020\u002d\u0020\u0027\u0025\u0054\u0027",_fac ,_gdc );_gg .Log .Debug ("\u0046\u006f\u0072\u0020\u0027\u0025\u002b\u0076\u0027\u0020\u002d\u0020'\u0025\u002b\u0076\u0027",_fac ,_gdc );return false ;
|
|
};};return true ;};func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;};if _ ,_bcb :=_e .LookPath ("\u0067\u0073");_bcb !=nil {return ErrRenderNotSupported ;};return _e .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_cb .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run ();
|
|
};func CopyFile (src ,dst string )error {_ggf ,_feb :=_fb .Open (src );if _feb !=nil {return _feb ;};defer _ggf .Close ();_ef ,_feb :=_fb .Create (dst );if _feb !=nil {return _feb ;};defer _ef .Close ();_ ,_feb =_gd .Copy (_ef ,_ggf );return _feb ;};func CompareImages (img1 ,img2 _fc .Image )(bool ,error ){_b :=img1 .Bounds ();
|
|
_cef :=0;for _fd :=0;_fd < _b .Size ().X ;_fd ++{for _dcf :=0;_dcf < _b .Size ().Y ;_dcf ++{_fg ,_bf ,_fec ,_ :=img1 .At (_fd ,_dcf ).RGBA ();_aaa ,_bb ,_fdg ,_ :=img2 .At (_fd ,_dcf ).RGBA ();if _fg !=_aaa ||_bf !=_bb ||_fec !=_fdg {_cef ++;};};};_bc :=float64 (_cef )/float64 (_b .Dx ()*_b .Dy ());
|
|
if _bc > 0.0001{_cb .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_bc ,_cef );return false ,nil ;};return true ,nil ;};func ParseIndirectObjects (rawpdf string )(map[int64 ]_gc .PdfObject ,error ){_fbf :=_gc .NewParserFromString (rawpdf );
|
|
_cc :=map[int64 ]_gc .PdfObject {};for {_ggc ,_cea :=_fbf .ParseIndirectObject ();if _cea !=nil {if _cea ==_gd .EOF {break ;};return nil ,_cea ;};switch _gbb :=_ggc .(type ){case *_gc .PdfIndirectObject :_cc [_gbb .ObjectNumber ]=_ggc ;case *_gc .PdfObjectStream :_cc [_gbb .ObjectNumber ]=_ggc ;
|
|
};};for _ ,_ae :=range _cc {_dcfg (_ae ,_cc );};return _cc ,nil ;};func RunRenderTest (t *_f .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ){_dad :=_fe .TrimSuffix (_ge .Base (pdfPath ),_ge .Ext (pdfPath ));t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_ec *_f .T ){_ega :=_ge .Join (outputDir ,_dad );
|
|
_fcd :=_ega +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _cdg :=RenderPDFToPNGs (pdfPath ,0,_fcd );_cdg !=nil {_ec .Skip (_cdg );};for _fa :=1;true ;_fa ++{_gag :=_cb .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_ega ,_fa );_dbd :=_ge .Join (baselineRenderPath ,_cb .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_dad ,_fa ));
|
|
if _ ,_gcc :=_fb .Stat (_gag );_gcc !=nil {break ;};_ec .Logf ("\u0025\u0073",_dbd );if saveBaseline {_ec .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_gag ,_dbd );_egc :=CopyFile (_gag ,_dbd );if _egc !=nil {_ec .Fatalf ("\u0045\u0052\u0052OR\u0020\u0063\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0025\u0073\u003a\u0020\u0025\u0076",_dbd ,_egc );
|
|
};continue ;};_ec .Run (_cb .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_fa ),func (_bd *_f .T ){_bd .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_gag ,_dbd );_ag ,_ecg :=ComparePNGFiles (_gag ,_dbd );
|
|
if _fb .IsNotExist (_ecg ){_bd .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_ag {_bd .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");
|
|
};});};});};func HashFile (file string )(string ,error ){_aa ,_db :=_fb .Open (file );if _db !=nil {return "",_db ;};defer _aa .Close ();_ggd :=_c .New ();if _ ,_db =_gd .Copy (_ggd ,_aa );_db !=nil {return "",_db ;};return _ce .EncodeToString (_ggd .Sum (nil )),nil ;
|
|
};func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_da ,_ea :=HashFile (file1 );if _ea !=nil {return false ,_ea ;};_gb ,_ea :=HashFile (file2 );if _ea !=nil {return false ,_ea ;};if _da ==_gb {return true ,nil ;};_bcg ,_ea :=ReadPNG (file1 );if _ea !=nil {return false ,_ea ;
|
|
};_ac ,_ea :=ReadPNG (file2 );if _ea !=nil {return false ,_ea ;};if _bcg .Bounds ()!=_ac .Bounds (){return false ,nil ;};return CompareImages (_bcg ,_ac );}; |