Reputation: 1026
I'm attempting to open an existing pdf file and then add another page to the pdf document from within an Android application. On the added page, I need to add some text and an image.
I am wanting to give PDFBox a try. Other solutions such as iTextPDF aren't suitable for our company because of the licencing terms/price.
I have a library project with the main code base, and also full and lite projects that reference the library project.
I have downloaded the jar from http://pdfbox.apache.org/download.html and copied it into the library projects lib folder and added the pdfbox-app-1.6.0.jar file to the java build path libraries.
I am able to import the librarys successfully eg import org.apache.pdfbox.pdmodel.PDDocument;
and compile all the projects. However when I run the application it crashes on PDDocument document = new PDDocument();
with the following error.
E/AndroidRuntime(24451): java.lang.NoClassDefFoundError: org.apache.pdfbox.pdmodel.PDDocument
I read somewhere that version 1.5 of PDFBox onwards didn't work with Android so I tried downloading the pdfbox-app-1.4.0.jar file but got the same issue. I also added the library to the build path in my full and lite projects but I got the same error or eclipse kept crashing with an out of memory error.
Can anyone tell me what I am doing wrong? Have I downloaded the wrong file? Have I imported it correctly?
Thanks,
Upvotes: 25
Views: 23070
Reputation: 190
I got the same error. I've solved this way, the documentation says:
Before calls to PDFBox are made it is required to initialize the library's resource loader. Add the following line before calling PDFBox methods:
PDFBoxResourceLoader.init(getApplicationContext());
An example app is located in the sample directory and includes examples of common tasks.
To read a PDF from Uri with PDFBox i just do:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == ESCOGER_DOCUMENTO_REQUEST_CODE) {
if (resultCode == RESULT_OK && data != null) {
Uri archivo = data.getData();
switch (extensionArchivo(this, archivo)) {
case "jpg":
case "png":
//Procesar imagen
break;
case "pdf":
PDFBoxResourceLoader.init(getApplicationContext());
ContentResolver contentResolver = getContentResolver(); // Get a content resolver to access the Uri
InputStream inputStream = null; // Open an input stream to the Uri
try {
inputStream = contentResolver.openInputStream(archivo);
} catch (IOException e) {
//Log.e("PdfBox-Android-Sample", "Exception thrown while loading document to strip", e);
}
String parsedText = null; // Load the PDF document from the input stream
PDDocument document = null;
try {
document = PDDocument.load(inputStream);
} catch (IOException e) {
//Log.e("PdfBox-Android-Sample", "Exception thrown while loading document to strip", e);
}
try {
PDFTextStripper pdfStripper = new PDFTextStripper();
pdfStripper.setStartPage(0);
pdfStripper.setEndPage(1);
parsedText = "Parsed text: " + pdfStripper.getText(document);
} catch (IOException e) {
//Log.e("PdfBox-Android-Sample", "Exception thrown while stripping text", e);
} finally {
try {
if (document != null) document.close();
} catch (IOException e) {
//Log.e("PdfBox-Android-Sample", "Exception thrown while closing document", e);
}
}
Toast.makeText(this, parsedText, Toast.LENGTH_SHORT).show();
break;
default:
// Salir y mostrar mensaje "Archivo no permitido"
}
} else {
Toast.makeText(this, "Error al subir documento", Toast.LENGTH_LONG).show();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
Upvotes: 0
Reputation: 13964
There's a free Android Port of PDFBox available here:
https://github.com/TomRoush/PdfBox-Android
Upvotes: 16
Reputation: 4936
PDFBox uses java awt and swing, even for non UI tasks, I've tried to remove references but there are a lot of files, and I was removing too much stuff
I've just tested PDFjet http://pdfjet.com/os/edition.html it's bsd licensed (plus commercial version with more features), with this sample code (ripped from Example_03.java) I was able to convert a jpeg to a pdf
FileOutputStream fos = null;
try
{
fos = new FileOutputStream("/sdcard/sample.pdf");
PDF pdf = new PDF(fos);
InputStream f = getApplicationContext().getAssets().open("img0.jpg");
Image image = new Image(pdf, f, ImageType.JPEG);
Page page = new Page(pdf, A4.PORTRAIT);
image.setPosition(0, 0);
image.drawOn(page);
pdf.flush();
fos.close();
} catch (Exception e)
{
e.printStackTrace();
}
I found the link here http://java-source.net/open-source/pdf-libraries
Upvotes: 19
Reputation: 121
i think the library class files are not included in the apk file. The library classes need to be converted into dex files then only it will be detected.please refer http://developer.android.com/guide/developing/building/index.html
Upvotes: 0