Switch annotation flattening to use the form xobjects

Instead of directly putting the contents of the annotation appearance
streams into the page's content stream, add commands to render the
form xobjects directly. This is a more robust way to do it than the
original solution as it works properly with patterns and avoids
problems with resource name clashes between the pages and the form
xobjects.
This commit is contained in:
Jay Berkenbilt 2019-01-02 21:44:10 -05:00
parent 23bcfeb336
commit f78ea057ca
16 changed files with 3165 additions and 1514 deletions

View File

@ -1,6 +1,6 @@
2018-12-31 Jay Berkenbilt <ejb@ql.org>
* Add several methods for flattening form fields and annotations:
* Add methods for flattening form fields and annotations:
- QPDFPageDocumentHelper::flattenAnnotations - integrate
annotation appearance streams into page contents with special
handling for form fields: if appearance streams are up to date
@ -11,15 +11,11 @@
be found.
- QPDFAnnotationObjectHelper::getPageContentForAppearance -
generate the content stream fragment to render an appearance
stream in a page's content stream. Called by flattenAnnotations.
- QPDFAnnotationObjectHelper::getAnnotationAppearanceMatrix -
calculate the matrix that will transform from the appearance
stream coordinates to the page coordinates. Called by
getPageContentForAppearance.
stream in a page's content stream as a form xobject. Called by
flattenAnnotations.
* Add method QPDFObjectHandle::mergeDictionary(), which
recursively merges dictionaries with semantics designed for
merging resource dictionaries. See detailed description in
* Add method QPDFObjectHandle::mergeResources(), which merges
resource dictionaries. See detailed description in
QPDFObjectHandle.hh.
* Add QPDFObjectHandle::Matrix, similar to

View File

@ -72,23 +72,14 @@ class QPDFAnnotationObjectHelper: public QPDFObjectHelper
QPDFObjectHandle getAppearanceStream(std::string const& which,
std::string const& state = "");
// Return a matrix that transforms from the annotation's
// appearance stream's coordinates to the page's coordinates. This
// method also honors the annotation's NoRotate flag if set. The
// matrix is returned as a string representing the six floating
// point numbers to be passed to a cm operator. Returns the empty
// string if it is unable to compute the matrix for any reason.
// The value "rotate" should be set to the page's /Rotate value or
// 0 if none.
QPDF_DLL
std::string getAnnotationAppearanceMatrix(int rotate);
// Generate text suitable for addition to the containing page's
// content stream that replaces this annotation's appearance
// stream. The value "rotate" should be set to the page's /Rotate
// value or 0 if none.
// content stream that draws this annotation's appearance stream
// as a form XObject. The value "name" is the resource name that
// will be used to refer to the form xobject. The value "rotate"
// should be set to the page's /Rotate value or 0 if none.
QPDF_DLL
std::string getPageContentForAppearance(int rotate);
std::string getPageContentForAppearance(
std::string const& name, int rotate);
private:
class Members

View File

@ -559,27 +559,46 @@ class QPDFObjectHandle
QPDF_DLL
bool isOrHasName(std::string const&);
// Merge dictionaries with the following behavior, where "object"
// refers to the object whose method is invoked, and "other"
// refers to the argument:
// * If either object or other is not a dictionary, do nothing
// * Otherwise
// * For each key in other
// * If key is absent in object, insert it
// * If key is present in object
// * If both values are dictionaries, merge the dictionary from
// other into the one from object
// * If both values are arrays, append scalar elements from
// other's that are not present in object's onto object's,
// and ignore non-scalar elements in other's
// * Otherwise ignore
// Merge resource dictionaries. Assumes resource dictionaries have
// the property that the collection of keys of all first-level
// dictionary members contains no duplicates. This method does
// nothing if both this object and the other object are not
// dictionaries. Otherwise, it has following behavior, where
// "object" refers to the object whose method is invoked, and
// "other" refers to the argument:
//
// * For each key in "other" whose value is an array:
// * If "object" does not have that entry, shallow copy it.
// * Otherwise, if "object" has an array in the same place,
// append to that array any objects in "other"'s array that
// are not already present.
// * For each key in "other" whose value is a dictionary:
// * If "object" does not have that entry, shallow copy it.
// * Otherwise, for each key in the subdictionary:
// * If key is not present in "object"'s entry, shallow copy it.
// * Otherwise, ignore. Conflicts are not detected.
//
// The primary purpose of this method is to facilitate merging of
// resource dictionaries. Conflicts are ignored. If needed, a
// future version of qpdf may provide some mechanism for conflict
// resolution, such as providing a handler that is invoked with
// the path to the conflict.
// resource dictionaries that are supposed to have the same scope
// as each other. For example, this can be used to merge a form
// XObject's /Resources dictionary with a form field's /DR.
// Conflicts are not detected. If, in the future, there should be
// a need to detect conflicts, this method could detect them and
// return a mapping from old to new names. This mapping could be
// used for filtering the stream. This would be necessary, for
// example, to merge a form XObject's resources with a page's
// resources with the intention of concatenating the content
// streams.
QPDF_DLL
void mergeDictionary(QPDFObjectHandle other);
void mergeResources(QPDFObjectHandle other);
// Get all resource names from a resourcey dictionary. If this
// object is a dctionary, this method returns a set of all the
// keys in all top-level subdictionaries. For resources
// dictionaries, this is the collection of names that may be
// referenced in the content stream.
QPDF_DLL
std::set<std::string> getResourceNames();
// Return the QPDF object that owns an indirect object. Returns
// null for a direct object.
@ -992,10 +1011,6 @@ class QPDFObjectHandle
ParserCallbacks* callbacks);
std::vector<QPDFObjectHandle> arrayOrStreamToStreamArray(
std::string const& description, std::string& all_description);
void mergeDictionaryInternal(
QPDFObjectHandle other,
std::set<QPDFObjGen>& visiting,
int depth);
static void warn(QPDF*, QPDFExc const&);
class Members

View File

