Возможно ли использовать pdfbox для включения других страниц PDF в качестве встроенных объектов на странице
blockquote>Это должно быть возможно. Формат 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 и дважды помещает его на страницу с различными преобразованиями масштабирования и вращения, например для этого источника
[/g0]
он создает это
[/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; }
Как упоминалось выше, это только доказательство концепции, угловые случаи еще не приняты во внимание.
Простой способ «исправить» это:
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()