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