public string Build() { PdfMetadata = ValueOrDefault(PdfMetadata, PdfMetadataDefaultValue); AddMetadata(PdfMetadata); StringBuilder sb = new StringBuilder(); sb.Append($"%PDF-{Version}\n"); sb.Append(BinaryComment()); foreach (PdfObject pdfObject in PdfObjects) { sb.Append(pdfObject.Build()); } var pdfFileUpUntilXref = sb.ToString(); // Temp pdf so that we can calculate position to Reference table var xref = new PdfReferenceTable(pdfFileUpUntilXref, PdfObjects); var xrefPosition = PdfHelpers.Encoding.GetByteCount(pdfFileUpUntilXref); sb.Append($"{xref.ToString()}"); var trailer = new PdfTrailer(this.Catalog, PdfObjects.Count + 1, PdfMetadata); sb.Append(trailer.Build()); // Tells pdf where to find xref table sb.Append("startxref\n"); sb.Append($"{xrefPosition}\n"); sb.Append("%%EOF"); return(sb.ToString()); }