<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Sun, 5 Jan 2025 at 17:03, Werner LEMBERG <<a href="mailto:wl@gnu.org">wl@gnu.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
> The key point is that with qpdf one can edit the *qdf* file (i.e<br>
> notation.qdf in our case) and call<br>
><br>
>   fix-qdf notation.qdf > notation-edited.pdf<br>
><br>
> to have a pdf.<br>
<br>
OK – I hope you can find and fix the problem easily.  If this doesn't<br>
work I can provide a large tarball with all of the necessary LilyPond<br>
input files.<br></blockquote><div><br></div><div>hm, iiuc this is the problem</div><div> 45201 0 obj</div><<<br>  /Names [ (Gregorian accidentals and key signatures) 1731 0 R<br>      (Gregorian articulation signs) 1733 0 R (Gregorian chant contexts)<br>      1729 0 R (Gregorian clefs) 1730 0 R (Gregorian square neume ligatures)<br>      1840 0 R (Grid lines) 1231 0 R (Grouping staves) 1206 0 R<br>      (Guile predicates) 2649 0 R (Guitar) 1542 0 R (Harmonics)<br>      1530 0 R (Harp) 1523 0 R (Harp pedals) 1525 0 R (Hidden notes)<br>      1223 0 R (Hiding staves) 1212 0 R (Horizontal spacing) 2190 0 R<br>      (Horizontal spacing overview) 2191 0 R (Horizontal spacing paper variables)<br>      2158 0 R (How to prevent sharing of music expressions) 2012 0 R<br>      (Hufnagel glyphs) 2509 0 R (Improvisation) 905 0 R (Incipits)<br>      1849 0 R (Including LilyPond files) 2004 0 R (Indicating harmonics and dampened notes)<br>      1544 0 R (Indicating position and barring) 1543 0 R (Indicating power chords)<br>      1545 0 R (Input modes) 1875 0 R (Input structure) 1876 0 R<br>      (Inside the staff) 1219 0 R (Instantiating new staves) 1205 0 R<br>      (Instrument-specific markup) 2623 0 R (Instrument-specific scripts)<br>      2633 0 R (Instrument names) 1214 0 R ]<br>  /Limits [ (Gregorian accidentals and key signatures) (Instrument names) ]<br>>><br>endobj<br></div><div class="gmail_quote gmail_quote_container">the keys of /Names are not correctly sorted,</div><div class="gmail_quote gmail_quote_container"><br></div><div class="gmail_quote gmail_quote_container"><br>/*tex Sort |dest_names| by names: */<br><br>static int dest_cmp(const void *a, const void *b)<br>{<br>    dest_name_entry aa = *(const dest_name_entry *) a;<br>    dest_name_entry bb = *(const dest_name_entry *) b;<br>    return strcmp(aa.objname, bb.objname);<br>}<br><br>void sort_dest_names(PDF pdf)<br>{<br>    qsort(pdf->dest_names, (size_t) pdf->dest_names_ptr, sizeof(dest_name_entry), dest_cmp);<br>}<br><br>/*tex<br><br>    Output the name tree. The tree nature of the destination list forces the<br>    storing of intermediate data in |obj_info| and |obj_aux| fields, which is<br>    further uglified by the fact that |obj_tab| entries do not accept char<br>    pointers.<br><br>*/<br><br>int output_name_tree(PDF pdf)<br>{<br>    /*tex A flag for name tree output: is it |/Names| or |/Kids|: */<br>    boolean is_names = true;<br>    /*tex<br>        The index of current child of |l|; if |k < pdf_dest_names_ptr| then this<br>        is pointer to |dest_names| array; otherwise it is the pointer to<br>        |obj_tab| (object number).<br>    */<br>    int k = 0;<br>    int b = 0;<br>    int m, j, l;<br>    int dests = 0;<br>    int names_head = 0;<br>    int names_tail = 0;<br>    if (pdf->dest_names_ptr == 0) {<br>        goto DONE;<br>    }<br>    sort_dest_names(pdf);</div><div class="gmail_quote gmail_quote_container"><br></div><div class="gmail_quote gmail_quote_container"><br></div></div>