список исправлений вне диапазона

Возможно ли использовать pdfbox для включения других страниц PDF в качестве встроенных объектов на странице

Это должно быть возможно. Формат PDF позволяет использовать так называемые формы xobjects для использования в качестве таких внедренных объектов. Однако я не вижу явной реализации для этого, но процедура достаточно схожа с тем, что делают PageExtractor или PDFMergerUtility.

Доказательство концепции, полученное из PageExtractor с использованием текущего SNAPSHOT версии версии PDFBox 2.0.0:

PDDocument source = PDDocument.loadNonSeq(SOURCE, null);
List<PDPage> pages = source.getDocumentCatalog().getAllPages();

PDDocument target = new PDDocument();
PDPage page = new PDPage();
PDRectangle cropBox = page.findCropBox();
page.setResources(new PDResources());
target.addPage(page);

PDFormXObject xobject = importAsXObject(target, pages.get(0));
page.getResources().addXObject(xobject, "X");

PDPageContentStream content = new PDPageContentStream(target, page);
AffineTransform transform = new AffineTransform(0, 0.5, -0.5, 0, cropBox.getWidth(), 0);
content.drawXObject(xobject, transform);
transform = new AffineTransform(0.5, 0.5, -0.5, 0.5, 0.5 * cropBox.getWidth(), 0.2 * cropBox.getHeight());
content.drawXObject(xobject, transform);
content.close();

target.save(TARGET);
target.close();
source.close();

Этот код импортирует первую страницу исходного документа в целевой документ как объект XObject и дважды помещает его на страницу с различными преобразованиями масштабирования и вращения, например для этого источника

Source PDF, page 1 [/g0]

он создает это

Target PDF [/g1]

Помощник метод importAsXObject, фактически выполняющий импорт, определяется следующим образом:

PDFormXObject importAsXObject(PDDocument target, PDPage page) throws IOException
{
    final PDStream src = page.getContents();
    if (src != null)
    {
        final PDFormXObject xobject = new PDFormXObject(target);

        OutputStream os = xobject.getPDStream().createOutputStream();
        InputStream is = src.createInputStream();
        try
        {
            IOUtils.copy(is, os);
        }
        finally
        {
            IOUtils.closeQuietly(is);
            IOUtils.closeQuietly(os);
        }

        xobject.setResources(page.findResources());
        xobject.setBBox(page.findCropBox());

        return xobject;
    }
    return null;
}

Как упоминалось выше, это только доказательство концепции, угловые случаи еще не приняты во внимание.

-1
задан Amine 4 March 2019 в 14:36
поделиться

1 ответ

Простой способ «исправить» это:

R = {}
for i in range(0, 5):
  print(lines[0][i])
  if lines[0][i] != 'userID':
    if lines[0][i] !='drugName':
      grouped_column = []
      for j, row in enumerate(lines):
        try:
          if j > 0:
            grouped_column.append(row[i])
            R.update({lines[0][i]:grouped_column})
        except IndexError:
          pass

print(R)
df3 = pd.DataFrame(R)

Это скорее обходной путь в вашей проблеме, чем решение. Вы должны отладить и посмотреть, что не так. Но проблема в том, что ваш row[i] не существует, было бы лучше, если вы разместите здесь весь код или значения из строк.

РЕДАКТИРОВАТЬ

Этот код будет сравнивать и проверять, содержит ли строка необходимый размер, регистр не будет игнорировать эту часть:

import csv
import pandas as pd

FILE = "drugs.csv"

def main():

  with open (FILE, encoding="utf8") as f:
    datas = csv.reader(f, delimiter = '\t')
    lines = [row for row in datas]

  R = {}

  for i in range(len(lines[0])):
    if lines[0][i] != 'userID' and lines[0][i] !='drugName':
      grouped_column = []

      for j, row in enumerate(lines):
        if j > 0 and len(row) > i:
          grouped_column.append(row[i])
          R.update({lines[0][i]:grouped_column})

  df3 = pd.DataFrame.from_dict(R, orient="index")
  df3.transpose()


if __name__ == "__main__":
  main()
0
ответ дан Esdras Xavier 4 March 2019 в 14:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: