Как я могу проверить, является ли страница PDF изображением (отсканированным) с помощью PDFBOX, XPDF
PDFBox задача по извлечению изображений. Привет, как я могу проверить, является ли страница pdf изображением, и извлечь ее с помощью библиотеки PDFBOX, есть способ получить изображения, но если страница PDF является изображением, оно не получается. может кто-нибудь помочь мне решить эту проблему.
Проблема Xpdf по извлечению изображений. Я пытаюсь извлечь изображения другой библиотекой xpdf, она делает странное отражение на странице, если это изображение. Если pdf содержит маленькое изображение в качестве изображения объекта, это дает мне нормально, если страница сканируется, он делает флип.
Я хочу извлечь все изображения из PDF, если PAGE сканируется, чтобы получить их в качестве изображения, если страница содержит простой текст, а изображения также для получения изображений с этой страницы.
Моя цель состоит в том, чтобы извлечь все изображения из PDF. не только сформировать страницу, но даже если страница представляет собой изображение, чтобы извлечь их в виде изображения, но не пропустите их, как я думаю, PDFbox.
XPDF что-то делает, но при экспорте отсканированной страницы возникает проблема с переворотом (вверху, справа) на странице
Как я могу решить эту проблему, спасибо.
Скачать пример файла для тестирования
`PDDocument document = PDDocument.load(new File("/home/dru/IdeaProjects2/PDFExtractor/test/t1.pdf"));
PDPageTree list = document.getPages();
for (PDPage page : list) {
PDResources pdResources = page.getResources();
System.out.println(pdResources.getResourceCache());
for (COSName c : pdResources.getXObjectNames()) {
PDXObject o = pdResources.getXObject(c);
if (o instanceof org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) {
File file = new File("/home/dru/IdeaProjects2/PDFExtractor/test/out/" + System.nanoTime() + ".png");
ImageIO.write(((org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject)o).getImage(), "png", file);
}
}
}`
1 ответ
Правильно извлекайте изображения
Поскольку обновленный PDF-файл ясно показывает, что проблема заключается в том, что на нем нет изображений сразу, но на нем нарисованы формы объектов, которые содержат изображения. Таким образом, поиск изображений должен переходить в форму xobjects.
И это еще не все: все страницы в обновленном PDF совместно используют один и тот же словарь ресурсов, они просто выбирают для отображения различные его формы xobjects. Таким образом, действительно необходимо проанализировать соответствующий поток содержимого страницы, чтобы определить, какой xobject (с какими изображениями) присутствует на данной странице.
На самом деле это что-то инструмент PDFBox ExtractImages
делает. К сожалению, однако, он не показывает страницу, на которой он нашел изображение, о котором идет речь, ср. метод тестирования ExtractImages.java testExtractPageImagesTool10948New
,
Но мы можем просто позаимствовать методику, используемую этим инструментом:
PDDocument document = PDDocument.load(resource);
int page = 1;
for (final PDPage pdPage : document.getPages())
{
final int currentPage = page;
PDFGraphicsStreamEngine pdfGraphicsStreamEngine = new PDFGraphicsStreamEngine(pdPage)
{
int index = 0;
@Override
public void drawImage(PDImage pdImage) throws IOException
{
if (pdImage instanceof PDImageXObject)
{
PDImageXObject image = (PDImageXObject)pdImage;
File file = new File(RESULT_FOLDER, String.format("10948-new-engine-%s-%s.%s", currentPage, index, image.getSuffix()));
ImageIOUtil.writeImage(image.getImage(), image.getSuffix(), new FileOutputStream(file));
index++;
}
}
@Override
public void appendRectangle(Point2D p0, Point2D p1, Point2D p2, Point2D p3) throws IOException { }
@Override
public void clip(int windingRule) throws IOException { }
@Override
public void moveTo(float x, float y) throws IOException { }
@Override
public void lineTo(float x, float y) throws IOException { }
@Override
public void curveTo(float x1, float y1, float x2, float y2, float x3, float y3) throws IOException { }
@Override
public Point2D getCurrentPoint() throws IOException { return null; }
@Override
public void closePath() throws IOException { }
@Override
public void endPath() throws IOException { }
@Override
public void strokePath() throws IOException { }
@Override
public void fillPath(int windingRule) throws IOException { }
@Override
public void fillAndStrokePath(int windingRule) throws IOException { }
@Override
public void shadingFill(COSName shadingName) throws IOException { }
};
pdfGraphicsStreamEngine.processPage(pdPage);
page++;
}
( Метод испытаний ExtractImages.java testExtractPageImages10948New
)
Этот код выводит изображения с именами файлов "10948-new-engine-1-0.tiff", "10948-new-engine-2-0.tiff", "10948-new-engine-3-0.tiff" и "10948-new-engine-4-0.tiff", то есть по одному на страницу.
PS: пожалуйста, не забудьте включить com.github.jai-imageio:jai-imageio-core
в вашем classpath это требуется для вывода TIFF.
Перевернутые изображения
Другая проблема OP заключалась в том, что изображения иногда выглядели перевернутыми вверх дном, например, в случае его самого нового образца файла "t1_edited.pdf". Причина в том, что эти изображения действительно хранятся в перевернутом виде в виде ресурсов изображений в PDF.
Когда эти изображения выводятся на страницу, текущая матрица преобразования, действующая в то время, отражает изображение, нарисованное по вертикали, и создает ожидаемый вид.
Слегка усиливая drawImage
В реализации приведенного выше кода можно указать показатели таких переворотов в названиях экспортируемых изображений:
public void drawImage(PDImage pdImage) throws IOException
{
if (pdImage instanceof PDImageXObject)
{
Matrix ctm = getGraphicsState().getCurrentTransformationMatrix();
String flips = "";
if (ctm.getScaleX() < 0)
flips += "h";
if (ctm.getScaleY() < 0)
flips += "v";
if (flips.length() > 0)
flips = "-" + flips;
PDImageXObject image = (PDImageXObject)pdImage;
File file = new File(RESULT_FOLDER, String.format("t1_edited-engine-%s-%s%s.%s", currentPage, index, flips, image.getSuffix()));
ImageIOUtil.writeImage(image.getImage(), image.getSuffix(), new FileOutputStream(file));
index++;
}
}
Вертикально или горизонтально перевернутые изображения помечены соответствующим образом.