@ -80,19 +80,66 @@ QPDFAnnotationObjectHelper::getAppearanceStream(
}
std::string
QPDFAnnotationObjectHelper::getAnnotationAppearanceMatrix(int rotate)
QPDFAnnotationObjectHelper::getPageContentForAppearance(
std::string const& name, int rotate)
{
// The appearance matrix is the transformation in effect when
// rendering an appearance stream's content. The appearance stream
// itself is a form XObject, which has a /BBox and an optional
// /Matrix. The /BBox describes the bounding box of the annotation
// in unrotated page coordinates. /Matrix may be applied to the
// bounding box to transform the bounding box. The effect of this
// is that the transformed box is still fit within the area the
// annotation designates in its /Rect field.
if (! getAppearanceStream("/N").isStream())
{
return "";
}
// The algorithm for computing the appearance matrix described in
// section 12.5.5 of the ISO-32000 PDF spec. It is as follows:
// The appearance matrix computed by this method is the
// transformation matrix that needs to be in effect when drawing
// this annotation's appearance stream on the page. The algorithm
// for computing the appearance matrix described in section 12.5.5
// of the ISO-32000 PDF spec is similar but not identical to what
// we are doing here.
// When rendering an appearance stream associated with an
// annotation, there are four relevant components:
//
// * The appearance stream's bounding box (/BBox)
// * The appearance stream's matrix (/Matrix)
// * The annotation's rectangle (/Rect)
// * In the case of form fields with the NoRotate flag, the
// page's rotation
// When rendering a form xobject in isolation, just drawn with a
// /Do operator, the is no form field, so page rotation is not
// relevant, and there is no annotation, so /Rect is not relevant,
// so only /BBox and /Matrix are relevant. The effect of these are
// as follows:
// * /BBox is treated as a clipping region
// * /Matrix is applied as a transformation prior to rendering the
// appearance stream.
// There is no relationship between /BBox and /Matrix in this
// case.
// When rendering a form xobject in the context of an annotation,
// things are a little different. In particular, a matrix is
// established such that /BBox, when transformed by /Matrix, would
// fit completely inside of /Rect. /BBox is no longer a clipping
// region. To illustrate the difference, consider a /Matrix of
// [2 0 0 2 0 0], which is scaling by a factor of two along both
// axes. If the appearance stream drew a rectangle equal to /BBox,
// in the case of the form xobject in isolation, this matrix would
// cause only the lower-left quadrant of the rectangle to be
// visible since the scaling would cause the rest of it to fall
// outside of the clipping region. In the case of the form xobject
// displayed in the context of an annotation, such a matrix would
// have no effect at all because it would be applied to the
// bounding box first, and then when the resulting enclosing
// quadrilateral was transformed to fit into /Rect, the effect of
// the scaling would be undone.
// Our job is to create a transformation matrix that compensates
// for these differences so that the appearance stream of an
// annotation can be drawn as a regular form xobject.
// To do this, we perform the following steps, which overlap
// significantly with the algorithm in 12.5.5:
// 1. Transform the four corners of /BBox by applying /Matrix to
// them, creating an arbitrarily transformed quadrilateral.
@ -103,38 +150,22 @@ QPDFAnnotationObjectHelper::getAnnotationAppearanceMatrix(int rotate)
// 3. Compute matrix A that maps the lower left and upper right
// corners of T to the annotation's /Rect. This can be done by
// translating the lower left corner and then scaling so that
// the upper right corner also matches.
// scaling so that the sizes match and translating so that the
// scaled T exactly overlaps /Rect.
// 4. Concatenate /Matrix to A to get matrix AA. This matrix
// translates from appearance stream coordinates to page
// coordinates.
// If the annotation's /F flag has bit 4 set, this means that
// annotation is to be rotated about its upper left corner to
// counteract any rotation of the page so it remains upright. To
// achieve this effect, we do the following extra steps:
// If the annotation's /F flag has bit 4 set, we modify the matrix
// to also rotate the annotation in the opposite direction, and we
// adjust the destination rectangle by rotating it about the upper
// left hand corner so that the annotation will appear upright on
// the rotated page.
// 1. Perform the rotation on /BBox box prior to transforming it
// with /Matrix (by replacing matrix with concatenation of
// matrix onto the rotation)
// You can see that the above algorithm works by imagining the
// following:
// 2. Rotate the destination rectangle by the specified amount
// * In the simple case of where /BBox = /Rect and /Matrix is the
// identity matrix, the transformed quadrilateral in step 1 will
// be the bounding box. Since the bounding box is upright, T
// will be the bounding box. Since /BBox = /Rect, matrix A is
// the identity matrix, and matrix AA in step 4 is also the
// identity matrix.
//
// * Imagine that the rectangle is different from the bounding
// box. In this case, matrix A just transforms the bounding box
// to the rectangle by scaling and translating, effectively
// squeezing or stretching it into /Rect.
//
// * Imagine that /Matrix rotates the annotation by 30 degrees.
// The transformed bounding box would stick out, and T would be
// too big. In this case, matrix A shrinks T down until it fits
// in /Rect.
// 3. Apply the rotation to A as computed above to get the final
// appearance matrix.
QPDFObjectHandle rect_obj = this->oh.getKey("/Rect");
QPDFObjectHandle flags = this->oh.getKey("/F");
@ -157,7 +188,9 @@ QPDFAnnotationObjectHelper::getAnnotationAppearanceMatrix(int rotate)
QTC::TC("qpdf", "QPDFAnnotationObjectHelper default matrix");
}
QPDFObjectHandle::Rectangle rect = rect_obj.getArrayAsRectangle();
if (rotate && flags.isInteger() && (flags.getIntValue() & 16))
bool do_rotate = (rotate && flags.isInteger() &&
(flags.getIntValue() & 16));
if (do_rotate)
{
// If the the annotation flags include the NoRotate bit and
// the page is rotated, we have to rotate the annotation about
@ -229,39 +262,15 @@ QPDFAnnotationObjectHelper::getAnnotationAppearanceMatrix(int rotate)
AA.scale((rect.urx - rect.llx) / (t_urx - t_llx),
(rect.ury - rect.lly) / (t_ury - t_lly));
AA.translate(-t_llx, -t_lly);
// Concatenate the user-specified matrix
AA.concat(matrix);
return AA.unparse();
}
std::string
QPDFAnnotationObjectHelper::getPageContentForAppearance(int rotate)
{
QPDFObjectHandle as = getAppearanceStream("/N");
if (! (as.isStream() && as.getDict().getKey("/BBox").isRectangle()))
if (do_rotate)
{
return "";
AA.rotatex90(rotate);
}
QPDFObjectHandle::Rectangle rect =
as.getDict().getKey("/BBox").getArrayAsRectangle();
std::string cm = getAnnotationAppearanceMatrix(rotate);
if (cm.empty())
{
return "";
}
std::string as_content = (
as.replaceKey("/Subtype", QPDFObjectHandle::newName("/Form"));
return (
"q\n" +
cm + " cm\n" +
QUtil::double_to_string(rect.llx, 5) + " " +
QUtil::double_to_string(rect.lly, 5) + " " +
QUtil::double_to_string(rect.urx - rect.llx, 5) + " " +
QUtil::double_to_string(rect.ury - rect.lly, 5) + " " +
"re W n\n");
PointerHolder<Buffer> buf = as.getStreamData(qpdf_dl_all);
as_content += std::string(
reinterpret_cast<char *>(buf->getBuffer()),
buf->getSize());
as_content += "\nQ\n";
return as_content;
AA.unparse() + " cm\n" +
name + " Do\n" +
"Q\n");
}

View File

