From ce2566d02fa508d96a5f7a1bbd832117b7ab3da3 Mon Sep 17 00:00:00 2001 From: hexingyu Date: Tue, 13 Aug 2024 09:51:27 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dofd=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/HelloWorld.vue | 1 + src/utils/ofd/ofd_parser.js | 8 ++++++-- src/utils/ofd/ofd_render.js | 18 ++++++++--------- src/utils/ofd/ofd_util.js | 38 +++++++++++++++++++---------------- 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue index b6165b0..20c2412 100644 --- a/src/components/HelloWorld.vue +++ b/src/components/HelloWorld.vue @@ -488,6 +488,7 @@ export default { that.loading = false; }, fail(error) { + console.log(error) that.loading = false; that.$alert('OFD打开失败', error, { confirmButtonText: '确定', diff --git a/src/utils/ofd/ofd_parser.js b/src/utils/ofd/ofd_parser.js index ab1a66b..c4c5b19 100644 --- a/src/utils/ofd/ofd_parser.js +++ b/src/utils/ofd/ofd_parser.js @@ -309,8 +309,12 @@ const getMultiMediaRes = async function (zip, res, doc) { const jbig2 = await parseJbig2ImageFromZip(zip, file); multiMediaResObj[item['@_ID']] = jbig2; } else { - const img = await parseOtherImageFromZip(zip, file); - multiMediaResObj[item['@_ID']] = {img, 'format': 'png'}; + try { + const img = await parseOtherImageFromZip(zip, file); + multiMediaResObj[item['@_ID']] = {img, 'format': 'png'}; + } catch (e) { + console.error(e, zip, file) + } } } else { multiMediaResObj[item['@_ID']] = file; diff --git a/src/utils/ofd/ofd_render.js b/src/utils/ofd/ofd_render.js index 9a434fe..a02fe18 100644 --- a/src/utils/ofd/ofd_render.js +++ b/src/utils/ofd/ofd_render.js @@ -241,15 +241,15 @@ const renderLayer = function (pageDiv, fontResObj, drawParamResObj, multiMediaRe let drawParam = layer?.['@_DrawParam']; if (drawParam && Object.keys(drawParamResObj).length > 0 && drawParamResObj[drawParam]) { if (drawParamResObj[drawParam]['relative']) { - drawParam = drawParamResObj[drawParam]['relative']; - if (drawParamResObj[drawParam]['FillColor']) { - fillColor = parseColor(drawParamResObj[drawParam]['FillColor']); + const relaDrawParam = drawParamResObj[drawParam]['relative']; + if (drawParamResObj[relaDrawParam]['FillColor']) { + fillColor = parseColor(drawParamResObj[relaDrawParam]['FillColor']); } - if (drawParamResObj[drawParam]['StrokeColor']) { - strokeColor = parseColor(drawParamResObj[drawParam]['StrokeColor']); + if (drawParamResObj[relaDrawParam]['StrokeColor']) { + strokeColor = parseColor(drawParamResObj[relaDrawParam]['StrokeColor']); } - if (drawParamResObj[drawParam]['LineWidth']) { - lineWith = converterDpi(drawParamResObj[drawParam]['LineWidth']); + if (drawParamResObj[relaDrawParam]['LineWidth']) { + lineWith = converterDpi(drawParamResObj[relaDrawParam]['LineWidth']); } } if (drawParamResObj[drawParam]['FillColor']) { @@ -375,8 +375,8 @@ export const renderTextObject = function (fontResObj, textObject, defaultFillCol for (const textCodePoint of textCodePointList) { if (textCodePoint && !isNaN(textCodePoint.x)) { let text = document.createElementNS('http://www.w3.org/2000/svg', 'text'); - text.setAttribute('x', textCodePoint.x); - text.setAttribute('y', textCodePoint.y); + text.setAttribute('x', textCodePoint.xList.join(' ')); + text.setAttribute('y', textCodePoint.yList.join(' ')); text.innerHTML = textCodePoint.text; if (ctm) { const ctms = parseCtm(ctm); diff --git a/src/utils/ofd/ofd_util.js b/src/utils/ofd/ofd_util.js index 90c704e..ad0427d 100644 --- a/src/utils/ofd/ofd_util.js +++ b/src/utils/ofd/ofd_util.js @@ -194,24 +194,28 @@ export const calTextPoint = function (textCodes) { textStr += ''; textStr = decodeHtml(textStr); textStr = textStr.replace(/ /g, ' '); - for (let i = 0; i < textStr.length; i++) { - if (i > 0 && deltaXList.length > 0) { - x += deltaXList[(i - 1)]; - } - if (i > 0 && deltaYList.length > 0) { - y += deltaYList[(i - 1)]; - } - let text = textStr.substring(i, i + 1); - let filterPointY = textCodePointList.filter((textCodePoint) => { - return textCodePoint.y == converterDpi(y) - }); - if (filterPointY && filterPointY.length) { // Y坐标相同,无需再创建text标签 - filterPointY[0].text += text; - } else { - let textCodePoint = { 'x': converterDpi(x), 'y': converterDpi(y), 'text': text }; - textCodePointList.push(textCodePoint); - } + const maxLen = Math.max(deltaXList.length, deltaYList.length) + let pointX = converterDpi(x) + let pointY = converterDpi(y) + + // 修复字间距过宽的问题 + const xList = [pointX] + const yList = [pointY] + let posX = parseFloat(pointX) + let posY = parseFloat(pointY) + for (let i = 0; i < maxLen; i++) { + posX += converterDpi(deltaXList[i] || 0) + posY += converterDpi(deltaYList[i] || 0) + xList.push(posX) + yList.push(posY) } + textCodePointList.push({ + x: pointX, + y: pointY, + xList, + yList, + text: textStr + }); } } return textCodePointList;