J'ai écrit un programme Java qui effectue un traitement OCR sur le fichier image inclus dans le PDF Au début, j'ai essayé de l'implémenter avec python, mais je ne comprenais pas la dépendance de la bibliothèque à utiliser, alors j'ai décidé de l'implémenter avec le Java familier.
PDFmaker.java
package pdf;
import java.io.File;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
public class PDFMaker {
public static void main(String args[])throws Exception{
//Fichier PDF à lire
PDDocument document = PDDocument.load(new File("C:/python/img/pdf/2017h29a_sc_pm2_qs.pdf"));
//Traiter les pages PDF
Stream<PDPage>stream = StreamSupport.stream(Spliterators.spliteratorUnknownSize(
document.getDocumentCatalog().getPages().iterator(),
Spliterator.ORDERED),false);
System.out.println("start");
Files.write(Paths.get("parse.txt"),
stream.map(s->exePDFpage(s)).collect(Collectors.toList()),
Charset.forName("MS932"),
StandardOpenOption.CREATE);
System.out.println("end");
}
//Page de traitement PDF
public static String exePDFpage(PDPage p){
Stream<COSName>stream = StreamSupport.stream(Spliterators.spliteratorUnknownSize(
p.getResources().getXObjectNames().iterator(),Spliterator.ORDERED),false);
return stream.map(s->exeImage(s,p.getResources()))
.reduce((s,v)->s+v).get();
}
//Convertir une page PDF en Jpg
public static String exeImage(COSName n,PDResources resources){
try{
PDXObject xobject = resources.getXObject(n);
if(xobject instanceof PDImageXObject){
PDImageXObject image2 = (PDImageXObject) resources.getXObject(n);
return PDFtoImg.extractFromPDF(image2.getImage());
}
return "";
}catch(Exception e){
e.printStackTrace();
return "";
}
}
}
PDFtoImg.java
package pdf;
import java.awt.image.BufferedImage;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
public class PDFtoImg {
private static final String DICTIONARY_PATH ="C:/Users/takayoshi/workspace/PDF/tessdata";
public static String extractFromPDF(BufferedImage img) {
ITesseract instance = new Tesseract();
try {
instance.setLanguage("jpn");
instance.setDatapath(DICTIONARY_PATH);
String result = instance.doOCR(img);
return result;
} catch (TesseractException ex) {
ex.printStackTrace();
return "";
}
}
}
――Il faut environ 10 à 20 minutes pour réviser le problème de l'examen des assistants de sécurité du traitement de l'information (SC) de l'examen d'ingénieur en informatique.
Automne 2017
{ré`
Femme de traitement de l'information tous obtenant un examen de soutien
Non
après midi=problème
Temps de test-4:30 ~-6:30 (2 heures)
Remarques
- ・ Le début et la fin du test,L'horloge du superviseur est la norme. Suivez les instructions du superviseur 〟
2~Jusqu'à ce qu'il y ait un signal pour démarrer le test,N'ouvrez pas le livret de questions et regardez à l'intérieur.
3~Saisie du numéro d'examen, etc. sur la feuille de réponses,Veuillez commencer après le signal pour démarrer le test.
4_Le problème est,Veuillez répondre selon le tableau de Fuki.
Étant donné que l'OCR est gratuit, je pense que c'est une très bonne ligne en japonais
Recommended Posts