Fehler compression error -2
. Es wäre toll, wenn jemand ein paar Hinweise geben könnte
Anbei das PDF mit dem Problem:
5_DE.pdf
Fehlermeldung:
Processing Pages: 1/28...mupdf: compression error -2
Traceback (most recent call last):
File "/Users/erikchan/Downloads/convert.py", line 10, in <module>
parse(pdf_files[i], docx_files[i])
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pdf2docx/main.py", line 31, in parse
cv.make_docx(indexes, multi_processing)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pdf2docx/converter.py", line 118, in make_docx
self._make_docx(page_indexes)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pdf2docx/converter.py", line 192, in _make_docx
self.initialize(page).parse().make_page(self.doc_docx)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pdf2docx/converter.py", line 172, in initialize
images, paths = self._paths_extractor.extract_paths(page)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pdf2docx/shape/Path.py", line 61, in extract_paths
image = largest.to_image(page) if largest.contains_curve else None
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pdf2docx/shape/Path.py", line 140, in to_image
return ImagesExtractor.clip_page(page, bbox, zoom)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pdf2docx/image/Image.py", line 60, in clip_page
return cls.to_raw_dict(image, bbox)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pdf2docx/image/Image.py", line 50, in to_raw_dict
'image': image.getPNGData()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/fitz/fitz.py", line 5899, in getPNGData
barray = self._getImageData(1)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/fitz/fitz.py", line 5868, in _getImageData
return _fitz.Pixmap__getImageData(self, format)
RuntimeError: compression error -2
Vielen Dank für die Bereitstellung dieses Falles.
Viele Vektorgrafiken, zB path
wie eine Linie, Kurve und deren Kombination, existieren in Ihrem PDF. Der Beschneidungspfad wird jedoch derzeit von dieser Bibliothek aufgrund technischer Probleme beim Extrahieren dieser Pfade aus dem PDF ignoriert. Einige Pfade sind außerhalb der Seite, ohne abgeschnitten zu werden, was zu diesem compression error -2
Problem führt.
Außerdem zwei weitere Ausgaben zum Konvertieren dieses PDFs:
Die Pfadfarbe ist falsch. Ich denke, die Hauptursache ist, dass derzeit nur Device Color Space
(Grau/RGB/CMYK) berücksichtigt werden, während dieses PDF-Beispiel möglicherweise speziellen Farbräumen wie Indexed CS
, DeviceN CS
folgt.
überlappende Bilder werden entfernt. python-docx
wird angewendet, um das konvertierte docx zu schreiben, aber python-docx
unterstützt jetzt keine Floating-Elemente. Floating-Images werden also als Kompromiss entfernt.
Leider kann pdf2docx
Ihr PDF vorerst nicht konvertieren. Es sollten zumindest folgende Anstrengungen unternommen werden:
Danke @dothinking für die klare Erklärung. Ich bin überrascht, dass diese Bibliothek nicht beliebter ist als sie ist. Die aktuelle Version ist bereits sehr gut und ich weiß, dass viele Leute davon profitieren können.
Bitte lassen Sie mich wissen, wie ich Ihnen bei der Behebung der von Ihnen aufgeführten Probleme helfen kann (ich benötige einige Anleitungen). Ob Beheben der Fehler, Testen oder anderweitig.
Vielen Dank @echan00.
Einige Fortschritte zu diesem Thema:
PyMuPDF
eine neue Funktion zum Extrahieren von Pfaden veröffentlicht hat. Ich schaue mir das an und kann das Problem hoffentlich lösen.Danach sind alle Tests oder Vorschläge willkommen.
Kommentar zum 31.12.2020: Das neueste PyMuPDF 1.18.5 löste dieses Problem teilweise, aber nicht perfekt, insbesondere beim Beschneidungspfad.
Da Inline-Image in python-docx
, sind die Schritte zum Erkunden von Floating-Images:
behind text
Modus)Ergebnisse der XML-Struktur:
<wp:inline>
Knoten unter <w:drawing>
<wp:anchor>
Knoten unter <w:drawing>
<wp:positionH>
und <wp:positionV>
um die feste Position zu definierenDie Idee ist also, den Knoten <wp:anchor>
zu erstellen und dann Unterknoten anzufügen:
<wp:positionH>
und <wp:positionV>
Scheint, dass ein schwebendes Bild mit python-docx
eine häufige Anfrage ist, Dokument hier zum Teilen.
# -*- coding: utf-8 -*-
'''
Implement floating image based on python-docx.
- Text wrapping style: BEHIND TEXT <wp:anchor behindDoc="1">
- Picture position: top-left corner of PAGE `<wp:positionH relativeFrom="page">`.
Create a docx sample (Layout | Positions | More Layout Options) and explore the
source xml (Open as a zip | word | document.xml) to implement other text wrapping
styles and position modes per `CT_Anchor._anchor_xml()`.
'''
from docx.oxml import parse_xml, register_element_cls
from docx.oxml.ns import nsdecls
from docx.oxml.shape import CT_Picture
from docx.oxml.xmlchemy import BaseOxmlElement, OneAndOnlyOne
# refer to docx.oxml.shape.CT_Inline
class CT_Anchor(BaseOxmlElement):
"""
``<w:anchor>`` element, container for a floating image.
"""
extent = OneAndOnlyOne('wp:extent')
docPr = OneAndOnlyOne('wp:docPr')
graphic = OneAndOnlyOne('a:graphic')
<strong i="7">@classmethod</strong>
def new(cls, cx, cy, shape_id, pic, pos_x, pos_y):
"""
Return a new ``<wp:anchor>`` element populated with the values passed
as parameters.
"""
anchor = parse_xml(cls._anchor_xml(pos_x, pos_y))
anchor.extent.cx = cx
anchor.extent.cy = cy
anchor.docPr.id = shape_id
anchor.docPr.name = 'Picture %d' % shape_id
anchor.graphic.graphicData.uri = (
'http://schemas.openxmlformats.org/drawingml/2006/picture'
)
anchor.graphic.graphicData._insert_pic(pic)
return anchor
<strong i="8">@classmethod</strong>
def new_pic_anchor(cls, shape_id, rId, filename, cx, cy, pos_x, pos_y):
"""
Return a new `wp:anchor` element containing the `pic:pic` element
specified by the argument values.
"""
pic_id = 0 # Word doesn't seem to use this, but does not omit it
pic = CT_Picture.new(pic_id, filename, rId, cx, cy)
anchor = cls.new(cx, cy, shape_id, pic, pos_x, pos_y)
anchor.graphic.graphicData._insert_pic(pic)
return anchor
<strong i="9">@classmethod</strong>
def _anchor_xml(cls, pos_x, pos_y):
return (
'<wp:anchor distT="0" distB="0" distL="0" distR="0" simplePos="0" relativeHeight="0" \n'
' behindDoc="1" locked="0" layoutInCell="1" allowOverlap="1" \n'
' %s>\n'
' <wp:simplePos x="0" y="0"/>\n'
' <wp:positionH relativeFrom="page">\n'
' <wp:posOffset>%d</wp:posOffset>\n'
' </wp:positionH>\n'
' <wp:positionV relativeFrom="page">\n'
' <wp:posOffset>%d</wp:posOffset>\n'
' </wp:positionV>\n'
' <wp:extent cx="914400" cy="914400"/>\n'
' <wp:wrapNone/>\n'
' <wp:docPr id="666" name="unnamed"/>\n'
' <wp:cNvGraphicFramePr>\n'
' <a:graphicFrameLocks noChangeAspect="1"/>\n'
' </wp:cNvGraphicFramePr>\n'
' <a:graphic>\n'
' <a:graphicData uri="URI not set"/>\n'
' </a:graphic>\n'
'</wp:anchor>' % ( nsdecls('wp', 'a', 'pic', 'r'), int(pos_x), int(pos_y) )
)
# refer to docx.parts.story.BaseStoryPart.new_pic_inline
def new_pic_anchor(part, image_descriptor, width, height, pos_x, pos_y):
"""Return a newly-created `w:anchor` element.
The element contains the image specified by *image_descriptor* and is scaled
based on the values of *width* and *height*.
"""
rId, image = part.get_or_add_image(image_descriptor)
cx, cy = image.scaled_dimensions(width, height)
shape_id, filename = part.next_id, image.filename
return CT_Anchor.new_pic_anchor(shape_id, rId, filename, cx, cy, pos_x, pos_y)
# refer to docx.text.run.add_picture
def add_float_picture(p, image_path_or_stream, width=None, height=None, pos_x=0, pos_y=0):
"""Add float picture at fixed position `pos_x` and `pos_y` to the top-left point of page.
"""
run = p.add_run()
anchor = new_pic_anchor(run.part, image_path_or_stream, width, height, pos_x, pos_y)
run._r.add_drawing(anchor)
# refer to docx.oxml.shape.__init__.py
register_element_cls('wp:anchor', CT_Anchor)
if __name__ == '__main__':
from docx import Document
from docx.shared import Inches, Pt
document = Document()
# add a floating image
p = document.add_paragraph()
add_float_picture(p, 'test.png', width=Inches(5.0), pos_x=Pt(20), pos_y=Pt(30))
# add text
p.add_run('Hello World'*50)
document.save('output.docx')
Nettes @dothinking , es sieht so aus, als wüssten Sie, was die Probleme genau sind. Ich habe eine Vielzahl von PDFs, die ich testen kann, sobald Sie bereit sind
@dothinking vielen Dank für dein Codebeispiel! Löst mein Problem perfekt!!!!
Hatte so lange keine Zeit für dieses Projekt. Die neue Version v0.5.0
ist jetzt verfügbar, um dieses Problem teilweise zu lösen:
PyMuPDF
, aber nicht so gut für komplizierte Formen, zB Beschneidungspfade.Mit dieser neuesten Version kann das Beispiel-PDF erfolgreich konvertiert werden, erfordert jedoch aufgrund des komplizierten/schönen Stils noch viel Arbeit, um die Qualität der konvertierten docx-Datei zu verbessern.
Wow, das ist ein tolles Upgrade. Vielen Dank für deine harte Arbeit @dothinking
Hilfreichster Kommentar
Scheint, dass ein schwebendes Bild mit
python-docx
eine häufige Anfrage ist, Dokument hier zum Teilen.