From 06253966e4726beff15c969075a20894648a8610 Mon Sep 17 00:00:00 2001 From: mvantzet Date: Fri, 13 Jan 2023 12:35:25 +0100 Subject: [PATCH 1/3] Added Letter properties RenderingMode, StrokeColor, FillColor and added those as mandatory constructor arguments. Kept property Color, which contains either StrokeColor (if rendering mode is Stroke) or FillColor (for all other rendering modes). In PdfPageBuilder opted for default text rendering mode "Fill" which seems like a sensible default. --- .../DuplicateOverlappingTextProcessor.cs | 4 +- .../ContentOrderTextExtractor.cs | 4 +- src/UglyToad.PdfPig/Content/Letter.cs | 39 +++++++++++++++++-- .../Graphics/ContentStreamProcessor.cs | 35 +++++------------ src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs | 11 +++++- 5 files changed, 62 insertions(+), 31 deletions(-) diff --git a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/DuplicateOverlappingTextProcessor.cs b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/DuplicateOverlappingTextProcessor.cs index b3e3e2b1..e6900dfe 100644 --- a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/DuplicateOverlappingTextProcessor.cs +++ b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/DuplicateOverlappingTextProcessor.cs @@ -77,7 +77,9 @@ letter.Width, letter.FontSize, fontDetails, - letter.Color, + letter.RenderingMode, + letter.StrokeColor, + letter.FillColor, letter.PointSize, letter.TextSequence); diff --git a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/TextExtractor/ContentOrderTextExtractor.cs b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/TextExtractor/ContentOrderTextExtractor.cs index 8766a694..80f5f58a 100644 --- a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/TextExtractor/ContentOrderTextExtractor.cs +++ b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/TextExtractor/ContentOrderTextExtractor.cs @@ -65,7 +65,9 @@ letter.Width, letter.FontSize, letter.Font, - letter.Color, + letter.RenderingMode, + letter.StrokeColor, + letter.FillColor, letter.PointSize, letter.TextSequence); } diff --git a/src/UglyToad.PdfPig/Content/Letter.cs b/src/UglyToad.PdfPig/Content/Letter.cs index b15ea4f3..08abfcd3 100644 --- a/src/UglyToad.PdfPig/Content/Letter.cs +++ b/src/UglyToad.PdfPig/Content/Letter.cs @@ -61,12 +61,33 @@ /// Details about the font for this letter. /// public FontDetails Font { get; } + + /// + /// Text rendering mode that indicates whether we should draw this letter's strokes, + /// fill, both, neither (in case of hidden text), etc. + /// If it calls for stroking the is used. + /// If it calls for filling, the is used. + /// In modes that perform both filling and stroking, the effect is as if each glyph outline were filled and then stroked in separate operations. + /// + public TextRenderingMode RenderingMode { get; } /// - /// The color of the letter. + /// The primary color of the letter, which is either the in case + /// is , or otherwise + /// it is the . /// public IColor Color { get; } + /// + /// Stroking color + /// + public IColor StrokeColor { get; } + + /// + /// Non-stroking (fill) color + /// + public IColor FillColor { get; } + /// /// The size of the font in points. /// @@ -86,7 +107,9 @@ double width, double fontSize, FontDetails font, - IColor color, + TextRenderingMode renderingMode, + IColor strokeColor, + IColor fillColor, double pointSize, int textSequence) { @@ -97,7 +120,17 @@ Width = width; FontSize = fontSize; Font = font; - Color = color ?? GrayColor.Black; + RenderingMode = renderingMode; + if (renderingMode == TextRenderingMode.Stroke) + { + Color = StrokeColor = strokeColor ?? GrayColor.Black; + FillColor = fillColor; + } + else + { + Color = FillColor = fillColor ?? GrayColor.Black; + StrokeColor = strokeColor; + } PointSize = pointSize; TextSequence = textSequence; TextOrientation = GetTextOrientation(); diff --git a/src/UglyToad.PdfPig/Graphics/ContentStreamProcessor.cs b/src/UglyToad.PdfPig/Graphics/ContentStreamProcessor.cs index 1e5efffd..7759c9cc 100644 --- a/src/UglyToad.PdfPig/Graphics/ContentStreamProcessor.cs +++ b/src/UglyToad.PdfPig/Graphics/ContentStreamProcessor.cs @@ -292,14 +292,7 @@ var transformedPdfBounds = PerformantRectangleTransformer .Transform(renderingMatrix, textMatrix, transformationMatrix, new PdfRectangle(0, 0, boundingBox.Width, 0)); - // If the text rendering mode calls for filling, the current nonstroking color in the graphics state is used; - // if it calls for stroking, the current stroking color is used. - // In modes that perform both filling and stroking, the effect is as if each glyph outline were filled and then stroked in separate operations. - // TODO: expose color as something more advanced - var color = currentState.FontState.TextRenderingMode != TextRenderingMode.Stroke - ? currentState.CurrentNonStrokingColor - : currentState.CurrentStrokingColor; - + Letter letter = null; if (Diacritics.IsInCombiningDiacriticRange(unicode) && bytes.CurrentOffset > 0 && letters.Count > 0) { @@ -319,26 +312,16 @@ attachTo.Width, attachTo.FontSize, attachTo.Font, - attachTo.Color, + attachTo.RenderingMode, + attachTo.StrokeColor, + attachTo.FillColor, attachTo.PointSize, attachTo.TextSequence); } - else - { - letter = new Letter( - unicode, - transformedGlyphBounds, - transformedPdfBounds.BottomLeft, - transformedPdfBounds.BottomRight, - transformedPdfBounds.Width, - fontSize, - font.Details, - color, - pointSize, - textSequence); - } } - else + + // If we did not create a letter for a combined diacritic, create one here. + if (letter == null) { letter = new Letter( unicode, @@ -348,7 +331,9 @@ transformedPdfBounds.Width, fontSize, font.Details, - color, + currentState.FontState.TextRenderingMode, + currentState.CurrentStrokingColor, + currentState.CurrentNonStrokingColor, pointSize, textSequence); } diff --git a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs index c814f75b..7552a9ac 100644 --- a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs +++ b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs @@ -895,7 +895,16 @@ var documentSpace = textMatrix.Transform(renderingMatrix.Transform(fontMatrix.Transform(rect))); - var letter = new Letter(c.ToString(), documentSpace, advanceRect.BottomLeft, advanceRect.BottomRight, width, (double)fontSize, FontDetails.GetDefault(name), + var letter = new Letter( + c.ToString(), + documentSpace, + advanceRect.BottomLeft, + advanceRect.BottomRight, + width, + (double)fontSize, + FontDetails.GetDefault(name), + TextRenderingMode.Fill, + GrayColor.Black, GrayColor.Black, (double)fontSize, textSequence); From 2acca329874679f787ab754d5369c620c7ac3f28 Mon Sep 17 00:00:00 2001 From: mvantzet Date: Fri, 13 Jan 2023 14:11:13 +0100 Subject: [PATCH 2/3] Added integration test to see if we can detect the presence of invisible text (text rendering mode = Neither), visible text, the presence of images and the presence of paths. Certain combinations thereof potentially must be run through OCR. --- .../Documents/Various Content Types.pdf | Bin 0 -> 31327 bytes .../Integration/PageContentTests.cs | 24 ++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/UglyToad.PdfPig.Tests/Integration/Documents/Various Content Types.pdf create mode 100644 src/UglyToad.PdfPig.Tests/Integration/PageContentTests.cs diff --git a/src/UglyToad.PdfPig.Tests/Integration/Documents/Various Content Types.pdf b/src/UglyToad.PdfPig.Tests/Integration/Documents/Various Content Types.pdf new file mode 100644 index 0000000000000000000000000000000000000000..19c833951ee40368337d6e52ba310733892c575c GIT binary patch literal 31327 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 literal 0 HcmV?d00001 diff --git a/src/UglyToad.PdfPig.Tests/Integration/PageContentTests.cs b/src/UglyToad.PdfPig.Tests/Integration/PageContentTests.cs new file mode 100644 index 00000000..222c74a0 --- /dev/null +++ b/src/UglyToad.PdfPig.Tests/Integration/PageContentTests.cs @@ -0,0 +1,24 @@ +namespace UglyToad.PdfPig.Tests.Integration +{ + using PdfPig.Core; + using Xunit; + + public class PageContentTests + { + [Fact] + public void DetectPageContents() + { + var file = IntegrationHelpers.GetDocumentPath("Various Content Types"); + + using (var document = PdfDocument.Open(file, ParsingOptions.LenientParsingOff)) + { + var page = document.GetPage(1); + var letters = page.Letters; + Assert.Contains(letters, l => l.RenderingMode == TextRenderingMode.Stroke); // "REGULAR TEXT" + Assert.Contains(letters, l => l.RenderingMode == TextRenderingMode.Neither); // "INVISIBLE TEXT" + Assert.NotEmpty(page.Content.GetImages()); + Assert.NotEmpty(page.Content.Paths); + } + } + } +} From 3a848c090cb9d91bb376f08babcd4fccfff3f600 Mon Sep 17 00:00:00 2001 From: Fred Natzke Date: Thu, 16 Feb 2023 15:55:42 +1000 Subject: [PATCH 3/3] Fix for Issue#549. Skip over Jpg segments rather than use bruce force to find segment start marker --- ...7-ccb746b0-dc28-4616-bcb1-4ad685f81876.jpg | Bin 0 -> 103299 bytes .../Images/JpegHandlerTests.cs | 38 ++++++++++++++++++ .../UglyToad.PdfPig.Tests.csproj | 5 --- src/UglyToad.PdfPig/Images/JpegHandler.cs | 18 ++++++++- 4 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 src/UglyToad.PdfPig.Tests/Images/Files/Jpg/218995467-ccb746b0-dc28-4616-bcb1-4ad685f81876.jpg create mode 100644 src/UglyToad.PdfPig.Tests/Images/JpegHandlerTests.cs diff --git a/src/UglyToad.PdfPig.Tests/Images/Files/Jpg/218995467-ccb746b0-dc28-4616-bcb1-4ad685f81876.jpg b/src/UglyToad.PdfPig.Tests/Images/Files/Jpg/218995467-ccb746b0-dc28-4616-bcb1-4ad685f81876.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9875e942bf601903f569a5f48a1d32a94c17ef0 GIT binary patch literal 103299 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≺vDM^&rNT1sWRzHJc=W(p(RK|EA+ zytfiZmj*~nA^HHVZFkIB`R`@96Z#NPKy{HC*9|eim_Bb zwTEQ+G{$OiYN^k6KhDY@IT@^4%EKb2z!9QOCKkol%tXf8agkI0qf{dU&?uxwMdW#g z&yJhw$XX}yMs~-!$-xJ6!x0wBCutH#M_uJ2y&VJn@zeP|Z$`fJnrN!qpIr zSM#-oca|97u0Gkr+q1qngj=ES?9#)JBGi|V%0ec#k;#7t0;egVwwS(2>XWf~f@;wgNs!Fnl` z#Knw)n-Vf(=XCN=$!Q%H5ZtFwCwAiTt(6-)zC>;zXQoT?Xg6sju%?T`g{9r`Y)F5` z<1_CHrAF6uPrPQK9S5y!)m=|TmELomJ@3pDojU5zz8)p)@zjHh1#jn=y!!5jwpu!g zzL{f4l%1qxj%Bc1g#JaZR_*adaR+KZHuG!KFXRPv4yy9pmAPL02c&6}UufXblG^(d-j!8DLcQu*Z|FFbfmPnDAEpiFMl}WO=#5X9!9dO|m1Aybr z4l{F%PodOi03+`OKj;omM^4`6