@ -826,23 +826,8 @@ QPDFObjectHandle::isOrHasName(std::string const& value)
}
void
QPDFObjectHandle::mergeDictionary(QPDFObjectHandle other)
QPDFObjectHandle::mergeResources(QPDFObjectHandle other)
{
std::set<QPDFObjGen> visiting;
mergeDictionaryInternal(other, visiting, 0);
}
void
QPDFObjectHandle::mergeDictionaryInternal(
QPDFObjectHandle other,
std::set<QPDFObjGen>& visiting,
int depth)
{
if (depth > 100)
{
// Arbitrarily limit depth to avoid stack overflow
return;
}
if (! (isDictionary() && other.isDictionary()))
{
QTC::TC("qpdf", "QPDFObjectHandle merge top type mismatch");
@ -859,33 +844,22 @@ QPDFObjectHandle::mergeDictionaryInternal(
QPDFObjectHandle this_val = getKey(key);
if (this_val.isDictionary() && other_val.isDictionary())
{
if (this_val.isIndirect() && other_val.isIndirect() &&
(this_val.getObjGen() == other_val.getObjGen()))
if (this_val.isIndirect())
{
QTC::TC("qpdf", "QPDFObjectHandle merge equal indirect");
QTC::TC("qpdf", "QPDFObjectHandle replace with copy");
this_val = this_val.shallowCopy();
replaceKey(key, this_val);
}
else if (this_val.isIndirect() &&
(visiting.count(this_val.getObjGen())))
std::set<std::string> other_val_keys = other_val.getKeys();
for (std::set<std::string>::iterator i2 =
other_val_keys.begin();
i2 != other_val_keys.end(); ++i2)
{
QTC::TC("qpdf", "QPDFObjectHandle merge loop");
}
else
{
QPDFObjGen loop;
if (this_val.isIndirect())
if (! this_val.hasKey(*i2))
{
loop = this_val.getObjGen();
visiting.insert(loop);
QTC::TC("qpdf", "QPDFObjectHandle merge shallow copy");
this_val = this_val.shallowCopy();
replaceKey(key, this_val);
}
QTC::TC("qpdf", "QPDFObjectHandle nested merge");
this_val.mergeDictionaryInternal(
other_val, visiting, 1 + depth);
if (loop.getObj())
{
visiting.erase(loop);
this_val.replaceKey(
*i2, other_val.getKey(*i2).shallowCopy());
}
}
}
@ -923,11 +897,39 @@ QPDFObjectHandle::mergeDictionaryInternal(
else
{
QTC::TC("qpdf", "QPDFObjectHandle merge copy from other");
replaceKey(key, other_val);
replaceKey(key, other_val.shallowCopy());
}
}
}
std::set<std::string>
QPDFObjectHandle::getResourceNames()
{
// Return second-level dictionary keys
std::set<std::string> result;
if (! isDictionary())
{
return result;
}
std::set<std::string> keys = getKeys();
for (std::set<std::string>::iterator iter = keys.begin();
iter != keys.end(); ++iter)
{
std::string const& key = *iter;
QPDFObjectHandle val = getKey(key);
if (val.isDictionary())
{
std::set<std::string> val_keys = val.getKeys();
for (std::set<std::string>::iterator i2 = val_keys.begin();
i2 != val_keys.end(); ++i2)
{
result.insert(*i2);
}
}
}
return result;
}
// Indirect object accessors
QPDF*
QPDFObjectHandle::getOwningQPDF()

View File

@ -1,5 +1,6 @@
#include <qpdf/QPDFPageDocumentHelper.hh>
#include <qpdf/QPDFAcroFormDocumentHelper.hh>
#include <qpdf/QUtil.hh>
#include <qpdf/QTC.hh>
QPDFPageDocumentHelper::Members::~Members()
@ -121,6 +122,7 @@ QPDFPageDocumentHelper::flattenAnnotationsForPage(
{
rotate = rotate_obj.getIntValue();
}
int next_fx = 1;
for (std::vector<QPDFAnnotationObjectHelper>::iterator iter =
annots.begin();
iter != annots.end(); ++iter)
@ -140,18 +142,50 @@ QPDFPageDocumentHelper::flattenAnnotationsForPage(
}
if (process)
{
resources.mergeDictionary(as.getDict().getKey("/Resources"));
if (is_widget)
{
QTC::TC("qpdf", "QPDFPageDocumentHelper merge DR");
QPDFFormFieldObjectHelper ff = afdh.getFieldForAnnotation(aoh);
resources.mergeDictionary(ff.getInheritableFieldValue("/DR"));
QPDFObjectHandle as_resources =
as.getDict().getKey("/Resources");
if (as_resources.isIndirect())
{
QTC::TC("qpdf", "QPDFPageDocumentHelper indirect as resources");
as.getDict().replaceKey(
"/Resources", as_resources.shallowCopy());
as_resources = as.getDict().getKey("/Resources");
}
as_resources.mergeResources(
ff.getInheritableFieldValue("/DR"));
}
else
{
QTC::TC("qpdf", "QPDFPageDocumentHelper non-widget annotation");
}
new_content += aoh.getPageContentForAppearance(rotate);
std::set<std::string> names = resources.getResourceNames();
std::string name;
while (next_fx < 1000000)
{
std::string candidate = "/Fxo" + QUtil::int_to_string(next_fx);
++next_fx;
if (names.count(candidate) == 0)
{
name = candidate;
break;
}
}
if (name.empty())
{
// There are already more than a million /Fxo names.
// Somehow I doubt this is going to actually happen.
// Just pick a name and forget conflicts.
name = "/FxConflict";
}
resources.mergeResources(
QPDFObjectHandle::parse(
"<< /XObject << " + name + " null >> >>"));
resources.getKey("/XObject").replaceKey(name, as);
new_content += aoh.getPageContentForAppearance(name, rotate);
}
else
{

View File

@ -371,12 +371,9 @@ qpdf required parameter 0
qpdf required choices 0
QPDFObjectHandle merge top type mismatch 0
QPDFObjectHandle merge shallow copy 0
QPDFObjectHandle nested merge 0
QPDFObjectHandle merge array 0
QPDFObjectHandle merge array dup 0
QPDFObjectHandle merge copy from other 0
QPDFObjectHandle merge loop 0
QPDFObjectHandle merge equal indirect 0
QPDFAnnotationObjectHelper explicit matrix 0
QPDFAnnotationObjectHelper default matrix 0
QPDFAnnotationObjectHelper rotate 90 0
@ -389,3 +386,5 @@ QPDFPageDocumentHelper non-widget annotation 0
QPDFPageDocumentHelper remove annots 0
QPDFPageDocumentHelper replace indirect annots 0
QPDFPageDocumentHelper replace direct annots 0
QPDFObjectHandle replace with copy 0
QPDFPageDocumentHelper indirect as resources 0

View File

@ -38,19 +38,13 @@ endobj
]
/Parent 2 0 R
/Resources <<
/ExtGState <<
/GS0 <<
/AIS false
/BM /Normal
/CA .6
/Type /ExtGState
/ca .6
>>
>>
/Font <<
/F1 11 0 R
>>
/ProcSet 12 0 R
/XObject <<
/Fxo1 13 0 R
>>
>>
/Type /Page
>>
@ -60,7 +54,7 @@ endobj
<<
/F 28
/Open false
/Parent 13 0 R
/Parent 15 0 R
/Rect [
612
601
@ -114,14 +108,13 @@ stream
Q
q
1.00000 0.00000 0.00000 1.00000 235.00000 703.00000 cm
0.00000 0.00000 18.00000 18.00000 re W n
q 1 1 1 rg 0 i 1 w 4 M 1 j 0 J []0 d /GS0 gs 1 0 0 1 9 5.0908 cm 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c h f Q 0 G 1 1 0 rg 0 i 0.60 w 4 M 1 j 0 J []0 d 1 1 0 rg 0 G 0 i 0.59 w 4 M 1 j 0 J []0 d 1 0 0 1 9 5.0908 cm 0 0 m -0.142 0 -0.28 0.008 -0.418 0.015 c -2.199 -1.969 -5.555 -2.242 -4.642 -1.42 c -4.024 -0.862 -3.916 0.111 -3.954 0.916 c -5.658 1.795 -6.772 3.222 -6.772 4.839 c -6.772 7.509 -3.74 9.674 0 9.674 c 3.74 9.674 6.772 7.509 6.772 4.839 c 6.772 2.167 3.74 0 0 0 c 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c b
/Fxo1 Do
Q
endstream
endobj
10 0 obj
1032
71
endobj
11 0 obj
@ -142,9 +135,42 @@ endobj
endobj
13 0 obj
<<
/BBox [
0
0
18
18
]
/Resources <<
/ExtGState <<
/GS0 <<
/AIS false
/BM /Normal
/CA .6
/Type /ExtGState
/ca .6
>>
>>
>>
/Subtype /Form
/Type /XObject
/Length 14 0 R
>>
stream
q 1 1 1 rg 0 i 1 w 4 M 1 j 0 J []0 d /GS0 gs 1 0 0 1 9 5.0908 cm 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c h f Q 0 G 1 1 0 rg 0 i 0.60 w 4 M 1 j 0 J []0 d 1 1 0 rg 0 G 0 i 0.59 w 4 M 1 j 0 J []0 d 1 0 0 1 9 5.0908 cm 0 0 m -0.142 0 -0.28 0.008 -0.418 0.015 c -2.199 -1.969 -5.555 -2.242 -4.642 -1.42 c -4.024 -0.862 -3.916 0.111 -3.954 0.916 c -5.658 1.795 -6.772 3.222 -6.772 4.839 c -6.772 7.509 -3.74 9.674 0 9.674 c 3.74 9.674 6.772 7.509 6.772 4.839 c 6.772 2.167 3.74 0 0 0 c 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c b
endstream
endobj
%QDF: ignore_newline
14 0 obj
928
endobj
15 0 obj
<<
/AP <<
/N 14 0 R
/N 13 0 R
>>
/C [
1
@ -171,62 +197,29 @@ endobj
>>
endobj
14 0 obj
<<
/BBox [
0
0
18
18
]
/Resources <<
/ExtGState <<
/GS0 <<
/AIS false
/BM /Normal
/CA .6
/Type /ExtGState
/ca .6
>>
>>
>>
/Subtype /Form
/Type /XObject
/Length 15 0 R
>>
stream
q 1 1 1 rg 0 i 1 w 4 M 1 j 0 J []0 d /GS0 gs 1 0 0 1 9 5.0908 cm 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c h f Q 0 G 1 1 0 rg 0 i 0.60 w 4 M 1 j 0 J []0 d 1 1 0 rg 0 G 0 i 0.59 w 4 M 1 j 0 J []0 d 1 0 0 1 9 5.0908 cm 0 0 m -0.142 0 -0.28 0.008 -0.418 0.015 c -2.199 -1.969 -5.555 -2.242 -4.642 -1.42 c -4.024 -0.862 -3.916 0.111 -3.954 0.916 c -5.658 1.795 -6.772 3.222 -6.772 4.839 c -6.772 7.509 -3.74 9.674 0 9.674 c 3.74 9.674 6.772 7.509 6.772 4.839 c 6.772 2.167 3.74 0 0 0 c 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c b
endstream
endobj
%QDF: ignore_newline
15 0 obj
928
endobj
xref
0 16
0000000000 65535 f
0000000025 00000 n
0000000079 00000 n
0000000161 00000 n
0000000553 00000 n
0000000716 00000 n
0000000773 00000 n
0000000814 00000 n
0000000913 00000 n
0000000955 00000 n
0000002043 00000 n
0000002065 00000 n
0000002184 00000 n
0000002220 00000 n
0000002550 00000 n
0000003794 00000 n
0000000453 00000 n
0000000616 00000 n
0000000673 00000 n
0000000714 00000 n
0000000813 00000 n
0000000855 00000 n
0000000982 00000 n
0000001002 00000 n
0000001121 00000 n
0000001157 00000 n
0000002401 00000 n
0000002422 00000 n
trailer <<
/Root 1 0 R
/Size 16
/ID [<c5b1999a07a3fdcd0c04cfeed299c25a><31415926535897932384626433832795>]
>>
startxref
3815
2752
%%EOF

View File

@ -36,19 +36,13 @@ endobj
]
/Parent 2 0 R
/Resources <<
/ExtGState <<
/GS0 <<
/AIS false
/BM /Normal
/CA .6
/Type /ExtGState
/ca .6
>>
>>
/Font <<
/F1 11 0 R
>>
/ProcSet 12 0 R
/XObject <<
/Fxo1 13 0 R
>>
>>
/Type /Page
>>
@ -56,7 +50,7 @@ endobj
4 0 obj
[
13 0 R
15 0 R
]
endobj
@ -102,14 +96,13 @@ stream
Q
q
1.00000 0.00000 0.00000 1.00000 235.00000 703.00000 cm
0.00000 0.00000 18.00000 18.00000 re W n
q 1 1 1 rg 0 i 1 w 4 M 1 j 0 J []0 d /GS0 gs 1 0 0 1 9 5.0908 cm 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c h f Q 0 G 1 1 0 rg 0 i 0.60 w 4 M 1 j 0 J []0 d 1 1 0 rg 0 G 0 i 0.59 w 4 M 1 j 0 J []0 d 1 0 0 1 9 5.0908 cm 0 0 m -0.142 0 -0.28 0.008 -0.418 0.015 c -2.199 -1.969 -5.555 -2.242 -4.642 -1.42 c -4.024 -0.862 -3.916 0.111 -3.954 0.916 c -5.658 1.795 -6.772 3.222 -6.772 4.839 c -6.772 7.509 -3.74 9.674 0 9.674 c 3.74 9.674 6.772 7.509 6.772 4.839 c 6.772 2.167 3.74 0 0 0 c 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c b
/Fxo1 Do
Q
endstream
endobj
10 0 obj
1032
71
endobj
11 0 obj
@ -130,52 +123,6 @@ endobj
endobj
13 0 obj
<<
/F 28
/Open false
/Parent 14 0 R
/Rect [
612
601
792
721
]
/Subtype /Popup
/Type /Annot
>>
endobj
14 0 obj
<<
/AP <<
/N 15 0 R
>>
/C [
1
1
0
]
/CA 1
/Contents (Salad)
/CreationDate (D:20181231235455Z00'00)
/F 28
/M (D:20181231235455Z00'00)
/Name /Comment
/P 3 0 R
/Popup 13 0 R
/Rect [
235
703
253
721
]
/Subtype /Text
/T (Jay Berkenbilt)
/Type /Annot
>>
endobj
15 0 obj
<<
/BBox [
0
@ -196,7 +143,7 @@ endobj
>>
/Subtype /Form
/Type /XObject
/Length 16 0 R
/Length 14 0 R
>>
stream
q 1 1 1 rg 0 i 1 w 4 M 1 j 0 J []0 d /GS0 gs 1 0 0 1 9 5.0908 cm 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c h f Q 0 G 1 1 0 rg 0 i 0.60 w 4 M 1 j 0 J []0 d 1 1 0 rg 0 G 0 i 0.59 w 4 M 1 j 0 J []0 d 1 0 0 1 9 5.0908 cm 0 0 m -0.142 0 -0.28 0.008 -0.418 0.015 c -2.199 -1.969 -5.555 -2.242 -4.642 -1.42 c -4.024 -0.862 -3.916 0.111 -3.954 0.916 c -5.658 1.795 -6.772 3.222 -6.772 4.839 c -6.772 7.509 -3.74 9.674 0 9.674 c 3.74 9.674 6.772 7.509 6.772 4.839 c 6.772 2.167 3.74 0 0 0 c 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c b
@ -204,34 +151,80 @@ endstream
endobj
%QDF: ignore_newline
16 0 obj
14 0 obj
928
endobj
15 0 obj
<<
/F 28
/Open false
/Parent 16 0 R
/Rect [
612
601
792
721
]
/Subtype /Popup
/Type /Annot
>>
endobj
16 0 obj
<<
/AP <<
/N 13 0 R
>>
/C [
1
1
0
]
/CA 1
/Contents (Salad)
/CreationDate (D:20181231235455Z00'00)
/F 28
/M (D:20181231235455Z00'00)
/Name /Comment
/P 3 0 R
/Popup 15 0 R
/Rect [
235
703
253
721
]
/Subtype /Text
/T (Jay Berkenbilt)
/Type /Annot
>>
endobj
xref
0 17
0000000000 65535 f
0000000025 00000 n
0000000079 00000 n
0000000161 00000 n
0000000543 00000 n
0000000595 00000 n
0000000652 00000 n
0000000693 00000 n
0000000792 00000 n
0000000834 00000 n
0000001922 00000 n
0000001944 00000 n
0000002063 00000 n
0000002099 00000 n
0000002240 00000 n
0000002571 00000 n
0000003815 00000 n
0000000443 00000 n
0000000495 00000 n
0000000552 00000 n
0000000593 00000 n
0000000692 00000 n
0000000734 00000 n
0000000861 00000 n
0000000881 00000 n
0000001000 00000 n
0000001036 00000 n
0000002280 00000 n
0000002301 00000 n
0000002442 00000 n
trailer <<
/Root 1 0 R
/Size 17
/ID [<c5b1999a07a3fdcd0c04cfeed299c25a><31415926535897932384626433832795>]
>>
startxref
3836
2773
%%EOF

View File

@ -1440,14 +1440,7 @@ endobj
/ExtGState <<
/FXE1 42 0 R
>>
/Font <<
/ArialMT 26 0 R
/F2 24 0 R
/F3 26 0 R
/FXF1 26 0 R
/Helv 29 0 R
/ZaDi 13 0 R
>>
/Font 4 0 R
/ProcSet [
/PDF
/Text
@ -1456,6 +1449,19 @@ endobj
/ImageB
]
/XObject <<
/Fxo1 46 0 R
/Fxo10 58 0 R
/Fxo11 66 0 R
/Fxo12 66 0 R
/Fxo13 68 0 R
/Fxo2 48 0 R
/Fxo3 72 0 R
/Fxo4 50 0 R
/Fxo5 52 0 R
/Fxo6 54 0 R
/Fxo7 60 0 R
/Fxo8 56 0 R
/Fxo9 70 0 R
>>
>>
/Type /Page
@ -1478,7 +1484,29 @@ endobj
0
0
]
/Resources 33 0 R
/Resources <<
/Encoding <<
/PDFDocEncoding 41 0 R
>>
/Font <<
/ArialMT 26 0 R
/F2 24 0 R
/F3 26 0 R
/FXF1 26 0 R
/Helv 29 0 R
/ZaDi 13 0 R
>>
/ProcSet [
/PDF
/Text
/ImageC
/ImageI
/ImageB
]
/XObject <<
>>
>>
/Subtype /Form
/Length 47 0 R
>>
stream
@ -1520,7 +1548,29 @@ endobj
0
0
]
/Resources 34 0 R
/Resources <<
/Encoding <<
/PDFDocEncoding 41 0 R
>>
/Font <<
/ArialMT 26 0 R
/F2 24 0 R
/F3 26 0 R
/FXF1 26 0 R
/Helv 29 0 R
/ZaDi 13 0 R
>>
/ProcSet [
/PDF
/Text
/ImageC
/ImageI
/ImageB
]
/XObject <<
>>
>>
/Subtype /Form
/Length 49 0 R
>>
stream
@ -1562,7 +1612,29 @@ endobj
0
0
]
/Resources 36 0 R
/Resources <<
/Encoding <<
/PDFDocEncoding 41 0 R
>>
/Font <<
/ArialMT 26 0 R
/F2 24 0 R
/F3 26 0 R
/FXF1 26 0 R
/Helv 29 0 R
/ZaDi 13 0 R
>>
/ProcSet [
/PDF
/Text
/ImageC
/ImageI
/ImageB
]
/XObject <<
>>
>>
/Subtype /Form
/Length 51 0 R
>>
stream
@ -1583,7 +1655,29 @@ endobj
150
14.2
]
/Resources 30 0 R
/Resources <<
/Encoding <<
/PDFDocEncoding 41 0 R
>>
/Font <<
/ArialMT 26 0 R
/F2 24 0 R
/F3 26 0 R
/FXF1 26 0 R
/Helv 29 0 R
/ZaDi 13 0 R
>>
/ProcSet [
/PDF
/Text
/ImageC
/ImageI
/ImageB
]
/XObject <<
>>
>>
/Subtype /Form
/Length 53 0 R
>>
stream
@ -1613,7 +1707,29 @@ endobj
0
0
]
/Resources 37 0 R
/Resources <<
/Encoding <<
/PDFDocEncoding 41 0 R
>>
/Font <<
/ArialMT 26 0 R
/F2 24 0 R
/F3 26 0 R
/FXF1 26 0 R
/Helv 29 0 R
/ZaDi 13 0 R
>>
/ProcSet [
/PDF
/Text
/ImageC
/ImageI
/ImageB
]
/XObject <<
>>
>>
/Subtype /Form
/Length 55 0 R
>>
stream
@ -1642,7 +1758,29 @@ endobj
0
0
]
/Resources 39 0 R
/Resources <<
/Encoding <<
/PDFDocEncoding 41 0 R
>>
/Font <<
/ArialMT 26 0 R
/F2 24 0 R
/F3 26 0 R
/FXF1 26 0 R
/Helv 29 0 R
/ZaDi 13 0 R
>>
/ProcSet [
/PDF
/Text
/ImageC
/ImageI
/ImageB
]
/XObject <<
>>
>>
/Subtype /Form
/Length 57 0 R
>>
stream
@ -1671,7 +1809,29 @@ endobj
0
0
]
/Resources 32 0 R
/Resources <<
/Encoding <<
/PDFDocEncoding 41 0 R
>>
/Font <<
/ArialMT 26 0 R
/F2 24 0 R
/F3 26 0 R
/FXF1 26 0 R
/Helv 29 0 R
/ZaDi 13 0 R
>>
/ProcSet [
/PDF
/Text
/ImageC
/ImageI
/ImageB
]
/XObject <<
>>
>>
/Subtype /Form
/Length 59 0 R
>>
stream
@ -1700,7 +1860,29 @@ endobj
0
0
]
/Resources 38 0 R
/Resources <<
/Encoding <<
/PDFDocEncoding 41 0 R
>>
/Font <<
/ArialMT 26 0 R
/F2 24 0 R
/F3 26 0 R
/FXF1 26 0 R
/Helv 29 0 R
/ZaDi 13 0 R
>>
/ProcSet [
/PDF
/Text
/ImageC
/ImageI
/ImageB
]
/XObject <<
>>
>>
/Subtype /Form
/Length 61 0 R
>>
stream
@ -1816,6 +1998,9 @@ endobj
0
]
/Resources <<
/Font <<
/ZaDi 13 0 R
>>
/ProcSet [
/PDF
]
@ -1851,7 +2036,29 @@ endobj
157.1
14.2
]
/Resources 40 0 R
/Resources <<
/Encoding <<
/PDFDocEncoding 41 0 R
>>
/Font <<
/ArialMT 26 0 R
/F2 24 0 R
/F3 26 0 R
/FXF1 26 0 R
/Helv 29 0 R
/ZaDi 13 0 R
>>
/ProcSet [
/PDF
/Text
/ImageC
/ImageI
/ImageB
]
/XObject <<
>>
>>
/Subtype /Form
/Length 69 0 R
>>
stream
@ -1888,7 +2095,29 @@ endobj
0
0
]
/Resources 31 0 R
/Resources <<
/Encoding <<
/PDFDocEncoding 41 0 R
>>
/Font <<
/ArialMT 26 0 R
/F2 24 0 R
/F3 26 0 R
/FXF1 26 0 R
/Helv 29 0 R
/ZaDi 13 0 R
>>
/ProcSet [
/PDF
/Text
/ImageC
/ImageI
/ImageB
]
/XObject <<
>>
>>
/Subtype /Form
/Length 71 0 R
>>
stream
@ -1930,7 +2159,29 @@ endobj
0
0
]
/Resources 35 0 R
/Resources <<
/Encoding <<
/PDFDocEncoding 41 0 R
>>
/Font <<
/ArialMT 26 0 R
/F2 24 0 R
/F3 26 0 R
/FXF1 26 0 R
/Helv 29 0 R
/ZaDi 13 0 R
>>
/ProcSet [
/PDF
/Text
/ImageC
/ImageI
/ImageB
]
/XObject <<
>>
>>
/Subtype /Form
/Length 73 0 R
>>
stream
@ -2400,164 +2651,61 @@ stream
Q
q
1.00000 0.00000 0.00000 1.00000 165.70000 453.70000 cm
0.00000 0.00000 150.00000 14.20000 re W n
q
Q
/Tx BMC
q
1 1 148 12.2 re
W
n
BT
0 0 0 rg
1 3.28299 Td
/FXF1 11 Tf
(ABC) Tj
ET
Q
EMC
/Fxo1 Do
Q
q
1.00000 0.00000 0.00000 1.00000 165.70000 421.20000 cm
0.00000 0.00000 150.00000 14.20000 re W n
q
Q
/Tx BMC
q
1 1 148 12.2 re
W
n
BT
0 0 0 rg
1 3.28299 Td
/FXF1 11 Tf
(DEF) Tj
ET
Q
EMC
/Fxo2 Do
Q
q
1.00000 0.00000 0.00000 1.00000 165.70000 388.30000 cm
0.00000 0.00000 150.00000 14.20000 re W n
q
Q
/Fxo3 Do
Q
q
1.00000 0.00000 0.00000 1.00000 378.40000 388.40000 cm
0.00000 0.00000 68.50000 14.20000 re W n
q
Q
/Fxo4 Do
Q
q
1.00000 0.00000 0.00000 1.00000 165.70000 368.40000 cm
0.00000 0.00000 150.00000 14.20000 re W n
/Tx BMC
EMC
/Fxo5 Do
Q
q
1.00000 0.00000 0.00000 1.00000 165.70000 348.50000 cm
0.00000 0.00000 72.80000 14.20000 re W n
q
Q
/Fxo6 Do
Q
q
1.00000 0.00000 0.00000 1.00000 297.10000 348.50000 cm
0.00000 0.00000 150.10000 14.20000 re W n
q
Q
/Fxo7 Do
Q
q
1.00000 0.00000 0.00000 1.00000 165.70000 315.90000 cm
0.00000 0.00000 150.00000 14.20000 re W n
q
Q
/Fxo8 Do
Q
q
1.00000 0.00000 0.00000 1.00000 165.70000 283.40000 cm
0.00000 0.00000 75.50000 14.20000 re W n
q
Q
/Tx BMC
q
1 1 60.5 12.2 re
W
n
BT
0 0 0 rg
1 3.24501 Td
/FXF1 11 Tf
(Man) Tj
ET
Q
EMC
/Fxo9 Do
Q
q
1.00000 0.00000 0.00000 1.00000 165.70000 250.80000 cm
0.00000 0.00000 72.30000 14.20000 re W n
q
Q
/Fxo10 Do
Q
q
1.00000 0.00000 0.00000 1.00000 164.10000 221.40000 cm
0.00000 0.00000 11.30000 10.90000 re W n
q
1 1 9.3 8.9 re
W
n
0 G
2.2 8.9 m
9.1 2 l
9.1 8.9 m
2.2 2 l
s
Q
/Fxo11 Do
Q
q
1.00000 0.00000 0.00000 1.00000 154.80000 177.60000 cm
0.00000 0.00000 11.30000 10.90000 re W n
q
1 1 9.3 8.9 re
W
n
0 G
2.2 8.9 m
9.1 2 l
9.1 8.9 m
2.2 2 l
s
Q
/Fxo12 Do
Q
q
1.00000 0.00000 0.00000 1.00000 165.70000 143.40000 cm
0.00000 0.00000 157.10000 14.20000 re W n
1 1 0.6 rg
0 0 156.9 14.4 re f*
/Tx BMC
BT
0 0 0 rg /F3 11 Tf
0 g
2 2.106 Td
(Blue) Tj
ET
EMC
/Fxo13 Do
Q
endstream
endobj
83 0 obj
1852
891
endobj
84 0 obj
@ -2603,10 +2751,10 @@ endobj
>>
stream
ê 
    !"#$%&'B—P P@TUUVxW=WPXXX×Y‰Z¸\)\=]|]<5D>^i^}_„_˜`H`[ññ–õeõ‘õÌõöùùF»Ñfz(<
    !"#$%&'B—P P@SnXZc×eefwfhjj+lklnhn{ÿŸÿ¶±ì:f  / Ä Ø  š
