Free Trial
Web API version
Licensing
Request A Quote
HAVE QUESTIONS OR NEED HELP? SUBMIT THE SUPPORT REQUEST FORM or write email to SUPPORT@BYTESCOUT.COM
Blood Test Results to JSON | C#
Program.cs:
C#
using ByteScout.DocumentParser; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Threading; namespace BloodTestResultsToJson { class Program { static void Main(string[] args) { // Sample document containing blood test report // Report consists of sample patient information such as patinet name, DOB, patientID // Report information such as report type, collection date and time // Test components such as complete blood count, Hemoglobin, White Blood Cell (WBC), Red Blood Cell (RBC), etc. string sampleDocument = @".\SampleBloodReport.pdf"; // Sample template which primarily extracts patient name, report date and test result table. string sampleTemplate = @".\SampleBloodReport.yml"; // Perform parsing with SDK ParseWithSDK(sampleDocument, sampleTemplate); // Perform parsing with PDF.co api // ParseWithPDFCoApi(sampleDocument, sampleTemplate); Console.WriteLine(); Console.WriteLine("Press any key to continue..."); Console.ReadLine(); } /// <summary> /// Parse with Document Parser SDK /// </summary> static void ParseWithSDK(string sampleDocument, string sampleTemplate) { // Create DocumentParser instance using (DocumentParser documentParser = new DocumentParser("demo", "demo")) { // Add sample template documentParser.AddTemplate(sampleTemplate); // Parse document data in JSON format string jsonString = documentParser.ParseDocument(sampleDocument, OutputFormat.JSON); string resultFile = "result.json"; // Write output file File.WriteAllText(resultFile, jsonString); Console.WriteLine($"Generated JSON file saved as {resultFile} file"); } } /// <summary> /// Parse with PDF.Co API /// </summary> static void ParseWithPDFCoApi(string SourceFile, string sampleTemplate) { // The authentication key (API Key). // Get your own by registering at https://app.pdf.co/documentation/api const String API_KEY = "***********************************"; // PDF document password. Leave empty for unprotected documents. const string Password = ""; // Destination TXT file name const string DestinationFile = @".\result.json"; // (!) Make asynchronous job const bool Async = true; // Template text. Use Document Parser SDK (https://bytescout.com/products/developer/documentparsersdk/index.html) // to create templates. // Read template from file: String templateText = File.ReadAllText(sampleTemplate); // Create standard .NET web client instance WebClient webClient = new WebClient(); // Set API Key webClient.Headers.Add("x-api-key", API_KEY); // 1. RETRIEVE THE PRESIGNED URL TO UPLOAD THE FILE. // * If you already have a direct file URL, skip to the step 3. // Prepare URL for `Get Presigned URL` API call string query = Uri.EscapeUriString(string.Format( "https://api.pdf.co/v1/file/upload/get-presigned-url?contenttype=application/octet-stream&name={0}", Path.GetFileName(SourceFile))); try { // Execute request string response = webClient.DownloadString(query); // Parse JSON response JObject json = JObject.Parse(response); if (json["error"].ToObject<bool>() == false) { // Get URL to use for the file upload string uploadUrl = json["presignedUrl"].ToString(); string uploadedFileUrl = json["url"].ToString(); // 2. UPLOAD THE FILE TO CLOUD. webClient.Headers.Add("content-type", "application/octet-stream"); webClient.UploadFile(uploadUrl, "PUT", SourceFile); // You can use UploadData() instead if your file is byte[] or Stream webClient.Headers.Remove("content-type"); // 3. PARSE UPLOADED PDF DOCUMENT // URL for `Document Parser` API call query = Uri.EscapeUriString(string.Format( "https://api.pdf.co/v1/pdf/documentparser?url={0}&async={1}", uploadedFileUrl, Async)); Dictionary<string, string> requestBody = new Dictionary<string, string>(); requestBody.Add("template", templateText); // Execute request response = webClient.UploadString(query, "POST", JsonConvert.SerializeObject(requestBody)); // Parse JSON response json = JObject.Parse(response); if (json["error"].ToObject<bool>() == false) { // Asynchronous job ID string jobId = json["jobId"].ToString(); // Get URL of generated JSON file string resultFileUrl = json["url"].ToString(); // Check the job status in a loop. // If you don't want to pause the main thread you can rework the code // to use a separate thread for the status checking and completion. do { string status = CheckJobStatus(webClient, jobId); // Possible statuses: "working", "failed", "aborted", "success". // Display timestamp and status (for demo purposes) Console.WriteLine(DateTime.Now.ToLongTimeString() + ": " + status); if (status == "success") { // Download JSON file webClient.DownloadFile(resultFileUrl, DestinationFile); Console.WriteLine("Generated JSON file saved as \"{0}\" file.", DestinationFile); break; } else if (status == "working") { // Pause for a few seconds Thread.Sleep(3000); } else { Console.WriteLine(status); break; } } while (true); } else { Console.WriteLine(json["message"].ToString()); } } else { Console.WriteLine(json["message"].ToString()); } } catch (WebException e) { Console.WriteLine(e.ToString()); } webClient.Dispose(); } /// <summary> /// Check PDF.co job status /// </summary> static string CheckJobStatus(WebClient webClient, string jobId) { string url = "https://api.pdf.co/v1/job/check?jobid=" + jobId; string response = webClient.DownloadString(url); JObject json = JObject.Parse(response); return Convert.ToString(json["status"]); } } }
SampleBloodReport.yml:
templateName: BloodTestTemplate templateVersion: 4 templatePriority: 0 detectionRules: keywords: [] objects: - name: PatientName objectType: field fieldProperties: fieldType: rectangle rectangle: - 177.75 - 123.75 - 62.25 - 12.75 pageIndex: 0 - name: ReportName objectType: field fieldProperties: fieldType: rectangle expression: '{{SmartDate}}' dataType: date rectangle: - 335.25 - 94.5 - 65.25 - 12 pageIndex: 0 - name: TestResults objectType: table tableProperties: start: y: 261.75 pageIndex: 0 end: y: 712.5 pageIndex: 0 left: 41.25 right: 573.75 rowMergingRule: byBorders