我正在使用iOS应用程序,我想查看.djvu
文件中的数据。有没有办法在Swift或.djvu
内阅读UIWebview
文件。
我也尝试过以下解决方案来查看uiwebview中的djvu文件,但这没有帮助。
1。直接打开uiwebview
let urlPage : URL! = URL(string: "http://192.168.13.5:13/myData/5451890-OP.djvu")
webView.loadRequest(URLRequest(url: urlPage))
2. 其次,我尝试将djvu文件转换为pdf,并将转换后的pdf文件转换为视图。 参考链接:https://github.com/MadhuriMane/ios-djvu-reader 但这会使镜像质量低下。
3。我试图在UIDocumentInteractionController()
的帮助下预览文件,这是委托方法,但没有用。
请建议任何可能的方法。
答案 0 :(得分:2)
请记住.djvu文件不像EPUB,MOBI,PDF和其他电子书文件格式那样受欢迎,我会采用以下方法解决问题。
1)创建一个Web服务,将djvu文件转换为pdf
例如:http://example.com/djvuToPdf/djvuFile/outputFile
2)阅读UIWebView
要创建Web服务,我假设您可以访问任何Linux分布式服务器,在我的案例中是Ubuntu 16.04。
第一步:安装djvulibre
sudo apt-get install djvulibre-bin ghostscript
第二步:测试运行$ djvups inputFile.djvu | ps2pdf - outputFile.pdf
。
您也可以使用ddjvu
命令。但是,使用ddjvu
命令转换的文件比djvups
命令大10倍。您可以考虑使用--help
来探索mode
,quality
等设置。
第三步:创建Web服务(为了简单起见,我使用PHP,在您方便时使用任何东西[Python golang])
<?php
$inputFile = $_GET['input_file'];
$outputFile = $_GET['output_file'];
// use shell exec to execute the command
// keep in mind that the conversion takes quite a long time
shell_exec(sprintf("djvups %s | ps2pdf - %s", $inputFile, $outputFile));
$name = $outputFile;
//file_get_contents is standard function
$content = file_get_contents($name);
header('Content-Type: application/pdf');
header('Content-Length: '.strlen( $content ));
header('Content-disposition: inline; filename="' . $name . '"');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
echo $content;
?>
最后一步:在App中加载PDF
正如Apple建议的那样,考虑使用WKWebView代替UIWebView。
if let pdfURL = Bundle.main.url(forResource: "pdfFile", withExtension: "pdf", subdirectory: nil, localization: nil) {
do {
let data = try Data(contentsOf: pdfURL)
let webView = WKWebView(frame: CGRect(x:20,y:20,width:view.frame.size.width-40, height:view.frame.size.height-40))
webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfURL.deletingLastPathComponent())
view.addSubview(webView)
}
catch {
// catch errors here
}
}