clear[leqn,c1,c2,RE,AR,dcond,ufun,u,x,y,Ef,ff,g]
leqn=Laplacian[u[x,y],{x,y}]==0;
RE = Rectangle[{-1.5,-0.8},{29,22}];
c1 = Disk[{14,4},1];
c2= Disk[{14,16},1];
AR=RegionDifference[RE, RegionUnion[c1 ,c2]];
dcond={DirichletCondition[u[x,y]==0, (x-14)^2+(y-4)^2==1],DirichletCondition[u[x,y]==3.3, (x-14)^2+(y-16)^2==1]};
ufun=NDSolveValue[{leqn,dcond},u,{x,y}∈AR];
ticks[min_,max_]:=Table[{i,i},{i,Ceiling[min],Floor[max],2}];
grid[min_,max_]:=Table[i,{i,Ceiling[min],Floor[max],2}];
ContourPlot[ufun[x,y],{x,y}∈RE,MaxRecursion->8, AspectRatio->0.6, Contours->20, ContourLabels->True, FrameTicks->{ticks[2,26],ticks[2,20]},  FrameLabel->{X,Y}]//Quiet

g[x_,y_]:=1.65*(-0.5*Log[(x-14)^2+(y-16)^2]+0.5*Log[(x-14)^2+(y-4)^2] + Log[11])/Log[11];
ContourPlot[g[x,y],{x,y}∈RE,MaxRecursion->8, AspectRatio->0.6, Contours->20, ContourLabels->True, FrameTicks->{ticks[2,26],ticks[2,20]},  FrameLabel->{X,Y}]//Quiet

Ef=-Grad[ufun[x,y],{x,y}];
StreamPlot[Ef,{x,-1.5,29},{y,-0.8,22},AspectRatio->0.6, GridLines->{grid[2,28],grid[2,20]}, FrameTicks->{ticks[2,26],ticks[2,20]},PlotRange->{{-1.5,29},{-0.8,22}},StreamColorFunction->Hue, FrameLabel->{X,Y}]

Ef1=Grad[g[x,y],{x,y}];
StreamPlot[Ef1,{x,-1.5,29},{y,-0.8,22},AspectRatio->0.6, GridLines->{grid[2,28],grid[2,20]}, FrameTicks->{ticks[2,26],ticks[2,20]},PlotRange->{{-1.5,29},{-0.8,22}},StreamColorFunction->Hue, FrameLabel->{X,Y}]