我正在使用PDF.js框架来呈现PDF.我正在使用base64数据来呈现PDF.但在IE 11 pdf看起来模糊.
从IE 11中查看以下屏幕

见下面的代码:
var renderPDF = function(url, canvasContainer,data) {
var scale= 0.9; //"zoom" factor for the PDF
function renderPage(page) {
var canvas = document.createElement('canvas');
var viewport = page.getViewport(scale);
var ctx = canvas.getContext('2d');
var renderContext = {
canvasContext: ctx,
viewport: viewport
};
canvas.height = viewport.height;
canvas.width = viewport.width;
canvasContainer.appendChild(canvas);
page.render(renderContext);
}
function renderPages(pdfDoc) {
for(var num = 1; num <= pdfDoc.numPages; num++)
pdfDoc.getPage(num).then(renderPage);
}
PDFJS.disableWorker = false;
var pdfAsDataUri = "data:application/pdf;base64,"+data; // shortened
var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
PDFJS.getDocument(pdfAsArray).then(renderPages); …Run Code Online (Sandbox Code Playgroud) 我想写一个显示PDF文件的python3/PyGTK3应用程序,我无法找到允许我这样做的python包.
有pypoppler,但它看起来过时(?)并且似乎不支持python3(?)
你有什么建议吗?
编辑:注意,我不需要花哨的功能,如PDF格式,操纵或写作.
我正在使用https://www.npmjs.com/package/html-pdf库,该库基于Phantom JS,内部使用webkit.我正在粘贴虚拟HTML和JS代码(将这些文件保存在1个文件夹中)并附加输出屏幕截图.
我面临的问题是在Windows上生成的PDF顶部有一些额外的空间(红色以上的空白区域),我无法摆脱它.
这是一个讨论类似问题的论坛(过时),https://groups.google.com/forum/#!topic /phantomjs/YQIyxLWhmr0.
input.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<div id="pageHeader" style="border-style: solid;border-width: 2px;color:red;">
header <br/> header <br/> header <br/> header
</div>
<div id="pageContent" style="border-style: solid;border-width: 2px;color:green;">
<div>
body <br/> body <br/> body
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
JS (你需要路径,fs,把手,html-pdf npm包)
var path = require('path');
var fs = require('fs');
var handlebars = require('handlebars');
var pdf = require('html-pdf');
saveHtml();
function saveHtml() {
fs.readFile('input.html', 'utf-8', {
flag: …Run Code Online (Sandbox Code Playgroud) 当我用Instruments分析我的应用程序时,我发现分配的数据CGContextDrawPDFPage不会立即释放.应用程序因为崩溃而崩溃CGContextDrawPDFPage.
你好,这是我在CATiledlayer中绘制pdf的代码
- (void)drawLayer:(CATiledLayer *)layer inContext:(CGContextRef)context
{
if (_PDFPageRef == nil) {
return;
}
CGPDFPageRef drawPDFPageRef = NULL;
CGPDFDocumentRef drawPDFDocRef = NULL;
@synchronized(self) // Briefly block main thread
{
drawPDFDocRef = CGPDFDocumentRetain(_PDFDocRef);
if( _PDFPageRef != (__bridge CGPDFPageRef)([NSNull null]) )
drawPDFPageRef = CGPDFPageRetain(_PDFPageRef);
else
return;
}
//CGContextSetRGBFillColor(context, 0.0f, 0.0f, 0.0f, 0.0f);
//CGContextFillRect(context, CGContextGetClipBoundingBox(context));
if (drawPDFPageRef != NULL) // Render the page into the context
{
CGFloat boundsHeight = viewBounds.size.height;
if (CGPDFPageGetRotationAngle(drawPDFPageRef) == 0)
{
CGFloat boundsWidth = …Run Code Online (Sandbox Code Playgroud) 例如,我从网上抓了一个pdf
import requests
pdf = requests.get("http://www.scala-lang.org/docu/files/ScalaByExample.pdf")
Run Code Online (Sandbox Code Playgroud)
我想修改此代码以显示它
from gi.repository import Poppler, Gtk
def draw(widget, surface):
page.render(surface)
document = Poppler.Document.new_from_file("file:///home/me/some.pdf", None)
page = document.get_page(0)
window = Gtk.Window(title="Hello World")
window.connect("delete-event", Gtk.main_quit)
window.connect("draw", draw)
window.set_app_paintable(True)
window.show_all()
Gtk.main()
Run Code Online (Sandbox Code Playgroud)
如何修改该document =行以使用包含pdf的变量pdf?
(我不介意使用popplerqt4或其他任何东西,如果这使它更容易.)
我尝试使用pdf.js库渲染PDF文档.我只知道javascript中的基础知识并且我是承诺的新手,所以首先我按照这个页面上的建议:使用pdf.js和ImageData(2.answer)将.pdf渲染到单个Canvas.
但结果是,我将所有页面都空白的文档呈现.所有的图片和颜色都很好,但甚至不是一行文字.我也尝试过其他一些教程,但要么得到相同的结果,要么文档完全丢失.现在,我的代码看起来像这样:(它与教程几乎完全相同)
function loadPDFJS(pid, pageUrl){
PDFJS.disableWorker = true;
PDFJS.workerSrc = 'pdfjs/build/pdf.worker.js';
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var pages = [];
var currentPage = 1;
var url = '/search/nimg/IMG_FULL/' + pid + '#page=1';
PDFJS.getDocument(url).then(function (pdf) {
if(currentPage <= pdf.numPages) getPage();
function getPage() {
pdf.getPage(currentPage).then(function(page){
var scale = 1.5;
var viewport = page.getViewport(scale);
canvas.height = viewport.height;
canvas.width = viewport.width;
var renderContext = {
canvasContext: ctx,
viewport: viewport
};
page.render(renderContext).then(function() {
pages.push(canvas.toDataURL());
if(currentPage < pdf.numPages) { …Run Code Online (Sandbox Code Playgroud) 在GitHub项目中,我尝试将任意 HTML 字符串转换为 PDF 版本。我所说的转换是指解析 HTML,并将其呈现为 PDF 文件。
为了实现这一点,我使用Flying Saucer PDF Rendering,如下所示:
public class Main {
public static void main(String [] args) {
final String ok = "<valid html here>: see github rep for real html markup here";
final String html = "<invalid html here>: see github rep for real html markup here";
try {
// final byte[] bytes = generatePDFFrom(ok); // works!
final byte[] bytes = generatePDFFrom(html); // does NOT work :(
try(FileOutputStream fos = …Run Code Online (Sandbox Code Playgroud) 我的应用程序列出了 PDF 文件,当用户选择一个 PDF 时,应用程序会打开它。如果用户选择损坏的 PDF 文件,PdfRenderer 将抛出IOException(这很好,因为我捕获了该异常并通知用户该文件已损坏)。
但问题是,在发生这种情况后,IOException用户尝试打开的所有 PDF 文件都会被抛出(即使对于未损坏的文件)
相关代码
File file = new File(filePath);
mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
if (mFileDescriptor != null) {
mPdfRenderer = new PdfRenderer(mFileDescriptor);
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
openRenderer: java.io.IOException: file not in PDF format or corrupted
at android.graphics.pdf.PdfRenderer.nativeCreate(Native Method)
at android.graphics.pdf.PdfRenderer.<init>(PdfRenderer.java:166)
at ****.****.****.PdfUtil.openRenderer(PdfUtil.java:63)
at ****.****.****.PdfUtil.getMaxPages(PdfUtil.java:46)
at ****.****.****.PdfViewActivity.init(PdfViewActivity.java:166)
at ****.****.****.ui.PdfViewActivity.onCreate(PdfViewActivity.java:58)
at android.app.Activity.performCreate(Activity.java:7023)
at android.app.Activity.performCreate(Activity.java:7014)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2745)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2870)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1601)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:172)
at android.app.ActivityThread.main(ActivityThread.java:6590) …Run Code Online (Sandbox Code Playgroud) 我们正在测试pdf.js,虽然它看起来像一个很棒的项目,但我们无法在Safari中使用它.
(测试PDF.JS版本= 0.8.229(最新)/ Safari 5.1.9 - 6.0.4/Mac OSX 10.6.8 - 10.8.3)
例:
这是我们服务器提供的演示代码示例,其中包含可在Chrome/FFox上运行的示例PDF,但不适用于Safari:http://test.appgrinders.com/pdf_js/test.html
控制台输出:
Warning: Setting up fake worker.
Error: Invalid XRef stream (while reading XRef):
Error: Invalid XRef stream pdf.js:850undefined
Warning: Indexing all PDF objects
Error: Invalid XRef stream (while reading XRef):
Error: Invalid XRef stream pdf.js:850undefined
Run Code Online (Sandbox Code Playgroud)
更多测试:
以下是我们测试的示例PDF列表(它们全部来自我们的服务器,并且都在Chrome/FFox/Android中运行).唯一适用于Safari的是pdf.js项目本身提供的PDF文件:
在SAFARI失败:
http ://samplepdf.com/sample.pdf
http://forums.adobe.com/servlet/JiveServlet/previewBody/2041-102-1-2139/Sample.pdf
https://github.com/ prawnpdf /虾/原始/主/数据/ PDF文件/ form.pdf
SAFARI的工作:
http
://cdn.mozilla.net/pdfjs/helloworld.pdf(注意:这是来自pdf.js项目的示例PDF,也是我们唯一一个工作过的PDF)
我们已经提交了一份错误报告,但开发人员似乎没有答案,所以我希望有人在这里......
我们怎样才能让pdf.js与Safari一起工作?
javascript ×3
pdf ×3
pdf.js ×3
pdfrenderer ×3
android ×1
canvas ×1
html ×1
ioexception ×1
ios ×1
iphone ×1
java ×1
node.js ×1
pdf-parsing ×1
pdf-reader ×1
pdfview ×1
phantomjs ×1
poppler ×1
pygobject ×1
pygtk ×1
python ×1
python-3.x ×1
safari ×1
webkit ×1
xcode ×1