Включение изображения в RDLC приводит к неожиданно большому выходному размеру - PullRequest
2 голосов
/ 02 марта 2012

У меня есть отчет RDLC с некоторыми данными и (необязательно) изображением. Содержание отображается в PDF.

У меня может быть файл контейнера (пакета), в котором хранится 100 одинаковых результатов. Проблема в том, что если я включу изображение, результат будет увеличен в большей степени, чем ожидается.

В качестве примера; Мой отчет RDLC - это счет, в нижней части которого может быть изображение, где отображается изображение подписи. У меня может быть 100 счетов в файле пакета для клиента.

Если размер общего пакета вывода (100 счетов-фактур) без изображения составляет 2 МБ, а изображение - 15 КБ, я ожидаю, что общий пакет вывода с изображением будет около 3,5 МБ (2 МБ + 15 КБ). * 100). Проблема в том, что я получаю общий выходной пакет более 8 МБ.


Существуют ли какие-либо методы, которые можно использовать для уменьшения размера этого вывода, или любые другие способы получения размера вывода, который более соответствует ожиданиям?

1 Ответ

0 голосов
/ 07 марта 2012

В зависимости от возможностей вашего генератора PDF, изображения могут быть сохранены со слабым, без потерь или даже без сжатия.Вы можете использовать следующий метод для извлечения информации об изображении из PDF, чтобы проверить, является ли это вашим случаем.Если это так, можно использовать какое-то программное обеспечение « сжатие PDF ».

(Это может показаться странным, но я действительно не нашел ни одного заранее написанного программного обеспечения, которое могло быthis)

Установите пакеты Python 2.x и PDFMiner (инструкции по установке см. в руководстве PDFMiner # cmap ), затем используйте следующий код для отображения всех изображений вдокумент, их размеры и сжатие.Список и объяснение алгоритмов сжатия, используемых PDF, см. В PDF-спецификации , стр. 23 (таблица «Стандартные фильтры»).

from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice

# Open a PDF file.
fp = open('Reader.pdf', 'rb')
# Create a PDF parser object associated with the file object.
parser = PDFParser(fp)
# Create a PDF document object that stores the document structure.
doc = PDFDocument()
# Connect the parser and document objects.
parser.set_document(doc)
doc.set_parser(parser)
# Supply the password for initialization.
# (If no password is set, give an empty string.)
doc.initialize('')
# Check if the document allows text extraction. If not, abort.
if not doc.is_extractable:
    raise PDFTextExtractionNotAllowed
# Create a PDF resource manager object that stores shared resources.
rsrcmgr = PDFResourceManager()

from pdfminer.layout import LAParams, LTImage
from pdfminer.converter import PDFPageAggregator

# Set parameters for analysis.
laparams = LAParams()
# Create a PDF page aggregator object.
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)

#Build layout trees of all pages
layouts=[]
for page in doc.get_pages():
    interpreter.process_page(page)
    # receive the LTPage object for the page.
    layouts.append(device.get_result())

#search the trees for images and show their info,
# excluding repeating ones
known_ids=set()
count=0;size=0
def lsimages(obj):
    global count; global size
    if hasattr(obj,'_objs'):
        for so in obj._objs:
            if isinstance(so,LTImage):
                i=so; id=i.stream.attrs['ID'].objid
                if id not in known_ids:
                    a=i.stream.attrs
                    print a
                    count+=1;size+=a.get('Length',0)
                    known_ids.add(id)
            lsimages(so)
for l in layouts:
    lsimages(l)
print "Total: %d images, %d bytes"%(count,size)

Кредиты: стандартный код взят из Программирование с PDFMiner статья.

...