endstream
endobj
startxref
66108
68762
%%EOF

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -956,12 +956,19 @@ q
0 0 103.45 53 re s
0 0 1 RG
5 5 15 15 re s
1 w
1 0 0 RG
-10 25 m
113.45 25 l
52 -10 m
52 63 l
s
Q
endstream
endobj
38 0 obj
60
113
endobj
%% Original object ID: 39 0
@ -1084,12 +1091,19 @@ q
0 0 103.45 53 re s
0 0 1 RG
5 5 15 15 re s
1 w
1 0 0 RG
-10 25 m
113.45 25 l
52 -10 m
52 63 l
s
Q
endstream
endobj
46 0 obj
60
113
endobj
%% Original object ID: 47 0
@ -1227,12 +1241,19 @@ q
0 0 103.45 53 re s
0 0 1 RG
5 5 15 15 re s
1 w
1 0 0 RG
-10 25 m
113.45 25 l
52 -10 m
52 63 l
s
Q
endstream
endobj
54 0 obj
60
113
endobj
%% Original object ID: 55 0
@ -1372,12 +1393,19 @@ q
0 0 103.45 53 re s
0 0 1 RG
5 5 15 15 re s
1 w
1 0 0 RG
-10 25 m
113.45 25 l
52 -10 m
52 63 l
s
Q
endstream
endobj
62 0 obj
60
113
endobj
%% Original object ID: 63 0
@ -1500,12 +1528,19 @@ q
0 0 103.45 53 re s
0 0 1 RG
5 5 15 15 re s
1 w
1 0 0 RG
-10 25 m
113.45 25 l
52 -10 m
52 63 l
s
Q
endstream
endobj
70 0 obj
60
113
endobj
%% Original object ID: 71 0
@ -1644,12 +1679,19 @@ q
0 0 103.45 53 re s
0 0 1 RG
5 5 15 15 re s
1 w
1 0 0 RG
-10 25 m
113.45 25 l
52 -10 m
52 63 l
s
Q
endstream
endobj
78 0 obj
60
113
endobj
%% Original object ID: 79 0
@ -1772,12 +1814,19 @@ q
0 0 103.45 53 re s
0 0 1 RG
5 5 15 15 re s
1 w
1 0 0 RG
-10 25 m
113.45 25 l
52 -10 m
52 63 l
s
Q
endstream
endobj
86 0 obj
60
113
endobj
%% Original object ID: 87 0
@ -1900,12 +1949,19 @@ q
0 0 103.45 53 re s
0 0 1 RG
5 5 15 15 re s
1 w
1 0 0 RG
-10 25 m
113.45 25 l
52 -10 m
52 63 l
s
Q
endstream
endobj
94 0 obj
60
113
endobj
%% Original object ID: 95 0
@ -2027,12 +2083,19 @@ q
0 0 103.45 53 re s
0 0 1 RG
5 5 15 15 re s
1 w
1 0 0 RG
-10 25 m
113.45 25 l
52 -10 m
52 63 l
s
Q
endstream
endobj
102 0 obj
60
113
endobj
%% Original object ID: 103 0
@ -2568,106 +2631,106 @@ xref
0000010828 00000 n
0000011049 00000 n
0000011097 00000 n
0000011311 00000 n
0000011359 00000 n
0000011569 00000 n
0000011617 00000 n
0000011835 00000 n
0000011883 00000 n
0000011944 00000 n
0000012321 00000 n
0000012537 00000 n
0000012585 00000 n
0000012797 00000 n
0000012845 00000 n
0000013124 00000 n
0000013172 00000 n
0000013233 00000 n
0000013600 00000 n
0000013874 00000 n
0000013922 00000 n
0000014134 00000 n
0000014182 00000 n
0000014466 00000 n
0000014514 00000 n
0000014575 00000 n
0000014955 00000 n
0000015229 00000 n
0000015277 00000 n
0000015489 00000 n
0000015537 00000 n
0000015755 00000 n
0000015803 00000 n
0000015864 00000 n
0000016245 00000 n
0000011364 00000 n
0000011413 00000 n
0000011623 00000 n
0000011671 00000 n
0000011889 00000 n
0000011937 00000 n
0000011998 00000 n
0000012375 00000 n
0000012644 00000 n
0000012693 00000 n
0000012905 00000 n
0000012953 00000 n
0000013232 00000 n
0000013280 00000 n
0000013341 00000 n
0000013708 00000 n
0000014035 00000 n
0000014084 00000 n
0000014296 00000 n
0000014344 00000 n
0000014628 00000 n
0000014676 00000 n
0000014737 00000 n
0000015117 00000 n
0000015444 00000 n
0000015493 00000 n
0000015705 00000 n
0000015753 00000 n
0000015971 00000 n
0000016019 00000 n
0000016080 00000 n
0000016461 00000 n
0000016509 00000 n
0000016721 00000 n
0000016769 00000 n
0000017048 00000 n
0000017096 00000 n
0000017157 00000 n
0000017537 00000 n
0000017816 00000 n
0000017864 00000 n
0000018076 00000 n
0000018124 00000 n
0000018347 00000 n
0000018395 00000 n
0000018456 00000 n
0000018823 00000 n
0000019039 00000 n
0000019087 00000 n
0000019299 00000 n
0000019347 00000 n
0000019565 00000 n
0000019613 00000 n
0000019674 00000 n
0000020055 00000 n
0000020271 00000 n
0000020319 00000 n
0000020531 00000 n
0000020579 00000 n
0000020797 00000 n
0000020845 00000 n
0000020907 00000 n
0000021276 00000 n
0000021494 00000 n
0000021544 00000 n
0000021758 00000 n
0000021831 00000 n
0000022152 00000 n
0000022203 00000 n
0000022375 00000 n
0000022502 00000 n
0000022629 00000 n
0000022950 00000 n
0000023001 00000 n
0000023128 00000 n
0000023449 00000 n
0000023500 00000 n
0000023627 00000 n
0000023948 00000 n
0000023999 00000 n
0000024126 00000 n
0000024447 00000 n
0000024498 00000 n
0000024625 00000 n
0000024946 00000 n
0000024997 00000 n
0000025124 00000 n
0000025445 00000 n
0000025496 00000 n
0000025623 00000 n
0000025944 00000 n
0000025995 00000 n
0000026122 00000 n
0000026443 00000 n
0000026494 00000 n
0000026621 00000 n
0000026748 00000 n
0000026875 00000 n
0000027002 00000 n
0000016730 00000 n
0000016779 00000 n
0000016991 00000 n
0000017039 00000 n
0000017318 00000 n
0000017366 00000 n
0000017427 00000 n
0000017807 00000 n
0000018139 00000 n
0000018188 00000 n
0000018400 00000 n
0000018448 00000 n
0000018671 00000 n
0000018719 00000 n
0000018780 00000 n
0000019147 00000 n
0000019416 00000 n
0000019465 00000 n
0000019677 00000 n
0000019725 00000 n
0000019943 00000 n
0000019991 00000 n
0000020052 00000 n
0000020433 00000 n
0000020702 00000 n
0000020751 00000 n
0000020963 00000 n
0000021011 00000 n
0000021229 00000 n
0000021277 00000 n
0000021339 00000 n
0000021708 00000 n
0000021979 00000 n
0000022030 00000 n
0000022244 00000 n
0000022317 00000 n
0000022638 00000 n
0000022689 00000 n
0000022861 00000 n
0000022988 00000 n
0000023115 00000 n
0000023436 00000 n
0000023487 00000 n
0000023614 00000 n
0000023935 00000 n
0000023986 00000 n
0000024113 00000 n
0000024434 00000 n
0000024485 00000 n
0000024612 00000 n
0000024933 00000 n
0000024984 00000 n
0000025111 00000 n
0000025432 00000 n
0000025483 00000 n
0000025610 00000 n
0000025931 00000 n
0000025982 00000 n
0000026109 00000 n
0000026430 00000 n
0000026481 00000 n
0000026608 00000 n
0000026929 00000 n
0000026980 00000 n
0000027107 00000 n
0000027234 00000 n
0000027361 00000 n
0000027488 00000 n
trailer <<
/DocChecksum /DA785F789D02970D387C264D0A6C8CB0
/Info 2 0 R
@ -2676,5 +2739,5 @@ trailer <<
/ID [<976442cb303b8d5e88a36a127de2a19f><1f7f023bcea1641cee1f72048a9d0676>]
>>
startxref
27059
27545
%%EOF

