On a Unix system, run this in the folder containing the PDFs.

for i in *.pdf; do pdftotext "$i" - >> allpapers.txt ; done

Common words and exluded words

commonWords={"the","be","to","of","and","a","in","that","have","I","it","for","not","on","with","he","as","you","do","at","this","but","his","by","from","they","we","say","her","she","or","an","will","my","one","all","would","there","their","what","so","up","out","if","about","who","get","which","go","me","when","make","can","like","time","no","just","him","know","take","people","into","year","your","good","some","could","them","see","other","than","then","now","look","only","come","its","over","think","also","back","after","use","two","how","our","work","first","well","way","even","new","want","because","any","these","give","day","most","us"};
commonWords=Join[commonWords,{"are","may","been","thus","same","more","given","has","where","were","was","case","such","however","each","between","used","using","those","possible","different","here","there","within","much","must","john","should","will","through","under","over","based","many","while","among","shown","three","very","since","second","does","above","therefore","shows","obtained","show","let","consider","every","non","found"}];

exclude={"phys","rev","mod","lett","fig","journal","press"}

This is for mapping the plurals of some prominent words to their singular form.

pluralMap={"models"->"model","networks"->"network"};

Read in and process the data

str=Import["~/Documents/Mendeley Desktop/allpapers.txt","Text"];

words=StringSplit@ToLowerCase@StringReplace[str,Except[LetterCharacter]->" "];
words=Select[words,StringLength[#]>2&];
words=words/.Dispatch[pluralMap];

tally=DeleteCases[
Take[Reverse@SortBy[Tally[words],Last],1000],
{w_,_}/;MemberQ[commonWords~Join~exclude,w]
];
tally=Take[tally,120]; (* 120 commonest words *)

Display the result for review.  Creating the actual word cloud is going to take a while.

TableForm[tally]

Create word cloud

Based on Heike Gramberg’s solution from http://mathematica.stackexchange.com/q/2334/12

In short, the first word is placed in the middle.  Then the next one is placed as close to it as possible without overlapping.  Words are placed in order of decreasing size.  Overlaps are detected using image processing (convolution).

range={Min@(Last/@tally),Max@(Last/@tally)};

iteration[img1_,w_,fun_: (Norm[#1-#2]&)]:=Module[{imdil,centre,diff,dimw,padding,padded1,minpos},
dimw=ImageDimensions[w];
padded1=ImagePad[img1,{dimw[[1]]{1,1},dimw[[2]] {1,1}},1];
imdil=Binarize@ImageCorrelate[
Binarize[ColorNegate[padded1],0.05],
Dilation[Binarize[ColorNegate[w],.05],3]
];
centre=ImageDimensions[padded1]/2;
minpos=Reverse@First@Nearest[Position[Reverse@ImageData[imdil],0],Reverse[centre],DistanceFunction->fun];
Sow[minpos-centre];(*for creating vector plot*)
diff=ImageDimensions[imdil]-dimw;
padding[pos_]:=Transpose[{#,diff-#}&@Round[pos-dimw/2]];
ImagePad[#,(-Min[#] {1,1})&/@BorderDimensions[#]]&@ImageMultiply[padded1,ImagePad[w,padding[minpos],1]]
]

This is the distance function used for placing the words.  By making the vertical direction more significant we get an elliptical instead of a circular cloud.

fun=Norm[{1,1/2} (#2-#1)]&;

Font suggestions: Avenir, Marion

words=Style[
First[#],
FontFamily->"Marion",
FontColor->ColorData[{"Indexed","Earth"}][RandomInteger[{1,100}]],FontSize->(Last@Rescale[#,range,{12,150}])
]&/@tally;

wordsimg=Rasterize/@words;

SeedRandom[114]; (* change the seed to get a different random picture *)
angles=RandomReal[{-Pi/2,Pi/2},Length[wordsimg]];

wordsimgRot=ImageRotate[##,Background->White]&@@@Transpose[{wordsimg,angles}];

Place the words.  Warning: this can take a few minutes.  The method is slow but it can achieve arbitrarily tight placements.

poslist=Reap[
img=Fold[iteration[##,fun]&,First[wordsimgRot],Rest[wordsimgRot]];
][[2,1]];

img

Create a vector version of the same image.

Graphics[MapThread[Text[#1,Offset[#2,{0,0}],{0,0},{Cos[#3],Sin[#3]}]&,{words,Prepend[poslist,{0,0}],angles}],ImageSize->{900,500}]