{"id":93,"date":"2010-04-19T05:19:54","date_gmt":"2010-04-19T10:19:54","guid":{"rendered":"http:\/\/www.teamdesk.net\/blog\/2010\/04\/a-story-of-document-feature\/"},"modified":"2015-10-26T14:24:16","modified_gmt":"2015-10-26T19:24:16","slug":"a-story-of-document-feature","status":"publish","type":"post","link":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/","title":{"rendered":"A story of Document feature"},"content":{"rendered":"<p>Generating styled documents and reports based on the data is clearly essential feature for a database system. That&#8217;s why document-generating feature was planned and implemented in initial <a href=\"http:\/\/www.teamdesk.net\">TeamDesk<\/a> release back on fall 2005.<\/p>\n<p>The process of document generation is relatively straightforward. User creates a nicely looking template, marks certain points as placeholders for the data and uploads the template to TeamDesk. When the document is requested, the system loads the template, finds placeholders, substitutes them with actual data and sends the results to the user \u2013 sounds easy.<\/p>\n<p>Then the question arises: how does the user create a template? There are lots of tools. Report designer included with <a href=\"http:\/\/en.wikipedia.org\/wiki\/Microsoft_Access\" target=\"_blank\">Microsoft Access<\/a> is one of them. <a href=\"http:\/\/en.wikipedia.org\/wiki\/Crystal_Reports\" target=\"_blank\">Crystal Reports<\/a> from SAP is another one. There are lots more \u2013 each has its own unique features and its own UI for a template designer part. This means the user should take some time to learn how to use it.<\/p>\n<p>But you can hardly find a user unfamiliar with the text editor. There is a plenty of them, starting from plain text editors like UNIX <a href=\"http:\/\/en.wikipedia.org\/wiki\/Vi\" target=\"_blank\">vi<\/a> or Windows <a href=\"http:\/\/en.wikipedia.org\/wiki\/Notepad_(Windows)\" target=\"_blank\">Notepad<\/a>, ending up with complex ones like <a href=\"http:\/\/en.wikipedia.org\/wiki\/TeX\" target=\"_blank\">TeX<\/a> or <a href=\"http:\/\/en.wikipedia.org\/wiki\/Microsoft_Word\" target=\"_blank\">Word<\/a>. Among those we would need ones with rich text capabilities, and clearly, Microsoft Word is dominating in this area.<\/p>\n<p>So, the decision was made. The user should be able to create templates as Microsoft Word documents. But then the next question arose.<\/p>\n<p><!--more--><\/p>\n<p>How would we process .doc files?<\/p>\n<p>Microsoft Word stores documents in a proprietary binary .doc format. To find out the placeholders we would need to crunch bits and bytes \u2013 unfortunately, as of 2005 the format was not documented. All we were able to find were some random bits of information on how to build simple documents consisting of few paragraphs with little styling. And, as template creator is given the complete set of editor tools we would need to understand all the elements from the file. The only way to go in this direction would be file format reverse-engineering which is, according to license terms, illegal.<\/p>\n<p>Luckily, Microsoft Word provides a way to manipulate the content of the document via OLE automation interface \u2013 though it was no-go, again, due technical problems first, and licensing terms next. Here are excerpts from <a href=\"http:\/\/support.microsoft.com\/kb\/257757\" target=\"_blank\">Microsoft Knowledge Base article<\/a>:<\/p>\n<p><em>Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and\/or deadlock when Office is run in this environment.<\/em><\/p>\n<p><em>Current licensing guidelines prevent Office applications from being used on a server to service client requests, unless those clients themselves have licensed copies of Office.<\/em><\/p>\n<p>Clearly, we can&#8217;t ensure that all requests for the document are covered with appropriate Office license and we can&#8217;t provide one if it is missing (you can have no Word, but you can request the document to re-send it by email for example). Yet this requirement led us to a solution.<\/p>\n<p>If we can&#8217;t do it on server&#8217;s side, and if clients are required to have licensed copy of Word, let&#8217;s do template processing on client&#8217;s computer. All we needed to do is to write a browser component that will take the template and the data and manipulate the Word through automation to produce the results.<\/p>\n<p>This path imposed some limitations as well. Automation interfaces are available only in Windows versions of Office (bad luck for non-Windows users, bad luck for those having Word Viewer) and since browser component have to deal with OLE, the solution was limited to Microsoft Internet Explorer only. However, in 2005 the share of non-IE users was relatively low.<\/p>\n<p>The situation has changed over last five years. The rise of Firefox (now it took over the market share of Internet Explorer 6) and growing Mac sales led to numerous requests to make document functionality cross-browser and cross-platform and they pushed us to rethink the approach.<\/p>\n<p>The time has passed, old Office versions fade away and we&#8217;ve started experimenting with Word 2003 XML format. It was not documented either, but at least it was based on an XML standard \u2013 there was no need to deal with bits and bytes anymore. The outcome of these experiments was the tool to generate help pages for our products from Word documents \u2013 it was limited, far from ideal, yet it did its job well enough to make this way look promising.<\/p>\n<p>The situation has changed radically in 2007 when Microsoft released a new version of their Office package introducing .docx format for text documents \u2013 practically it is a set of XML documents bundled together as a ZIP archive. The XML format for the document was simplified (comparing to Word 2003 XML), and, moreover was fully documented on Microsoft&#8217;s Site (one year later they&#8217;ve documented binary .DOC format as well, but it was clear it has no future).<\/p>\n<p>We only had to wait some time to let users adapt to the new format. As more and more people switched to DOCX within last three years, the rating of the &#8220;Server-Side Document Generation&#8221; idea we&#8217;ve posted back in 2007 jumped high to 200 putting it in a Top 5 list. For those not willing to upgrade, Microsoft released Office Compatibility Pack allowing Word 2003 to read and write files in a new format. And finally, mainstream support for Word 2003 ended on April 2009; Office 2010 is coming out.<\/p>\n<p>So there is nothing left to prevent us from switching from component-assisted client based document generation to a true server-side solution.<\/p>\n<p>Advantages of a server-side solution are clear: obviously, all you need to create the template is DOCX compatible editor: Word 2007, Word 2003 + Compatibility pack <span style=\"text-decoration: line-through;\" title=\"As of version 3.2 OpenOffice can not save .DOCX files\">or\u00a0OpenOffice<\/span>; and all you need to get the result is DOCX compatible viewer: Word 2003+, Word 2007, Word Viewer 2007, WordPad on Windows 7, OpenOffice or even an iPhone. Want the proof? Here are some development screenshots from a default document (generated on the server side) coming out from our Invoicing application template.<\/p>\n<p style=\"text-align: center;\">\u00a0<a href=\"https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/561.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-483\" src=\"https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/561.png\" alt=\"56,1\" width=\"320\" height=\"480\" srcset=\"https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/561.png 320w, https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/561-200x300.png 200w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><\/a><\/p>\n<p style=\"text-align: center;\"><em>here is the one from my lovely iPhone<\/em><\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/562.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-484\" src=\"https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/562.png\" alt=\"56,2\" width=\"500\" height=\"466\" srcset=\"https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/562.png 500w, https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/562-300x280.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p style=\"text-align: center;\"><em>\u2026and here is the one from Win7\/WordPad. The warning is displayed because WordPad lacks support for complex scripting used in Asian languages we mention in styles. Yet the document is displayed correctly.<\/em><\/p>\n<p><strong>Q:<\/strong> Why don&#8217;t you support <a href=\"http:\/\/en.wikipedia.org\/wiki\/OpenDocument\" target=\"_blank\">ODF<\/a>, it&#8217;s a standard format after all?<\/p>\n<p><strong>A:<\/strong> Speaking of standards, DOCX is a standard too (<a href=\"http:\/\/en.wikipedia.org\/wiki\/Office_Open_XML\" target=\"_blank\">ISO\/IEC 29500<\/a>). But we are not open standard zealots; our goal is to make it work for vast majority of users. Unfortunately, at the moment the level of adoption of OpenOffice is hardly comparable to the adoption of Microsoft Office. While OpenOffice claims to read DOCX and Microsoft Office claims to read ODF, yet there are certain compatibility issues may arise. In this situation we are on the side of those who are using the product with bigger market share.<\/p>\n<p><strong>Q:<\/strong> Why don&#8217;t you generate <a href=\"http:\/\/en.wikipedia.org\/wiki\/Portable_Document_Format\" target=\"_blank\">PDF<\/a> files?<\/p>\n<p><strong>A:<\/strong> Consider three keywords: <em>adoption<\/em>, <em>licensing<\/em> and <em>transcoding<\/em>. While we recognize the value of PDF output, if talking about template creation, the level of text processors <em>adoption<\/em> is probably ten times higher than the level of adoption of Adobe Acrobat \u2013 the tool to create PDF files. And DOC-to-PDF <em>transcoding<\/em> obviously won&#8217;t work well because of the different architecture of the formats. Most of DOC-to-PDF transcoders on the market require having an installation of Word on a server to load the document and then &#8220;print&#8221; it to so-called PDF printer \u2013 you can use such a configuration in-house, but it is no way to go in a public production environment because of <em>licensing<\/em> problems described above. Few others try to do the job on their own, but the quality is not ideal \u2013 even Word&#8217;s own PDF exporter usually draws few extra pixels here and there. If you can bear such issues, you are free to go \u2013 there are a lot of free online converters and having either Word or OpenOffice you can open DOCX and write the document as PDF.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Generating styled documents and reports based on the data is clearly essential feature for a database system. That&#8217;s why document-generating feature was planned and implemented in initial TeamDesk release back on fall 2005. The process of document generation is relatively straightforward. User creates a nicely looking template, marks certain points as placeholders for the data [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-93","post","type-post","status-publish","format-standard","hentry","category-behind-the-scenes"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>A story of Document feature - TeamDesk Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A story of Document feature - TeamDesk Blog\" \/>\n<meta property=\"og:description\" content=\"Generating styled documents and reports based on the data is clearly essential feature for a database system. That&#8217;s why document-generating feature was planned and implemented in initial TeamDesk release back on fall 2005. The process of document generation is relatively straightforward. User creates a nicely looking template, marks certain points as placeholders for the data [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/\" \/>\n<meta property=\"og:site_name\" content=\"TeamDesk Blog\" \/>\n<meta property=\"article:published_time\" content=\"2010-04-19T10:19:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-10-26T19:24:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/561.png\" \/>\n<meta name=\"author\" content=\"Kirill Bondar\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kirill Bondar\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/\"},\"author\":{\"name\":\"Kirill Bondar\",\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/#\\\/schema\\\/person\\\/22c4c05bd657513c8b00122fa364c8d2\"},\"headline\":\"A story of Document feature\",\"datePublished\":\"2010-04-19T10:19:54+00:00\",\"dateModified\":\"2015-10-26T19:24:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/\"},\"wordCount\":1317,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/04\\\/561.png\",\"articleSection\":[\"Behind the Scenes\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/\",\"url\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/\",\"name\":\"A story of Document feature - TeamDesk Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/04\\\/561.png\",\"datePublished\":\"2010-04-19T10:19:54+00:00\",\"dateModified\":\"2015-10-26T19:24:16+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/#\\\/schema\\\/person\\\/22c4c05bd657513c8b00122fa364c8d2\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/04\\\/561.png\",\"contentUrl\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/04\\\/561.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/behind-the-scenes\\\/a-story-of-document-feature\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A story of Document feature\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/\",\"name\":\"TeamDesk Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/#\\\/schema\\\/person\\\/22c4c05bd657513c8b00122fa364c8d2\",\"name\":\"Kirill Bondar\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/dc5bc844095b5753ccc73c589c028bf16615674f289668146bbd59205a08a52d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/dc5bc844095b5753ccc73c589c028bf16615674f289668146bbd59205a08a52d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/dc5bc844095b5753ccc73c589c028bf16615674f289668146bbd59205a08a52d?s=96&d=mm&r=g\",\"caption\":\"Kirill Bondar\"},\"url\":\"https:\\\/\\\/www.teamdesk.net\\\/blog\\\/author\\\/kirill-bondar\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"A story of Document feature - TeamDesk Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/","og_locale":"en_US","og_type":"article","og_title":"A story of Document feature - TeamDesk Blog","og_description":"Generating styled documents and reports based on the data is clearly essential feature for a database system. That&#8217;s why document-generating feature was planned and implemented in initial TeamDesk release back on fall 2005. The process of document generation is relatively straightforward. User creates a nicely looking template, marks certain points as placeholders for the data [&hellip;]","og_url":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/","og_site_name":"TeamDesk Blog","article_published_time":"2010-04-19T10:19:54+00:00","article_modified_time":"2015-10-26T19:24:16+00:00","og_image":[{"url":"https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/561.png","type":"","width":"","height":""}],"author":"Kirill Bondar","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Kirill Bondar","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/#article","isPartOf":{"@id":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/"},"author":{"name":"Kirill Bondar","@id":"https:\/\/www.teamdesk.net\/blog\/#\/schema\/person\/22c4c05bd657513c8b00122fa364c8d2"},"headline":"A story of Document feature","datePublished":"2010-04-19T10:19:54+00:00","dateModified":"2015-10-26T19:24:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/"},"wordCount":1317,"commentCount":0,"image":{"@id":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/#primaryimage"},"thumbnailUrl":"https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/561.png","articleSection":["Behind the Scenes"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/","url":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/","name":"A story of Document feature - TeamDesk Blog","isPartOf":{"@id":"https:\/\/www.teamdesk.net\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/#primaryimage"},"image":{"@id":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/#primaryimage"},"thumbnailUrl":"https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/561.png","datePublished":"2010-04-19T10:19:54+00:00","dateModified":"2015-10-26T19:24:16+00:00","author":{"@id":"https:\/\/www.teamdesk.net\/blog\/#\/schema\/person\/22c4c05bd657513c8b00122fa364c8d2"},"breadcrumb":{"@id":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/#primaryimage","url":"https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/561.png","contentUrl":"https:\/\/www.teamdesk.net\/blog\/wp-content\/uploads\/2010\/04\/561.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.teamdesk.net\/blog\/behind-the-scenes\/a-story-of-document-feature\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.teamdesk.net\/blog\/"},{"@type":"ListItem","position":2,"name":"A story of Document feature"}]},{"@type":"WebSite","@id":"https:\/\/www.teamdesk.net\/blog\/#website","url":"https:\/\/www.teamdesk.net\/blog\/","name":"TeamDesk Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.teamdesk.net\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.teamdesk.net\/blog\/#\/schema\/person\/22c4c05bd657513c8b00122fa364c8d2","name":"Kirill Bondar","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/dc5bc844095b5753ccc73c589c028bf16615674f289668146bbd59205a08a52d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/dc5bc844095b5753ccc73c589c028bf16615674f289668146bbd59205a08a52d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dc5bc844095b5753ccc73c589c028bf16615674f289668146bbd59205a08a52d?s=96&d=mm&r=g","caption":"Kirill Bondar"},"url":"https:\/\/www.teamdesk.net\/blog\/author\/kirill-bondar\/"}]}},"_links":{"self":[{"href":"https:\/\/www.teamdesk.net\/blog\/wp-json\/wp\/v2\/posts\/93","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.teamdesk.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.teamdesk.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.teamdesk.net\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.teamdesk.net\/blog\/wp-json\/wp\/v2\/comments?post=93"}],"version-history":[{"count":1,"href":"https:\/\/www.teamdesk.net\/blog\/wp-json\/wp\/v2\/posts\/93\/revisions"}],"predecessor-version":[{"id":485,"href":"https:\/\/www.teamdesk.net\/blog\/wp-json\/wp\/v2\/posts\/93\/revisions\/485"}],"wp:attachment":[{"href":"https:\/\/www.teamdesk.net\/blog\/wp-json\/wp\/v2\/media?parent=93"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.teamdesk.net\/blog\/wp-json\/wp\/v2\/categories?post=93"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.teamdesk.net\/blog\/wp-json\/wp\/v2\/tags?post=93"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}