我有一个类可以打开存储在原始资源中的空白字符表(用于LARP),然后使用iText向空字段添加一些值。PDF存储在/data/data/package/files中很好,但是当我尝试使用OpenPDF方法时,我得到了一个EACCES(权限被拒绝)错误。如果我尝试使用adb将其导出到我的计算机,我可以在PDF查看器/编辑器中毫无问题地打开它。
对于android开发来说还是相当陌生的,所以我不知道为什么我会被拒绝许可。
imports...
/**
* Created by Matt on 10/15/2014.
*/
public class SheetBuilder {
private final String LOGTAG = getClass().getName();
private Context context;
private InputStream inputStream;
private OutputStream outputStream = null;
private PdfReader reader = null;
private Document document;
private PdfWriter writer = null;
private String outputFileName;
private PdfContentByte canvas;
private int alignment = Element.ALIGN_LEFT;
public SheetBuilder(Context context, int sourceFile, String outputFileName) {
this.outputFileName = outputFileName.replace(".pdf", "") + ".pdf";
this.context = context;
inputStream = context.getResources().openRawResource(sourceFile);
try {
reader = new PdfReader(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
try {
outputStream = context.openFileOutput(this.outputFileName, context.MODE_PRIVATE);
} catch (Exception e) {
e.printStackTrace();
}
document = new Document(reader.getPageSize(1));
try {
writer = PdfWriter.getInstance(document, outputStream);
} catch (DocumentException e) {
e.printStackTrace();
}
document.open();
canvas = writer.getDirectContent();
}
public void OpenPDF() {
ContextWrapper cw = new ContextWrapper(context);
File path = cw.getFilesDir();
File pdfFile = new File(path + "/" + outputFileName);
if(pdfFile.exists())
{
Log.i(LOGTAG, "Found " + outputFileName);
Uri uriPath = Uri.fromFile(pdfFile);
Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
pdfIntent.setDataAndType(uriPath, "application/pdf");
pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
try {
context.startActivity(pdfIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, "No application available to view PDF", Toast.LENGTH_LONG).show();
}
}
}
public void ImportPage(int PageNumber) {
if(PageNumber == 0) PageNumber = 1;
PdfImportedPage page = writer.getImportedPage(reader, PageNumber);
document.newPage();
canvas.addTemplate(page, 0, 0);
}
public void setAlignment(int Alignment) {
this.alignment = Alignment;
}
public void setAlignment() {
this.alignment = Element.ALIGN_LEFT;
}
public void AddBasicPhrase(String phrase, float x, float y, float rotation) {
Phrase p = new Phrase(phrase);
ColumnText.showTextAligned(canvas, alignment, p, x, y, rotation);
}
public void AddBasicPhrase(String phrase, float x, float y) {
AddBasicPhrase(phrase, x, y, 0);
}
public void Close() {
document.close();
if (outputStream != null) {
try {
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
找到了我自己的解决方案。标记有以下注释的更改。如果我正在做不应该做的事情,请纠正我。发现“外部vs内部”文件存储是我的问题。
/**
* Created by Matt on 10/15/2014.
*/
public class SheetBuilder {
private final String LOGTAG = getClass().getName();
private Context context;
private InputStream inputStream;
private OutputStream outputStream = null;
private PdfReader reader = null;
private Document document;
private PdfWriter writer = null;
private String outputFileName;
private PdfContentByte canvas;
private int alignment = Element.ALIGN_LEFT;
public SheetBuilder(Context context, int sourceFile, String outputFileName) {
this.outputFileName = outputFileName.replace(".pdf", "") + ".pdf";
this.context = context;
inputStream = context.getResources().openRawResource(sourceFile);
try {
reader = new PdfReader(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
/* Changes From Here */
try {
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
File file = new File(path, this.outputFileName);
Log.i("ExternalStorage", file.getAbsolutePath());
path.mkdirs();
outputStream = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
/* To Here */
document = new Document(reader.getPageSize(1));
try {
writer = PdfWriter.getInstance(document, outputStream);
} catch (DocumentException e) {
Log.e("ErrorsAllAround", "Nope!");
e.printStackTrace();
}
document.open();
canvas = writer.getDirectContent();
}
public void OpenPDF() {
/* Changes From Here */
File pdfFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), outputFileName);
/* To Here */
if(pdfFile.exists())
{
Log.i(LOGTAG, "Found " + pdfFile.getAbsolutePath());
Uri uriPath = Uri.fromFile(pdfFile);
Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
pdfIntent.setDataAndType(uriPath, "application/pdf");
pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
try {
context.startActivity(pdfIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, "No application available to view PDF", Toast.LENGTH_LONG).show();
}
}
else
{
Log.i(LOGTAG, "File Not Found: " + pdfFile.getAbsolutePath());
Toast.makeText(context, "File Not Found: " + pdfFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
}
}
public void ImportPage(int PageNumber) {
if(PageNumber == 0) PageNumber = 1;
PdfImportedPage page = writer.getImportedPage(reader, PageNumber);
document.newPage();
canvas.addTemplate(page, 0, 0);
}
public void setAlignment(int Alignment) {
this.alignment = Alignment;
}
public void setAlignment() {
this.alignment = Element.ALIGN_LEFT;
}
public void AddBasicPhrase(String phrase, float x, float y, float rotation) {
Phrase p = new Phrase(phrase);
ColumnText.showTextAligned(canvas, alignment, p, x, y, rotation);
}
public void AddBasicPhrase(String phrase, float x, float y) {
AddBasicPhrase(phrase, x, y, 0);
}
public void Close() {
document.close();
if (outputStream != null) {
try {
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我想打开一个PDF文件时,用户点击一个按钮。目前,我正在使用这段代码来实现这一点: 但不管用。 当我选择使用Adobe Acrobat时,我会得到一条显示为Toast的消息,它说 当我尝试使用Drive PDF Viewer时,我得到 PDF文件存储在 问题出在哪里? 编辑 现在我使用的是以下代码: 但当我尝试通过点击按钮打开PDF时,应用程序崩溃了。 这是我得到的日志: 这是我的课: } 有人能
我正在尝试dockerise一个反应应用程序。我正在使用以下Dockerfile来实现这一点。 还有,在我的包裹里。json开始脚本被定义为
嗨,我对angularjs和chrome有问题,代码如下: 如果我打开索引。使用Opera、Firefox或safary的html我没有任何问题,但是如果我使用Chorme打开此文件,请不要使用routerprovider,并在控制台中显示错误消息,如下所示: 无法加载XMLHttpRequestfile://localhost/Users/multivideo/Desktop/FTL-Angul
我正在用mssql数据库开发一个java Spring Hibernate应用程序。但是我无法与mssql数据库建立连接。 [请求处理失败;嵌套异常为org.springframework.transaction.CanNotCreateTransactionException:无法打开事务的Hibernate会话;嵌套异常为org.Hibernate.exception.GenericJDBcE
我有一个使用Spring mvc和Spring Security Eclipse Maven web项目。当我真的启动它时,它没有成功地初始化上下文: 更多详情如下: 这是我的 这是我的 我的问题是,当我启动应用程序时,我会出现类似的错误 它说它找不到但是我没有把它放进中,我的配置文件是
问题内容: 有什么方法可以使代码以独立于平台的方式在Java应用程序中打开PDF文件?我的意思是在Windows中使用批处理文件可以做到这一点。还有其他方法可以使平台独立的代码即时打开PDF文件吗? 问题答案: 我会尝试,其中: 启动关联的应用程序以打开文件。 因此,此代码应该可以解决问题: