Supponendo di avere la partitura in PDF File, avrei utilizzare Apache PDFBox per ottenere immagini da un file PDF di input contenente gli spartiti, quindi individuare le coordinate dell'intera barra di cui si ha bisogno, con un'immagine selezionata definire le coordinate per ritagliare l'immagine e manipolarla fino ad ottenere il risultato desiderato.
PDDocument document = null;
document = PDDocument.load(inFile);
List pages = document.getDocumentCatalog().getAllPages();
Iterator iter = pages.iterator();
while (iter.hasNext()) {
PDPage page = (PDPage) iter.next();
PDResources resources = page.getResources();
Map pageImages = resources.getImages();
if (pageImages != null) {
Iterator imageIter = pageImages.keySet().iterator();
while (imageIter.hasNext()) {
String key = (String) imageIter.next();
PDXObjectImage image = (PDXObjectImage) pageImages.get(key);
image.write2OutputStream(/* some output stream */);
}
}
}
Ecco un codice di esempio disponibile in Apache PDFBox.
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
/**
* This will read a read pdf and extract images. <br/><br/>
*
* usage: java org.apache.pdfbox.ExtractImages <pdffile> <password> [imageprefix]
*
* @author <a href="mailto:[email protected]">Ben Litchfield</a>
* @version $Revision: 1.7 $
*/
public class ExtractImages
{
private int imageCounter = 1;
private static final String PASSWORD = "-password";
private static final String PREFIX = "-prefix";
private static final String ADDKEY = "-addkey";
private static final String NONSEQ = "-nonSeq";
private ExtractImages()
{
}
/**
* This is the entry point for the application.
*
* @param args The command-line arguments.
*
* @throws Exception If there is an error decrypting the document.
*/
public static void main(String[] args) throws Exception
{
ExtractImages extractor = new ExtractImages();
extractor.extractImages(args);
}
private void extractImages(String[] args) throws Exception
{
if(args.length < 1 || args.length > 4)
{
usage();
}
else
{
String pdfFile = null;
String password = "";
String prefix = null;
boolean addKey = false;
boolean useNonSeqParser = false;
for(int i=0; i<args.length; i++)
{
if(args[i].equals(PASSWORD))
{
i++;
if(i >= args.length)
{
usage();
}
password = args[i];
}
else if(args[i].equals(PREFIX))
{
i++;
if(i >= args.length)
{
usage();
}
prefix = args[i];
}
else if(args[i].equals(ADDKEY))
{
addKey = true;
}
else if(args[i].equals(NONSEQ))
{
useNonSeqParser = true;
}
else
{
if(pdfFile == null)
{
pdfFile = args[i];
}
}
}
if(pdfFile == null)
{
usage();
}
else
{
if(prefix == null && pdfFile.length() >4)
{
prefix = pdfFile.substring(0, pdfFile.length() -4);
}
PDDocument document = null;
try
{
if (useNonSeqParser)
{
document = PDDocument.loadNonSeq(new File(pdfFile), null, password);
}
else
{
document = PDDocument.load(pdfFile);
if(document.isEncrypted())
{
StandardDecryptionMaterial spm = new StandardDecryptionMaterial(password);
document.openProtection(spm);
}
}
AccessPermission ap = document.getCurrentAccessPermission();
if(! ap.canExtractContent())
{
throw new IOException(
"Error: You do not have permission to extract images.");
}
List pages = document.getDocumentCatalog().getAllPages();
Iterator iter = pages.iterator();
while(iter.hasNext())
{
PDPage page = (PDPage)iter.next();
PDResources resources = page.getResources();
// extract all XObjectImages which are part of the page resources
processResources(resources, prefix, addKey);
}
}
finally
{
if(document != null)
{
document.close();
}
}
}
}
}
private void processResources(PDResources resources, String prefix, boolean addKey) throws IOException
{
if (resources == null)
{
return;
}
Map<String, PDXObject> xobjects = resources.getXObjects();
if(xobjects != null)
{
Iterator<String> xobjectIter = xobjects.keySet().iterator();
while(xobjectIter.hasNext())
{
String key = xobjectIter.next();
PDXObject xobject = xobjects.get(key);
// write the images
if (xobject instanceof PDXObjectImage)
{
PDXObjectImage image = (PDXObjectImage)xobject;
String name = null;
if (addKey)
{
name = getUniqueFileName(prefix + "_" + key, image.getSuffix());
}
else
{
name = getUniqueFileName(prefix, image.getSuffix());
}
System.out.println("Writing image:" + name);
image.write2file(name);
}
// maybe there are more images embedded in a form object
else if (xobject instanceof PDXObjectForm)
{
PDXObjectForm xObjectForm = (PDXObjectForm)xobject;
PDResources formResources = xObjectForm.getResources();
processResources(formResources, prefix, addKey);
}
}
}
}
private String getUniqueFileName(String prefix, String suffix)
{
String uniqueName = null;
File f = null;
while(f == null || f.exists())
{
uniqueName = prefix + "-" + imageCounter;
f = new File(uniqueName + "." + suffix);
imageCounter++;
}
return uniqueName;
}
/**
* This will print the usage requirements and exit.
*/
private static void usage()
{
System.err.println("Usage: java org.apache.pdfbox.ExtractImages [OPTIONS] <PDF file>\n" +
" -password <password> Password to decrypt document\n" +
" -prefix <image-prefix> Image prefix(default to pdf name)\n" +
" -addkey add the internal image key to the file name\n" +
" -nonSeq Enables the new non-sequential parser\n" +
" <PDF file> The PDF document to use\n"
);
System.exit(1);
}
}
Ora ritaglio immagine per è possibile utilizzare:
/**
* Crop the main image according to this rectangle, and scale it to the
* correct size for a thumbnail.
*/
public InputStream cropAndScale(InputStream mainImageStream,
CropRectangle crop) {
try {
RenderedOp mainImage = loadImage(mainImageStream);
RenderedOp opaqueImage = makeImageOpaque(mainImage);
RenderedOp croppedImage = cropImage(opaqueImage, crop);
RenderedOp scaledImage = scaleImage(croppedImage);
byte[] jpegBytes = encodeAsJpeg(scaledImage);
return new ByteArrayInputStream(jpegBytes);
} catch (Exception e) {
throw new IllegalStateException("Failed to scale the image", e);
}
}
che è disponibile in this page e project
C'è altra opzione per analizzare le immagini all'interno di un file pdf, uno sguardo at this code specialmente this
Hai bisogno anche delle note sopra/sotto lo staff? A volte quelli possono diventare un po 'aggrovigliati. – Hannele
Che cosa significa "estrai singola linea di misure"? Non un termine musicale. – EJP
Non una risposta diretta, ma googleing per "python sheet music ocr", mi porta ad un'altra domanda di stack: http://stackoverflow.com/questions/675077/ocr-for-sheet-music :: che può aiutarti – pyInTheSky