View File

@ -6,11 +6,9 @@
"/b": "conflict: seen",
"/c": [
2,
3,
1
3
],
"/d": {
"/x": 24,
"/y": 25,
"/z": 26
},
@ -33,4 +31,14 @@
"two"
]
}
/A
/B
/C
/a
/b
/c
/d
/e
/indirect2
/recursive
test 50 done

View File

@ -5,7 +5,7 @@
1 0 obj
<<
/Type /ObjStm
/Length 18715
/Length 18617
/N 44
/First 398
>>
@ -31,29 +31,29 @@ stream
20 8074
21 8505
22 9308
23 10169
24 10264
25 12179
26 12281
27 12414
28 12516
29 14446
30 15052
31 15184
32 15381
33 15578
34 15775
35 15972
36 16169
37 16366
38 16563
39 16760
40 16957
41 17154
42 17351
43 17582
44 17840
45 18193
23 10071
24 10166
25 12081
26 12183
27 12316
28 12418
29 14348
30 14954
31 15086
32 15283
33 15480
34 15677
35 15874
36 16071
37 16268
38 16465
39 16662
40 16859
41 17056
42 17253
43 17484
44 17742
45 18095
%% Object stream: object 2, index 0
<<
/AcroForm <<
@ -719,13 +719,6 @@ stream
>>
/ExtGState <<
/FXE1 25 0 R
/GS0 <<
/AIS false
/BM /Normal
/CA .6
/Type /ExtGState
/ca .6
>>
>>
/Font 26 0 R
/ProcSet [
@ -736,6 +729,7 @@ stream
/ImageB
]
/XObject <<
/Fxo1 86 0 R
>>
>>
/Type /Page
@ -1160,7 +1154,7 @@ stream
/FontDescriptor 43 0 R
/LastChar 50
/Subtype /TrueType
/ToUnicode 86 0 R
/ToUnicode 88 0 R
/Type /Font
/Widths [
750
@ -1429,7 +1423,7 @@ stream
2000
1006
]
/FontFile2 88 0 R
/FontFile2 90 0 R
/FontName /CAAAAA+ArialMT
/ItalicAngle 0
/StemV 80
@ -1438,7 +1432,7 @@ stream
%% Object stream: object 44, index 42
<<
/AP <<
/N 90 0 R
/N 86 0 R
>>
/C [
1
@ -2076,15 +2070,13 @@ stream
Q
q
1.00000 0.00000 0.00000 1.00000 235.00000 703.00000 cm
0.00000 0.00000 18.00000 18.00000 re W n
q 1 1 1 rg 0 i 1 w 4 M 1 j 0 J []0 d /GS0 gs 1 0 0 1 9 5.0908 cm 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c h f Q 0 G 1 1 0 rg 0 i 0.60 w 4 M 1 j 0 J []0 d 1 1 0 rg 0 G 0 i 0.59 w 4 M 1 j 0 J []0 d 1 0 0 1 9 5.0908 cm 0 0 m -0.142 0 -0.28 0.008 -0.418 0.015 c -2.199 -1.969 -5.555 -2.242 -4.642 -1.42 c -4.024 -0.862 -3.916 0.111 -3.954 0.916 c -5.658 1.795 -6.772 3.222 -6.772 4.839 c -6.772 7.509 -3.74 9.674 0 9.674 c 3.74 9.674 6.772 7.509 6.772 4.839 c 6.772 2.167 3.74 0 0 0 c 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c b
/Fxo1 Do
Q
endstream
endobj
81 0 obj
1033
71
endobj
82 0 obj
@ -2120,9 +2112,41 @@ endobj
86 0 obj
<<
/BBox [
0
0
18
18
]
/Resources <<
/ExtGState <<
/GS0 <<
/AIS false
/BM /Normal
/CA .6
/Type /ExtGState
/ca .6
>>
>>
>>
/Subtype /Form
/Type /XObject
/Length 87 0 R
>>
stream
q 1 1 1 rg 0 i 1 w 4 M 1 j 0 J []0 d /GS0 gs 1 0 0 1 9 5.0908 cm 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c h f Q 0 G 1 1 0 rg 0 i 0.60 w 4 M 1 j 0 J []0 d 1 1 0 rg 0 G 0 i 0.59 w 4 M 1 j 0 J []0 d 1 0 0 1 9 5.0908 cm 0 0 m -0.142 0 -0.28 0.008 -0.418 0.015 c -2.199 -1.969 -5.555 -2.242 -4.642 -1.42 c -4.024 -0.862 -3.916 0.111 -3.954 0.916 c -5.658 1.795 -6.772 3.222 -6.772 4.839 c -6.772 7.509 -3.74 9.674 0 9.674 c 3.74 9.674 6.772 7.509 6.772 4.839 c 6.772 2.167 3.74 0 0 0 c 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c b
endstream
endobj
87 0 obj
929
endobj
88 0 obj
<<
/Length 89 0 R
>>
stream
/CIDInit/ProcSet findresource begin
12 dict begin
begincmap
@ -2195,14 +2219,14 @@ end
endstream
endobj
87 0 obj
89 0 obj
918
endobj
88 0 obj
90 0 obj
<<
/Length1 37060
/Length 89 0 R
/Length 91 0 R
>>
stream
true @cmapY:.RÌcvt •Ü.Úà0fpgm bxRnglyf!ä$ÅI˜headNp7X6hheaƒþXP$hmtx€¼ÃXtÐlocabø þYDjmaxp
@ -2518,40 +2542,8 @@ endstream
endobj
%QDF: ignore_newline
89 0 obj
37060
endobj
90 0 obj
<<
/BBox [
0
0
18
18
]
/Resources <<
/ExtGState <<
/GS0 <<
/AIS false
/BM /Normal
/CA .6
/Type /ExtGState
/ca .6
>>
>>
>>
/Subtype /Form
/Type /XObject
/Length 91 0 R
>>
stream
q 1 1 1 rg 0 i 1 w 4 M 1 j 0 J []0 d /GS0 gs 1 0 0 1 9 5.0908 cm 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c h f Q 0 G 1 1 0 rg 0 i 0.60 w 4 M 1 j 0 J []0 d 1 1 0 rg 0 G 0 i 0.59 w 4 M 1 j 0 J []0 d 1 0 0 1 9 5.0908 cm 0 0 m -0.142 0 -0.28 0.008 -0.418 0.015 c -2.199 -1.969 -5.555 -2.242 -4.642 -1.42 c -4.024 -0.862 -3.916 0.111 -3.954 0.916 c -5.658 1.795 -6.772 3.222 -6.772 4.839 c -6.772 7.509 -3.74 9.674 0 9.674 c 3.74 9.674 6.772 7.509 6.772 4.839 c 6.772 2.167 3.74 0 0 0 c 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c b
endstream
endobj
91 0 obj
929
37060
endobj
92 0 obj
@ -2566,10 +2558,10 @@ endobj
>>
stream
 
    !"#$%&'()*+I<EFBFBD>WW/X4XHYMYaZZ$[[\G\Z] ]bNbbehBhnm[monn1rr9P,
    !"#$%&'()*+I.XÿZsZ†[ [4]m]€^‡^_L__`{`<60>bc?cSd,dWdh h i5iIj ï
endstream
endobj
startxref
67628
66566
%%EOF

View File

@ -1760,10 +1760,16 @@ void runtest(int n, char const* filename1, char const* arg2)
// merge-dict.pdf
QPDFObjectHandle d1 = pdf.getTrailer().getKey("/Dict1");
QPDFObjectHandle d2 = pdf.getTrailer().getKey("/Dict2");
d1.mergeDictionary(d2);
d1.mergeResources(d2);
std::cout << d1.getJSON().unparse() << std::endl;
// Top-level type mismatch
d1.mergeDictionary(d2.getKey("/k1"));
d1.mergeResources(d2.getKey("/k1"));
std::set<std::string> names = d1.getResourceNames();
for (std::set<std::string>::iterator iter = names.begin();
iter != names.end(); ++iter)
{
std::cout << *iter << std::endl;
}
}
else
{