Pdf2docx: kesalahan kompresi -2

Dibuat pada 20 Okt 2020  ·  9Komentar  ·  Sumber: dothinking/pdf2docx

Mengalami kesalahan compression error -2 . Akan sangat bagus jika ada yang bisa memberikan beberapa petunjuk

Terlampir PDF dengan masalah:
5_EN.pdf

Pesan eror:

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

bug enhancement

Komentar yang paling membantu

Tampaknya gambar mengambang dengan python-docx adalah permintaan umum, dokumen di sini untuk dibagikan.

# -*- 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')

Semua 9 komentar

Terima kasih telah menyediakan kasus ini.

Banyak grafik vektor, yaitu path seperti garis, kurva dan kombinasinya, ada di pdf Anda. Namun, saat ini jalur kliping diabaikan oleh perpustakaan ini karena masalah teknis saat mengekstrak jalur ini dari pdf. Beberapa jalur keluar dari halaman tanpa terpotong, yang mengakibatkan masalah compression error -2 .

Selain itu, dua masalah lagi untuk mengonversi pdf ini:

  • Warna jalur salah. Saya kira akar masalahnya adalah bahwa saat ini hanya Device Color Space (Abu-abu/RGB/CMYK) yang dipertimbangkan, sementara sampel pdf ini mungkin mengikuti ruang warna khusus seperti Indexed CS , DeviceN CS .

  • gambar yang tumpang tindih dihapus. python-docx diterapkan untuk menulis docx yang dikonversi, tetapi python-docx tidak mendukung elemen mengambang sekarang. Jadi, gambar mengambang dihapus sebagai kompromi.

Jadi, sayangnya, pdf2docx tidak dapat mengonversi pdf Anda untuk saat ini. Setidaknya upaya berikut harus dilakukan:

  • klip jalur saat mengekstrak jalur dari pdf
  • menerapkan lebih banyak ruang warna
  • memperkenalkan gambar mengambang

Terima kasih @dothinking atas penjelasannya yang jelas. Saya terkejut perpustakaan ini tidak lebih populer dari itu. Versi saat ini sudah sangat bagus dan saya tahu banyak orang dapat mengambil manfaat darinya.

Tolong beri tahu saya bagaimana saya dapat membantu menyelesaikan salah satu masalah yang Anda daftarkan (saya akan memerlukan beberapa panduan.) Apakah menyelesaikan bug, pengujian, atau lainnya.

Terima kasih banyak @echan00.

Beberapa kemajuan dalam masalah ini:

  • [x] gambar mengambang didukung .
  • [ ] jalur klip dan ruang warna -> kabar baik bahwa perpustakaan hulu lainnya PyMuPDF menerbitkan fitur baru pada jalur ekstraksi. Saya akan memeriksanya dan mudah-mudahan bisa menyelesaikan masalah ini.

Setelah itu, setiap tes atau saran dihargai.

Komentar pada 31-12-2020: PyMuPDF 1.18.5 terbaru memecahkan masalah ini sebagian, tetapi tidak sempurna, terutama jalur kliping.

Karena gambar sebaris didukung di python-docx , langkah-langkah untuk menjelajahi gambar mengambang:

  • buat dua file docx, satu dengan gambar sebaris dan satu lagi gambar mengambang (untuk kasus ini, mode behind text )
  • periksa perbedaan sumber xml antara kedua file ini
  • mengimplementasikan gambar mengambang berdasarkan struktur dan kode yang diamati untuk gambar sebaris

hasil struktur xml:

  • gambar sebaris adalah simpul <wp:inline> bawah <w:drawing>
  • gambar mengambang adalah simpul <wp:anchor> bawah <w:drawing>
  • selain semua sub-node gambar sebaris, gambar mengambang juga berisi <wp:positionH> dan <wp:positionV> untuk menentukan posisi tetap

Jadi, idenya adalah membuat simpul <wp:anchor> , lalu menambahkan sub-simpul:

  • semua node sama dengan gambar sebaris
  • <wp:positionH> dan <wp:positionV>

Tampaknya gambar mengambang dengan python-docx adalah permintaan umum, dokumen di sini untuk dibagikan.

# -*- 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')

Bagus @dothinking , sepertinya Anda tahu persis apa masalahnya. Saya memiliki berbagai PDF yang dapat saya bantu uji setelah Anda siap

@dothinking terima kasih banyak untuk contoh kode Anda! Memecahkan masalah saya dengan sempurna!!!!

Tidak mendapatkan waktu untuk proyek ini untuk waktu yang lama. Versi baru v0.5.0 sekarang tersedia untuk menyelesaikan sebagian masalah ini:

  • gambar mengambang sekarang didukung.
  • ekstraksi jalur didukung oleh perpustakaan upstream PyMuPDF , tetapi tidak begitu baik untuk bentuk yang rumit, misalnya jalur kliping.

Dengan versi terbaru ini, contoh pdf dapat dikonversi dengan sukses, tetapi masih membutuhkan banyak pekerjaan untuk meningkatkan kualitas file docx yang dikonversi, karena gaya yang rumit/indah.

Wow ini adalah peningkatan yang bagus. Terima kasih banyak atas kerja keras Anda @dothinking

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

startxc picture startxc  ·  4Komentar

harrylyf picture harrylyf  ·  5Komentar

Jalkhov picture Jalkhov  ·  5Komentar

JoHnTsIm picture JoHnTsIm  ·  7Komentar

mitsuhiko picture mitsuhiko  ·  3Komentar