diff options
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/PDFHandler.cpp')
-rw-r--r-- | Build/source/texk/dvisvgm/dvisvgm-src/src/PDFHandler.cpp | 42 |
1 files changed, 19 insertions, 23 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFHandler.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFHandler.cpp index 9703124e2c7..ba88e698525 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFHandler.cpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/PDFHandler.cpp @@ -139,19 +139,6 @@ string PDFHandler::mutoolVersion () { } -/** Returns the bounding box of a selected PDF page. */ -BoundingBox PDFHandler::bbox (string &fname, int pageno) { - BoundingBox bbox; - string arraystr = mtShow(fname, "pages/" + to_string(pageno) + "/MediaBox"); - if (arraystr.substr(0, 4) == "null") - arraystr = mtShow(fname, "pages/" + to_string(pageno) + "/Parent/MediaBox"); - auto vec = parse_pdf_array<double>(arraystr); - if (vec.size() == 4) - bbox = BoundingBox(vec[0], vec[1], vec[2], vec[3]); - return bbox; -} - - /** Converts a single page of a PDF file to SVG. If no context element is given, * the SVG page contents are added to a page group element of the SVG tree. * Otherwise, they are added to the context element which is not inserted into @@ -220,15 +207,12 @@ void PDFHandler::finishFile () { void PDFHandler::initPage (int pageno, unique_ptr<SVGElement> context) { _pageno = pageno; - _bbox = bbox(_fname, pageno); - if (context) { + if (!context) + _svg->newPage(_pageno); + else { _context = context.get(); _svg->pushPageContext(std::move(context)); } - else { - _svg->newPage(_pageno); - _svg->setBBox(_bbox); - } // collect sequence of images referenced on current page collectObjects(); _imgSeq.clear(); @@ -287,7 +271,8 @@ void PDFHandler::elementClosed (XMLElement *trcElement) { struct Handler { const char *name; void (PDFHandler::*func)(XMLElement*); - } handlers[9] = { + } handlers[10] = { + {"page", &PDFHandler::doPage}, {"stroke_path", &PDFHandler::doStrokePath}, {"fill_path", &PDFHandler::doFillPath}, {"fill_image", &PDFHandler::doFillImage}, @@ -309,6 +294,13 @@ void PDFHandler::elementClosed (XMLElement *trcElement) { } +void PDFHandler::doPage (XMLElement *trcPageElement) { + auto vec = parse_attr_value<vector<double>>(trcPageElement, "mediabox"); + if (vec.size() == 4) + _bbox = BoundingBox(vec[0], vec[1], vec[2], vec[3]); +} + + /** Returns a color object from color data given in the trace XML. * @param[in] colorspace currently supported: DeviceGray, DeviceRGB, DeviceCMYK * @param[in] value color components depending on color space */ @@ -645,8 +637,9 @@ void PDFHandler::doFillText (XMLElement *trcFillTextElement) { filename = it->second.fname; if (filename.empty()) filename = "sys://"+fontname; - double ptsize = abs(trm[0]); - int fontID = FontManager::instance().registerFont(filename, ptsize); + double ptsize = matrix_extent({trm[0], trm[1], 0, trm[2], trm[3]}); + ptsize = round(10*ptsize)/10; + int fontID = FontManager::instance().registerFont(filename, fontname, ptsize); if (fontID >= 0) { auto font = font_cast<NativeFont*>(FontManager::instance().getFontById(fontID)); if (font != _currentFont) { @@ -789,7 +782,6 @@ void PDFHandler::collectObjects () { _objDict = parse_pdf_dict<ObjID>(mtShow("pages/" + to_string(_pageno) + "/Resources/XObject")); // replace referenced font IDs by actual IDs used for extracted fonts for (auto &entry : _objDict) { - string objtype = mtShow(to_string(entry.second.num)+"/Type", SearchPattern(R"(/(\w+))", "$1")); // store filenames of non-font object in object map auto fnameIt = _extractedFiles.find(entry.second.num); entry.second.fname = fnameIt != _extractedFiles.end() ? tmpdir+fnameIt->second : ""; @@ -798,6 +790,10 @@ void PDFHandler::collectObjects () { if (entry.second.substr(0, 5) == "font-") { string filepath = tmpdir+entry.second; // path to font file string fontname = strip_subset_prefix(FontEngine::instance().getPSName(filepath)); + // If the extracted font file doesn't contain a font name, + // try to get it from the corresponding PDF object. + if (fontname.empty()) + fontname = mtShow(to_string(entry.first)+"/FontName", SearchPattern(R"(/(\w+))", "$1")); _objDict.emplace(fontname, ObjID(entry.first, 0, filepath)); } } |