Advertisement
Guest User

Untitled

a guest
Oct 17th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.06 KB | None | 0 0
  1. #include
  2. #include
  3. #include
  4.  
  5. float page_width = 594.0;
  6. float page_depth = 828.0;
  7. float margin = 30.0;
  8. float font_size = 10.0;
  9. float lead_size = 10.0;
  10. int object_id = 1;
  11. int page_tree_id;
  12.  
  13. typedef struct _PageList {
  14. struct _PageList *next;
  15. int page_id;
  16. } PageList;
  17.  
  18. int num_pages = 0;
  19. PageList *pages = NULL;
  20. PageList **insert_page = &pages;
  21. store_page(int id)
  22. {
  23. PageList *n = (PageList *)malloc(sizeof(*n));
  24. if(n == NULL)
  25. {
  26. fprintf(stderr,
  27. "Unable to allocate array for page %d.", num_pages + 1);
  28. exit(1);
  29. }
  30. n->next = NULL;
  31. n->page_id = id;
  32. *insert_page = n;
  33. insert_page = &n->next;
  34. num_pages++;
  35. }
  36.  
  37. int num_xrefs = 0;
  38. long *xrefs = NULL;
  39.  
  40. start_object(int id)
  41. {
  42. if(id >= num_xrefs)
  43. {
  44. long *new_xrefs;
  45. int delta, new_num_xrefs;
  46. delta = num_xrefs / 5;
  47. if(delta < 1000)
  48. delta += 1000;
  49. new_num_xrefs = num_xrefs + delta;
  50. new_xrefs = (long *)malloc(new_num_xrefs * sizeof(*new_xrefs));
  51. if(new_xrefs == NULL)
  52. {
  53. fprintf(stderr,
  54. "Unable to allocate array for object %d.", id);
  55. exit(1);
  56. }
  57. memcpy(new_xrefs, xrefs, num_xrefs * sizeof(*xrefs));
  58. free(xrefs);
  59. xrefs = new_xrefs;
  60. num_xrefs = new_num_xrefs;
  61. }
  62. xrefs[id] = ftell(stdout);
  63. printf("%d 0 obj\n", id);
  64. }
  65.  
  66. int stream_id, stream_len_id;
  67. long stream_start;
  68. float ypos;
  69. start_page()
  70. {
  71. stream_id = object_id++;
  72. stream_len_id = object_id++;
  73. start_object(stream_id);
  74. printf("<< /Length %d 0 R >>\n", stream_len_id);
  75. printf("stream\n");
  76. stream_start = ftell(stdout);
  77. printf("BT\n/F0 %g Tf\n", font_size);
  78. ypos = page_depth - margin;
  79. printf("%g %g Td\n", margin, ypos);
  80. printf("%g TL\n", lead_size);
  81. }
  82.  
  83. end_page()
  84. {
  85. long stream_len;
  86. int page_id = object_id++;
  87. store_page(page_id);
  88. printf("ET\n");
  89. stream_len = ftell(stdout) - stream_start;
  90. printf("endstream\nendobj\n");
  91. start_object(stream_len_id);
  92. printf("%ld\nendobj\n", stream_len);
  93. start_object(page_id);
  94. printf("<>\nendobj\n", page_tree_id, stream_id);
  95. }
  96.  
  97. do_text()
  98. {
  99. char buffer[8192];
  100. start_page();
  101. while(gets(buffer) != NULL)
  102. {
  103. if(ypos < margin)
  104. {
  105. end_page();
  106. start_page();
  107. }
  108.  
  109. if(strlen(buffer) == 0)
  110. printf("T*\n");
  111. else
  112. {
  113. if(buffer[0] == '\f')
  114. {
  115. end_page();
  116. start_page();
  117. }
  118. else
  119. {
  120. char c, *s = buffer;
  121. putchar('(');
  122. while((c = *s++) != '\0')
  123. {
  124. switch(c)
  125. {
  126. case '(':
  127. case ')':
  128. case '\\':
  129. putchar('\\');
  130. }
  131. putchar(c);
  132. }
  133. printf(")'\n");
  134. }
  135. }
  136. ypos -= lead_size;
  137. }
  138. end_page();
  139. }
  140.  
  141.  
  142. int main(int argc, char **argv)
  143. {
  144. int i, catalog_id, font_id;
  145. long start_xref;
  146. printf("%%PDF-1.0\n");
  147. page_tree_id = object_id++;
  148. do_text();
  149. font_id = object_id++;
  150. start_object(font_id);
  151. printf("<>\nendobj\n");
  152. start_object(page_tree_id);
  153. printf("<, num_pages);
  154. {
  155. PageList *ptr = pages;
  156. printf("/Kids[\n");
  157. while(ptr != NULL)
  158. {
  159. printf("%d 0 R\n", ptr->page_id);
  160. ptr = ptr->next;
  161. }
  162. printf("]\n");
  163. }
  164. printf("/Resources<> >>\n", font_id);
  165. printf("/MediaBox [ 0 0 %g %g ]\n", page_width, page_depth);
  166. printf(">>\nendobj\n");
  167. catalog_id = object_id++;
  168. start_object(catalog_id);
  169. printf("<>\nendobj\n", page_tree_id);
  170. start_xref = ftell(stdout);
  171. printf("xref\n");
  172. printf("0 %d\n", object_id);
  173. printf("0000000000 65535 f \n");
  174. for(i = 1; i < object_id; i++)
  175. printf("%010ld 00000 n \n", xrefs[i]);
  176. printf("trailer\n<<\n/Size %d\n/Root %d 0 R\n>>\n", object_id, catalog_id);
  177. printf("startxref\n%ld\n%%%%EOF\n", start_xref);
  178. exit(0);
  179. return 0;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement