2016-07-20 2 views
-1

Я пишу небольшую библиотеку python, которая использует matplotlib и seaborn для рисования диаграмм, и мне интересно, как я могу проверить, выглядят ли диаграммы так, как я на самом деле хочу.Как я могу определить, правильно ли были созданы файлы PDF?

Таким образом, с учетом справочного pdf-файла, который я назвал правильным, как я могу автоматически проверить, равен ли он динамически сгенерированный файл с фиктивными данными?

Я предполагаю, что это не надежный хэш файла из-за временных меток и т.д.

ответ

0

Некоторые идеи:

  • Использование diff-pdf
  • Привести его к изображению (например, с помощью ImageMagick) и использовать PerceptualDiff
  • Получите данные из PDF как-то (PyPDF2 возможно?) И сравните это
  • Использовать что-нибудь (PyPDF2??) Пропатчить информацию заголовка (например, временные метки) в точке файлы равны и сравнить хэши
1

Для использования с регрессионного тестирования, я написал diffpdf.sh для выполнения постраничного страницы визуального диф для PDF-файлов , Он использует ImageMagick и утилиты Poppler PDF pdftoppm и pdfinfo.

diffpdf.sh выводит ненулевой код возврата, если PDF-файлы не отображаются одинаково и печатают номера страниц для страниц, которые отличаются друг от друга, а также число, которое отражает количество страниц. Визуальное разностное изображение для каждой страницы также сохраняется в каталоге pdfdiff.

#!/bin/bash 

# usage: diffpdf.sh fidle_1.pdf file_2.pdf 

# requirements: 
# - ImageMagick 
# - Poppler's pdftoppm and pdfinfo tools (works with 0.18.4 and 0.41.0, 
#           fails with 0.42.0) 

DIFFDIR="pdfdiff"      # directory to place diff images in 
MAXPROCS=$(getconf _NPROCESSORS_ONLN) # number of parallel processes 

pdf_file1=$1 
pdf_file2=$2 

function diff_page { 
    # based on http://stackoverflow.com/a/33673440/438249 
    pdf_file1=$1 
    pdf_file2=$2 
    page_number=$3 
    page_index=$(($page_number - 1)) 

    (cat $pdf_file1 | pdftoppm -f $page_number -singlefile -gray - | convert - miff:- ; \ 
    cat $pdf_file2 | pdftoppm -f $page_number -singlefile -gray - | convert - miff:-) | \ 
    convert - \(-clone 0-1 -compose darken -composite \) \ 
      -channel RGB -combine $DIFFDIR/$page_number.jpg 

    if (($? > 0)); then 
     echo "Problem running pdftoppm or convert!" 
     exit 1 
    fi 
    grayscale=$(convert pdfdiff/$page_number.jpg -colorspace HSL -channel g -separate +channel -format "%[fx:mean]" info:) 
    if [ "$grayscale" != "0" ]; then 
     echo "page $page_number ($grayscale)" 
     return 1 
    fi 
    return 0 
} 

function num_pages { 
    pdf_file=$1 

    pdfinfo $pdf_file | grep "Pages:" | awk '{print $2}' 
} 

function minimum { 
    echo $(($1 < $2 ? $1 : $2)) 
} 

# guard agains accidental deletion of files in the root directory 
if [ -z "$DIFFDIR" ]; then 
    echo "DIFFDIR needs to be set!" 
    exit 1 
fi 

echo "Running $MAXPROCS processes in parallel" 

pdf1_num_pages=$(num_pages $pdf_file1) 
pdf2_num_pages=$(num_pages $pdf_file2) 

min_pages=$(minimum $pdf1_num_pages $pdf2_num_pages) 

if [ "$pdf1_num_pages" -ne "$pdf2_num_pages" ]; then 
    echo "PDF files have different lengths ($pdf1_num_pages and $pdf2_num_pages)" 
    rc=1 
fi 

if [ -d "$DIFFDIR" ]; then 
    rm -f $DIFFDIR/* 
else 
    mkdir $DIFFDIR 
fi 


# get exit status from subshells (http://stackoverflow.com/a/29535256/438249) 
function wait_for_processes { 
    local rc=0 

    while (("$#")); do 
     # wait returns the exit status for the process 
     if ! wait "$1"; then 
      rc=1 
     fi 
     shift 
    done 
    return $rc 
} 

function howmany() { 
    echo $# 
} 

rc=0 
pids="" 
for page_number in `seq 1 $min_pages`; 
do 
    diff_page $pdf_file1 $pdf_file2 $page_number & 
    pids+=" $!" 
    if [ $(howmany $pids) -eq "$MAXPROCS" ]; then 
     if ! wait_for_processes $pids; then 
      rc=1 
     fi 
     pids="" 
    fi 
done 

if ! wait_for_processes $pids; then 
    rc=1 
fi 

exit $rc 

EDIT: Улучшенная версия этого скрипта, написанного на Python можно найти here.

Смежные вопросы