With a bit more work, we can take a similar approach to J.M.'s answer to build a (water tight) model with a base.

 text = BoundaryDiscretizeGraphics[Text["Hello"], _Text]
[![enter image description here][1]][1]

 elongate[{a_, b_}] := With[{d = 0.05 (b - a)}, {a - d, b + d}]

 full = DiscretizeGraphics[Rectangle @@ Transpose[elongate /@ RegionBounds[text]]]

[![enter image description here][2]][2]

 diff = TriangulateMesh[RegionDifference[full, text], MeshQualityGoal -> "Minimal"]

[![enter image description here][3]][3]

 cc = MeshCellCount[text, 0];
 ptsT = Append[#, 2.] & /@ MeshCoordinates[text];
 ptsB = Append[#, 0.] & /@ MeshCoordinates[text];

 extrude = MeshRegion[Join[ptsT, ptsB], 
 Apply[{Polygon[{{#1, #2, #1 + cc}, {#1 + cc, #2 + cc, #2}}]} &, 
 FindCycle[UndirectedEdge @@@ MeshCells[text, 1][[All, 1]], ∞, All], {2}]]

[![enter image description here][4]][4]

 base = MeshRegion[
 Join[Append[#, -1.] & /@ MeshCoordinates[full], 
 Append[#, 0.] & /@ MeshCoordinates[full]], 
 Polygon[{{1, 2, 6, 5}, {2, 3, 7, 6}, {3, 4, 8, 7}, {4, 1, 5, 8}}]];

 final = DiscretizeGraphics @ Show[
 extrude,
 RegionProduct[text, Point[{2.}]],
 RegionProduct[diff, Point[{0.}]],
 RegionProduct[full, Point[{-1.}]],
 base
 ]

[![enter image description here][5]][5]

The only defects here are misoriented faces (which can be fixed with `RepairMesh`), but this is indeed a water tight model:

 FindMeshDefects[final]

[![enter image description here][6]][6]


 [1]: https://i.sstatic.net/8UF4b.png
 [2]: https://i.sstatic.net/dF1NN.png
 [3]: https://i.sstatic.net/4gtBi.png
 [4]: https://i.sstatic.net/jSWeA.png
 [5]: https://i.sstatic.net/eJxrd.png
 [6]: https://i.sstatic.net/gOmbk.png