9~W(}?(1n>|scj;R6DVme*acxCV%3R5G7CV3^5 zg7VBtP$CQ{J^8~Ql=Tx-t|uLKXW;>RPyKv(MGw@{4Bo-G*2l6h#T-YMEUc0W54Mx$ zF=AboH=kU1Q#TWheaC3=k>$LT!~Vx+Z@utvv2qh&@X`V!C+qN{K3Xf`z& z7MJWJ)hSN}htItGejmCvR0oW*(Et2-KPdWDJ%5%r2L!r=O;dLMP@iI0pM*2i{oJ;} zP~r27S*3qq^3u03`fciFrfRx07?6)#64o1Nc$Qsf>|e99RmZpRUOUC1Z&a0M9-|%} zul=#08l$i?7JTsJ{H+#X^4U<;`9=(H_0`^QXlbj{!g{qJo^>W9Rtw-6J&!`%J!K3;kn%#XO zmd7gA?Z8OtFyV=ZfZDnn}UUts2)zhTxAwGg9tjrtPf@TBXF>tT!GjLO% z5|oZqZ7iQ!Gfh}MC2kzYC`J18I&Gt=iWIj+Fij_|;|QS=^kGaoD)wx9;|oyo0yU!& zBVHiV@V;-P3(;^;^)SbRuqIhIKWc~K65S>jq1ZipNMTANpSFWkRGzwMpO`VSl|oPn z)vGdmtfPFtbUe;*6G?8#m4A^N7i$2;>4p(v9P7tp<&9rGX|6<1GaEzWRVkz0$j3>7 zSA?er810v!Vw|m%C9Zk{7Z;v3^C0`dVJ2Jp*`WdKd2oN^T~61$rv^H)Yf@G`-pNzN zp9OUrropG4k>$WZ!^gb6a;30PCa8v67m+GW9LTDiRU=;~I5`L9ey5)BOeytOKBxyq z;Qr)7E^z%nbC5JyHB@(x$Dz_h38qK}E~MIIYP|i$ z@)EU2r0Oj7#l~fpNa?y)hY{R(soL{&dwxQ)NkO;{qU-AC3c@<6Rrn;Zq6~U*ma&hu z2XfZF0Gi>12RZ%Cv$iiB##!1n5@~#^#kD&ow2*v|x0zBKQ;FSFXI&Oad>d<3E$Vkw zorY2tM!i+g;xoyZuaXIW>j?+?+~h)+I)Yw$hg(j!6(7e>?ZNi_27kn=`mHeP|LXPM z!Y3x>uDjWQdLUyov_?O*?tBemhGAlNGp7i1Lo$_=yX@jqtgw1hs9bn;+Ra;+v9tWR z=Xs?ei05hyA4`g)WJTyEY>A$iG$mOJK4_JTki|v5h*!PcA}5821{7KZUho|X!vKO$ z-Co+H>*|Y!+;|*V5Qa_4I5#G*CiNy=?ESN%1lPaiX|_FJ`*0aXkQ(ef8IaoHZkBCevHFF?JPoXmY2%42zQ9!96BSi$kEn4W&~ zKJ#eO^l&7_k#mEz_LZ0FD5jIr50tPli#_sDudcHT;>+c1939_Ce_$py-B$$L@1%W#cv!D@xe$io-Y#)GyQLx6LRL=gEJUPxV-EFN~dh$^Y z13K+G#p;xRN3i8=9pCdnJ;#ZafJ)az(=G!@flxz;7Xu|)#e3Llal!`|Tlo8pr#z^) zu~-j6%8r50^yl>YJ=Ah6;PrR^yZ_Z$`K>;8-_QS>*kh+<7Bma{1}v#~p<9%k5|k&@ zXq9rj%?)EQ6g))+!=OT|-CmTkHnacG$nE_Ti-Rp&B`wjxtxOMhG2<8fj zn;0@1CMdsUz2j;yEa@n1P3B9F@&okC{7=Rc`}kIHVQchKX5t zrDT%FXOu4`Cq*jljzgWtON4K5Uh{sKTjY6v|c{#OXuRU9@OL5)oe(- zs$kTXPb0X*q#vllLd5DVl}a>wt816dD*TDiURq4_ zkv^SQ8^^&Sw5$O3;E=x`5cEC=I&A+T9vL36zw4K6W%mzm=GnWm4hJcf#we#(R^kf;60dg~js zum79xy>HC?Zz$})0Gd~X@OklaaYHq%_E~ve^63g94KAQXv5LI5T86n}t%BHG=zZB* zbylAwT50oGz(to9sm&#>FB4&-E81AAC3a7w92}uSR7el-GPfu>^M(tv1;PTPA8?H@ zK&&x=#uP`E(^Q=$LlqO*d5LNnFMHJ7aC|cx8!9nGj@ndDq~OiAbD>J?_i!*Q71_CZ zo985&CpoDkteM(Hg*-FC>qSJrXZwK)J{ZNlH)-w~n z@PgEXk*%^&j+__+dUYF?g+wX>Y<#wTPrZgVV}VFa3U$7fE^@1&C%w{LtE_%p{s?cT zAoFvF@yuDowTK!&mEnx4SAgvY-9h0C5aw28B|A@=UzhO!_Zc4G&eb**9xF zHQ#~WT$88QGZegL9inixmpNm&TvhWl3t1kA5SXP9{qkHWT}yvfQC{e+Kq#)AG>!4{ z&Za^zat#uTX>3w^=i(e0&19R~6r<6?J4{CGe=`U9dR`EmEhDX_f{*a#?s`yZq_}&q zW#N1mc_kbh#31gNJd1&39;vC!v#A>IJa!4;Ah*EywPa~4vSBLexnt{y@L2<*4aO+< z?fAMeX(XofP|G7J&_59#&mr)^dr zVfVy%SO_ZTN*avCd7C0r#Im7I1w5b(eFHaqwf_<{_w8#BY;vl!LSGVb&s8*o3Q3LZB$O`1T-TjoCSQ`O317@3nls{@iz}H7( zj@jQIWEPU>GMFRP7(5L!69I5>RLh`CbWrqsKRE0Y{R+&C1b)|xhNi=J>tTDl9ngRZ z!q0`q(1BIQ-OfKoY}Y?dp5Jo&EePU20+4^f%=E2atF(W#Y~i=PXt>r>iIn#XYcCO@ z0K!hjJ{$UHp|pSW=MjGkjQ^{LC`Q!LuaEkZdLr2elb)@M_ce_nE51h0SnH3Bini?s z%px34h$_AGCxWn#_Y?hE+C8^LaF$fodl?Zq$J+}P!FGUBF@)m@fzSucyhxmNVri(lxhnHC zc6w3%s2IY8Ex12xu49yNt~(px%^h7n(egH{T9pb%Y!GRicgu*b*yZ@-g~6O*Rwa zY)_*)#)CIb+kmrXxRI4>M5iO2Q3!*#WEMwAN-QrnzIsibX(l^T+w^=Ae&8Nl0l^cD z4_%*5YXlt^Xzcm$}EM%M4B?8z7m{5_5Kt6lKJNQ!s8R9$x#BDB(MY z=@9;4Dr+ZbYh>e&b<(-*XZo|JO_Kd9;JdMF{Ji|3H(T&gmDKe5_FdtO|BN_-)UrRS zsPl*4i|luz62rn!Sz-7(f+5aoG}?@|k_K>{S-4qwHYmcB3!9V&7G>kZN+4)9uw!%q zqw~Dp*$33z+T+`=Iu@&Vn|X($wNAxL4-m?pt)^e1+m1GY-U8RDT0+rzY%f&aEhPuN zPmLAnHCo1ZjAW0Y1rThac_VnQsGX+u(F)wPf0o#r<= za{g(NQ*Pzjwna<^h1|O%9m2kQEf-7u?surwbEl8IO~z1g`EwwB7S$+Dl||OW*H*yP z%-C0k(|!rea!z_{*y@g&P>O?*4P+hB42$oI7YUs~>pq~Ojk54AdB+s>4R`3Y)+(D5 zkDG(@T>{#0?0C;A7wZx;9tNS=6}gy;9wlM*M%=wY)={XHWuDy@Os3I63|epjs{1Jt zA=jpk9rCxF+AGiVZO8K+v)!w_3QctGiUnFqC0}&H=buAU5U-TJ3&{BbETl&*yjwul zVk=y+cRNm0Er0k}>L|5mOO#h3I&$Sx2?38ev^<5OuR`v8&1gs5 zVt(GmBr8;~mt)QR_G~JO^=XyHqk(&2&-T{CZmlL#9#$w>1!^L=Kr#lS_*;+Id{OWV z!6C9@f>jt&B7H3C_pQFb7aAVF0fqRhtNm}Qg#78@ z^^C22pYMZU{!th}z(duzr6suu{!0Ve0{l6w)BXeEEBjqlPW&|tA(hR}_78vo z()=pvH(6;<2w^r&tampZbaeQ0AUXebeW5U`OqTZDuJ{&QvES#K`E}PN47wC+dVPJ* z7Si=U9k;#_%Y{8$*Yi8z@Q=R?yNBEXq2ga~acFsCA7vO^NyK3Qx4!~Q2c+n*hwn4> zA>Y7S@(*=Q<#nTm(=2_qJ0w1T0bczzxFCrizAG*ENmYNXC6~&KTv6v%6n=SDTNcH4 z9hIw-MKDBzJUGq&Fnj;(KFI&)UH5q>gl5tBx^&w@%5)vJ86tbW3dJMxAI}~&;iTSu;n_~IZU{SgAzoHX zb<=Gq!4p&jX7j<44+UA8ENU1A#1PtNKAoF0Ru#d-ACIqe?pkcFB9%` zyyR=W5Lg5`EjIM7Cpv^Lg_q4PhbXWMBFw>hN1vZ`#xArbzd9t2T8~xZez0%|2Jl{) zS1>1a)!m`Mf6!kzW@woP9B-hq6w4hwEZPwroLy!vtnmS6p*Am1Ykc6sbeigP#+IL2 zfuCZci`_j&!VI`QQdv<18Os%NMG|cCNwrJp#WKpz$XK8`nJD6%vZyg!Ms1`)f?fwC zGyB0E!X0B$O_r53jkuAzF3t;*moyCNJJ83~5h>PWXuErpRF<-H)d00F12MQY_F4d% zhlM5e!L=}NI)&J1&>B!wp7B6G`v!k=&fzKxJ_r4Fl7p=;P7_yc8?b*eQn{jN-^~Ca z0&~~3k$QRWLnUQZ?Msybg|lzZ)X`~vpnj{>N9Na}qYUWp>aN2hw73T>RNhP&uInDK zwV~rMI}~j94EYdQ^tlgoFe0H6GC$?}W>)WsKeocNyMmX9VzRH=kq2|ZYB<+LD}BnhJLN~_Am&EW}O*h^+tN7q&wtx zn`xo)X_iALNL66#|8&M6N9COc>DO1X2nf#f=R3VCsl=JTH+k>BQT^;!CrAHwJ^r=U z(=?pBP1_wE?8%@5*PH!X4#*TufC z_kaH&Z&gVZIdp6WO~>n2@ijd_gdRm#O`CQ8@!yB+4&%`~|p=t&~=QG9|^ zhh>CL%eT@XD!nSwDj{(L@HK{#)HZkPI-V#2{V(?W~G^0MtyGuGO1bS>oUJr+FYvn7B(I*isn|$SoRJw!9rIlg3p$FyS z5IGqi?U!VD#iNcc6n7s)QG=SbdZUb&VQ02rvqVSbP0B-FZjW6~qq6Cb9Ktr=ygDG2 ze7iK<#YJ&k>|(>+HF~#!IGlg`fmojSgL`#u4k!qE?o`xRw>rKi4i6 zwRd*}bQ)+yt$dKD>x>?=;*mMQkA0huV3VA>K7zx+8-D14j;#R!V{Dz=gTLJH`P&nH zc$59tg6zMWG?Qfz~=t2xJj|2@%-lO;4_k|GRk zoS-y7(`IpV@uTCA>jpo8VLLc&Fq#$KvfUk4eKHv%zf{dS&H&LDT;WnJg^RM{we4Fl z%!_(DdSN@Ec8eT``D{Y9)a4m-+mo=eOUwk)Fny&HS$g;lFt*%2XHdJK%%GPgkwS>R z`QACg>LJ5;D_iOd%>1Qt-8U#m9+!D`S%11a8Z(E)dIHaV$x}Yar+pP6O)d{sW*?sq zszaa1-dx#n9W33NpaD~LeDJWx@MTM*OO+4j_1k!ZY-QC!`webig4`;q=QV1j9iE2R zrQ?X4^Vnicp%5tNV(&fy7?nRNOyM`rtUdAagpD2ZL`cxv$SKFrB-)0=f? zm}OkI^@-HEhL8-{AsQSewy{nKp+B0>`Qq2>PCkNkciGG# z<&Ov*RHx!xf(daQu6>U4-7!dS3-6o9w3UadVXS=1t7`$%GPFAH-H`kB4BN+78>M&x z*LUJnSuFdr`!uhG-t~99Ha^Eo^iGAQ=Eg0=)t#;)#Pw<35Wl(A1Bnz#3P*!w%Hc7Y zsXnHcwx=0^Q;f|Dfujqmo&KE@#vWKQTVklG`~@Epq#sdgcI=%v>t@4f0qow~` zyM=9oLi!FA(1TK4jYv6q~*Pm#cQg zL8k)@FHvrA#xh&^+ztES8)Ct#E1FE7Phm_hSy#AOq61ZAkw(t)p$&}F*Hcg<0yLb# zLn?yz5A)V9>&Ybr@@p454Qf9>z9GuxMHJT)Axu8b`wkywGFyH()AI;79>_b|a?LzU z;|4|8Dsk~i(g=oz7Z#cu{jl}#yD)s=haPQE2=D3of(-wom53Dr7K;OEY#%d;@^d&2 zzhjZ4W?mU#9?LapeinZDj8CnSH|6DvE&hH+&;%HVoKx}(AN2DG+yq8mu~63F}Yc&bK9& zCL21EK5FR?PAtV1H;Gl9q!lVx>g;VfYKt)1=Y7Mr5!S<-1eFm)n}a?}3Zz*WYY2Uh zRr9syT?h0#5B~oKs;;LOZ+7ooi*xav=X;q%G$XbZnl}SAr@O|IR4lX24weu2U==XM z&aX7`+ktfEVVUwv9(2AzF2ZUQizn6?-!Sv_ag8uqWcStRHrMAgR<73ymS}EKqh2$3 zGgLeFOJEtEbQ|W&1{nKA&!JBf<5|A|(yx$}wgdBeAKy)qN;O)B+CjpO7wqapZQb(r zF3Wo&SamJPS*uuAncIFQ)x6;BZg-Q~Ud~Nza2`K;5TwceYg>#jG7n^dfs*+vhfp&X z`CSsiI|Y90Zq5x;=##mXHK$v9f$79rJB`Y5FjA8*x|BQ7dXQlns-a0ba;^(K=3XZfBG?8MFT7oUM~wA!dh2}l-5$(m zdn1eI(nw9Zzc7iOAK=bV^v|XIKl*py^p?BDC_KQ~R~$1QglQ;wIN9eA+* z8u%Kx2-wHxzRFPf##aZ7+2_1TeWfksXl$@63Yt5&NIJQB#b3B-d zD_BZWs#dlE!QG=3a`?&v1$3suR?A_v7njRi-%2s>NwQJH5;Vdvu58)rizfGk*^AlX7z(-xWv$GBRnt08v5^LAw7?s__s8s7X<>z}1r=G6 zEyfY&JpC$ZC6=xe^!k*%mpb!z#?TvN1^;CZeqk#?U}}-Y>u{L0q6PvvZBFCKcT7 z3f%h6SgzWeg9Qux(vojJya9v0W!9Gcr*aP*o}I144iV$@iE3!MADi7`$$oK(uc4{& z&G9G@Qww&i+QoKtndXR`OHw^hejF_XVhN8Vmt%w4pmv7>wbgJ4n3-}4Q9K3l+S$&9 zlZe%EN|iea>k#XyQPq=!^mVs0E^41JuK)bOQ=@tzg@-vi_5$hf)v&PM6$S`rrS7zE zKwrycg9x%NW7%nFVYFy{Oew15y7vJpO5TM;-JjpN{Vr(`4C?$%2=w2tkUz?M5dRz9 z2u!#^>~E$0FQT3N3lc(>CgHNN7z+|my3IenX@%t-_v4X01`Pnz4VO#Ee4ZALuQA$6 zu5L~H+laH)nx3KY2WS9&iwwi!fuM?=`i}TxDurg#zEg42vj)|cx+X3npHN3tgd1-d zj)sKn=o5uYO5d#Uf0m&0sUk}EW@x|oWgRS3XUh-l8{S7P*syn#&WztWOOs26-;h73 zIjo)Wa{adAbo)I!!M3O3gDFXmIJWBShX%4$sBR9z(yi3Sr-6KBz^ZyBKk9kl-50{k z`h(L8MlywgqB};hi*{<&4Z0)oT+R2@=Q?+ys6p(tLCeK6x1p^2BSb?qvAuBF+^MN3Tqw3EPTz=2J zZ*L(QQz?!L6L|D?I*0{is0fr$M6LZ)oqkXX-;!(Bb(Q6xpB~p6_vvWmqri!Sicz0twhS#sXL8)ye6~r z2Gsu%wem))V4M75(3b|-q#Tz)vfHF`dk!NJ${uc$W~sMZHP$x7ASb#4Sm*r)DG9}F zaSkK4ArH>h*1?I-Z$8_O_FyIm*nDm=u|wWsy)qo|boICo3%aam^=#Fr0nnDQyW~>j zN=7n7_q<$h8S`#Pj<*}h)}2#F1l;)BdeCB-*`^Wo!Sw#qV(H^y^?MaN*w$#!YGbwO zMYmPGZdE>C#b8(#v+$rlfhCcKlJA)M*#;$4(YsadfAJmt(@4#J;FbFCzq7xK=y`>| zJ8aN=Pu=?M801f_daS+xbKGF)z2jaE`w;<-HZQ>d2b~%b=;pB=G?Oj zRe8Ek370|5DU6BGWV{F;2PMDr9jE3EdBzv9n+y-X0M`;pmFr#)uSpPmb$YAD=b*T0 z&<@Igt8H@))$0l>WIJDiKM(2x{%ANp7JZ^(9<_eId+2;xDgJK8s<`6+?fv`s{|q~M zV}WyKS8vx}zf>Q^68KU4elu{_@syYU-X8zk9RBN4Mfcwn`FH!jES>+(A9%v@)qh)f z)&hMhKMgq3bx!_y)c5-zKPUfZh&}(WDO>ILKfAT({~C4wyaqg!eK&Y z3jeQP|Jo*qZvlFLR{7s*pxd0+)SvLOUsC@|)PH&Zd_TJhUiMMVk&;&gesKWr_0&pG zkpF0}{%RsC%(wuq1He>VKu{%Kj?@_z^2e_h_= zWaqK}LHwy1R{XzN^mZ_KJF|38)g8E!|~e^Cz4?7)>ZhnILW)do;;g^QbH zkgc1RNMnc^``wo14}V_y62M~iVNK*M!wL3Y*$39FGyJ~f?vH<^NnH%R$=vMI*rh#= zUz>1bsmJjU?w@t0x+08`xfe7gfJZSk{$~*Uaj8SZFXgy(=lP$eKpklZpR>Q;od0lE z@}afQQfeRZKMf9a5R7rzw1UUDc~mJTw{#SKrMo8P^HPQB5z@vZ~AB1U7yub)_u}X*Jg!vD1{!RI% z!Lg`F>ZD#)Y>Fq_oliYWM`8{=$*nZ#}ZkD+U()q#UbBoR$Vg5;YmtQ-TdB&MGe|Nxxe)r%e*^R ze{!W4v(d>ur-}2|0)5oxF}0_qe@}z_f@OPmnJhfBsqtfL}~yhpS(q}vKTpXkff zpH`aR3S435@=@DKS-G*#ZpwYdx{J>q&v|a&W}8)|!8l<-uUVg6QoXT1l{?3{($!!Q H|9=wzhK;$4 literal 0 HcmV?d00001 diff --git a/src/UglyToad.PdfPig.Tests/Images/JpegHandlerTests.cs b/src/UglyToad.PdfPig.Tests/Images/JpegHandlerTests.cs new file mode 100644 index 00000000..45d6d96b --- /dev/null +++ b/src/UglyToad.PdfPig.Tests/Images/JpegHandlerTests.cs @@ -0,0 +1,38 @@ +namespace UglyToad.PdfPig.Tests.Images +{ + using System; + using System.IO; + using Xunit; + using JpegHandler = UglyToad.PdfPig.Images.JpegHandler; + + public class JpegHandlerTests + { + + + [Fact] + public void CanGetJpegInformation() + { + + var dataJpg = LoadJpg("218995467-ccb746b0-dc28-4616-bcb1-4ad685f81876.jpg"); + + using (var ms = new MemoryStream(dataJpg)) + { + var jpegInfo = JpegHandler.GetInformation(ms); + + Assert.Equal(8, jpegInfo.BitsPerComponent); + Assert.Equal(2290, jpegInfo.Height); + Assert.Equal(1648, jpegInfo.Width); + } + } + + + + private static byte[] LoadJpg(string name) + { + var baseFolder = Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory); + var JpgFilesFolder = Path.Combine(baseFolder, "..", "..", "..", "Images", "Files", "Jpg"); ; + var JpgFilePath = Path.Combine(JpgFilesFolder, name); + return File.ReadAllBytes(JpgFilePath); + } + } +} diff --git a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj index 878d9824..6879cdc1 100644 --- a/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj +++ b/src/UglyToad.PdfPig.Tests/UglyToad.PdfPig.Tests.csproj @@ -133,9 +133,4 @@ PreserveNewest - - - - - diff --git a/src/UglyToad.PdfPig/Images/JpegHandler.cs b/src/UglyToad.PdfPig/Images/JpegHandler.cs index 46c19726..eb4c70af 100644 --- a/src/UglyToad.PdfPig/Images/JpegHandler.cs +++ b/src/UglyToad.PdfPig/Images/JpegHandler.cs @@ -1,6 +1,6 @@ namespace UglyToad.PdfPig.Images { - using System; + using System; using System.IO; internal static class JpegHandler @@ -28,6 +28,19 @@ { switch (marker) { + case JpegMarker.StartOfImage: + case JpegMarker.EndOfImage: + case JpegMarker.Restart0: + case JpegMarker.Restart1: + case JpegMarker.Restart2: + case JpegMarker.Restart3: + case JpegMarker.Restart4: + case JpegMarker.Restart5: + case JpegMarker.Restart6: + case JpegMarker.Restart7: + + // No length markers + break; case JpegMarker.StartOfBaselineDctFrame: case JpegMarker.StartOfProgressiveDctFrame: { @@ -55,6 +68,7 @@ case JpegMarker.ApplicationSpecific13: case JpegMarker.ApplicationSpecific14: case JpegMarker.ApplicationSpecific15: + default: { var length = ReadShort(stream, shortBuffer); stream.Seek(length - 2, SeekOrigin.Current); @@ -105,7 +119,7 @@ } if (previous.HasValue && previous.Value == MarkerStart && b != MarkerStart) - { + { return b; }