Commit 3dbbf9f240d952758c5af3e407e3cc8efb9eadbe
1 parent
3b8ce4f1
TODO
Showing
1 changed file
with
87 additions
and
55 deletions
TODO
| @@ -3,66 +3,48 @@ Current | @@ -3,66 +3,48 @@ Current | ||
| 3 | ======= | 3 | ======= |
| 4 | 4 | ||
| 5 | * open bugs | 5 | * open bugs |
| 6 | - | ||
| 7 | - * form features | ||
| 8 | - * flatten | ||
| 9 | - * include in json at document and page level | ||
| 10 | - * values | ||
| 11 | - * names | ||
| 12 | - * other stuff? | ||
| 13 | - * preserve when merging and splitting; functionality should be | ||
| 14 | - similar to outlines. | ||
| 15 | - * set value? | ||
| 16 | - * maybe basic appearance generation for values within pdf doc | ||
| 17 | - encoding that don't use subsetted fonts | ||
| 18 | - | ||
| 19 | - * replace mode: --replace-object, --replace-stream-raw, | ||
| 20 | - --replace-stream-filtered | ||
| 21 | - * update first paragraph of QPDF JSON in the manual to mention this | ||
| 22 | - * object numbers are not stable | ||
| 23 | - * you don't have to specify length for streams | ||
| 24 | - * you only have to specify filtering for streams if providing raw data | 6 | + * Important but non-trivial |
| 7 | + #240 -- invalid indirect references | ||
| 8 | + #209, #231 -- assert in linearization checks | ||
| 9 | + * Security | ||
| 10 | + #263 -- segv | ||
| 11 | + * Performance | ||
| 12 | + #243 -- very slow processing of something | ||
| 13 | + * Easy | ||
| 14 | + #266 -- get final PDF version from QPDFWriter | ||
| 15 | + #259 -- page collation | ||
| 16 | + | ||
| 17 | + * Generate appearance streams. QPDFAcroFormDocumentHelper.hh: | ||
| 18 | + | ||
| 19 | + // If /NeedAppearances is true, generate appearance streams for | ||
| 20 | + // all widget annotations. Note that qpdf's abilitiy to generate | ||
| 21 | + // appearance streams is quite limited. We can only generate | ||
| 22 | + // appearance streams for streams of type variable text, and even | ||
| 23 | + // then, the appearance stream just uses the default parameters | ||
| 24 | + // specified to substitute the form field's value into the | ||
| 25 | + // provided appearance stream. This means that appearance streams | ||
| 26 | + // will likely not look right for any form field values that | ||
| 27 | + // contain characters outside the range of PDF Doc Encoding. Also, | ||
| 28 | + // quadding is ignored. | ||
| 29 | + QPDF_DLL | ||
| 30 | + void generateAppearancesIfNeeded(); | ||
| 31 | + | ||
| 32 | + See need-appearances.pdf, which is based on form-field-types.pdf | ||
| 33 | + and can be modified as needed. Search for it in qpdf.test | ||
| 34 | + | ||
| 35 | + Close #72 when done. | ||
| 36 | + | ||
| 37 | + * form field inclusion in json at document and page level | ||
| 38 | + * values | ||
| 39 | + * names | ||
| 40 | + * other stuff? | ||
| 25 | 41 | ||
| 26 | * special mode for compressing images with DCT | 42 | * special mode for compressing images with DCT |
| 27 | - * allow specifying a single image, all images, images based on | ||
| 28 | - size, specific images | 43 | + * allow specifying a minimum width, height, or pixel area with |
| 44 | + sensible defaults | ||
| 29 | * never replace an image if the replacement is not smaller than the | 45 | * never replace an image if the replacement is not smaller than the |
| 30 | original | 46 | original |
| 31 | 47 | ||
| 32 | - * bookmarks (outlines) 12.3.3 | ||
| 33 | - * support bookmarks when merging | ||
| 34 | - * prune bookmarks that don't point to a surviving page when merging | ||
| 35 | - or splitting | ||
| 36 | - * make sure conflicting named destinations work possibly test by | ||
| 37 | - including the same file by two paths in a merge | ||
| 38 | - | ||
| 39 | - When pruning outlines, keep all outlines in the hierarchy that are | ||
| 40 | - above an outline for a page we care about. If one of the ancestor | ||
| 41 | - outlines points to a non-existent page, clear its dest. If an | ||
| 42 | - outline does not have any children that point to pages in the | ||
| 43 | - document, just omit it. | ||
| 44 | - | ||
| 45 | - Possible strategy: | ||
| 46 | - * resolve all named destinations to explicit destinations | ||
| 47 | - * concatenate top-level outlines | ||
| 48 | - * prune outlines whose dests don't point to a valid page | ||
| 49 | - * recompute all /Count fields | ||
| 50 | - | ||
| 51 | - Test files | ||
| 52 | - * page-labels-and-outlines.pdf: old file with both page labels and | ||
| 53 | - outlines. All destinations are explicit destinations. Each page | ||
| 54 | - has Potato and a number. All titles are feline names. | ||
| 55 | - * outlines-with-actions.pdf: mixture of explicit destinations, | ||
| 56 | - named destinations, goto actions with explicit destinations, and | ||
| 57 | - goto actions with named destinations; uses /Dests key in names | ||
| 58 | - dictionary. Each page has Salad and a number. All titles are | ||
| 59 | - silly words. One destination is an indirect object. | ||
| 60 | - * outlines-with-old-root-dests.pdf: like outlines-with-actions | ||
| 61 | - except it uses the PDF-1.1 /Dests dictionary for named | ||
| 62 | - destinations, and each page has Soup and a number. Also pages are | ||
| 63 | - numbered with upper-case Roman numerals starting with 0. All | ||
| 64 | - titles are silly words preceded by a bullet. | ||
| 65 | - | ||
| 66 | Soon | 48 | Soon |
| 67 | ==== | 49 | ==== |
| 68 | 50 | ||
| @@ -138,6 +120,42 @@ Page splitting/merging | @@ -138,6 +120,42 @@ Page splitting/merging | ||
| 138 | Subramanyam provided a test file; see ../misc/article-threads.pdf. | 120 | Subramanyam provided a test file; see ../misc/article-threads.pdf. |
| 139 | Email Q-Count: 431864 from 2009-11-03. | 121 | Email Q-Count: 431864 from 2009-11-03. |
| 140 | 122 | ||
| 123 | + * bookmarks (outlines) 12.3.3 | ||
| 124 | + * support bookmarks when merging | ||
| 125 | + * prune bookmarks that don't point to a surviving page when merging | ||
| 126 | + or splitting | ||
| 127 | + * make sure conflicting named destinations work possibly test by | ||
| 128 | + including the same file by two paths in a merge | ||
| 129 | + | ||
| 130 | + When pruning outlines, keep all outlines in the hierarchy that are | ||
| 131 | + above an outline for a page we care about. If one of the ancestor | ||
| 132 | + outlines points to a non-existent page, clear its dest. If an | ||
| 133 | + outline does not have any children that point to pages in the | ||
| 134 | + document, just omit it. | ||
| 135 | + | ||
| 136 | + Possible strategy: | ||
| 137 | + * resolve all named destinations to explicit destinations | ||
| 138 | + * concatenate top-level outlines | ||
| 139 | + * prune outlines whose dests don't point to a valid page | ||
| 140 | + * recompute all /Count fields | ||
| 141 | + | ||
| 142 | + Test files | ||
| 143 | + * page-labels-and-outlines.pdf: old file with both page labels and | ||
| 144 | + outlines. All destinations are explicit destinations. Each page | ||
| 145 | + has Potato and a number. All titles are feline names. | ||
| 146 | + * outlines-with-actions.pdf: mixture of explicit destinations, | ||
| 147 | + named destinations, goto actions with explicit destinations, and | ||
| 148 | + goto actions with named destinations; uses /Dests key in names | ||
| 149 | + dictionary. Each page has Salad and a number. All titles are | ||
| 150 | + silly words. One destination is an indirect object. | ||
| 151 | + * outlines-with-old-root-dests.pdf: like outlines-with-actions | ||
| 152 | + except it uses the PDF-1.1 /Dests dictionary for named | ||
| 153 | + destinations, and each page has Soup and a number. Also pages are | ||
| 154 | + numbered with upper-case Roman numerals starting with 0. All | ||
| 155 | + titles are silly words preceded by a bullet. | ||
| 156 | + | ||
| 157 | + * Form fields: should be similar to outlines. | ||
| 158 | + | ||
| 141 | General | 159 | General |
| 142 | ======= | 160 | ======= |
| 143 | 161 | ||
| @@ -146,8 +164,22 @@ directory or that are otherwise not publicly accessible. This includes | @@ -146,8 +164,22 @@ directory or that are otherwise not publicly accessible. This includes | ||
| 146 | things sent to me by email that are specifically not public. Even so, | 164 | things sent to me by email that are specifically not public. Even so, |
| 147 | I find it useful to make reference to them in this list | 165 | I find it useful to make reference to them in this list |
| 148 | 166 | ||
| 167 | + * Additional form features | ||
| 168 | + * set value from CLI? Specify title, and provide way to | ||
| 169 | + disambiguate, probably by giving objgen of field | ||
| 170 | + | ||
| 171 | + * replace mode: --replace-object, --replace-stream-raw, | ||
| 172 | + --replace-stream-filtered | ||
| 173 | + * update first paragraph of QPDF JSON in the manual to mention this | ||
| 174 | + * object numbers are not preserved by write, so object ID lookup | ||
| 175 | + has to be done separately for each invocation | ||
| 176 | + * you don't have to specify length for streams | ||
| 177 | + * you only have to specify filtering for streams if providing raw data | ||
| 178 | + | ||
| 149 | * Pl_TIFFPredictor is pretty slow. | 179 | * Pl_TIFFPredictor is pretty slow. |
| 150 | 180 | ||
| 181 | + * Maybe disambiguate resources when flattening annotations | ||
| 182 | + | ||
| 151 | * Some test cases on bad fails fail because qpdf is unable to find | 183 | * Some test cases on bad fails fail because qpdf is unable to find |
| 152 | the root dictionary when it fails to read the trailer. Recovery | 184 | the root dictionary when it fails to read the trailer. Recovery |
| 153 | could find the root dictionary and even the info dictionary in | 185 | could find the root dictionary and even the info dictionary in |