I've written an interface with a 3rd party web service in VB.NET. The final step in that interface involves the 3rd party delivering to us (as a stream) a PDF document. After streaming is complete I save a copy of the PDF on our servers, so that our users can view the PDF by clicking on a link in our system. The PDF opens fine in Acrobat X, but when I try to open it programatically I an error saying that "the file is damaged and could not be repaired". I can also open the file in IE just fine, with no issues, and the same code that displays this PDF works just fine on lots of other existing PDFs that predate the 3rd party interface.
I have emptied out temporary internet files as suggested in some posts I saw online. I also opened the PDF in Notepad++ and the %PDF tag is first, and the %%EOF tag is last, so there's certainly no corruption visible in the document source that I can see. Below is the (very standard) code we use to open PDFs into a separate browser instance on our site:
PDFFile = System.AppDomain.CurrentDomain.BaseDirectory & Request.QueryString("LetterPath") & Request.QueryString("Letter")
Response.Clear()
Response.ClearHeaders()
Response.BufferOutput = True
Response.ContentType = "application/pdf"
Response.WriteFile(PDFFile)
Response.Flush()
Anyone dealt with this before or have any ideas?
Adding a Response.End() should do it.
Related
The below is the line of code I'm using it currently which converts ppt to pdf, however I want to protect pdf , Is there any possibility
PowerPointapp.ActivePresentation.SaveAs path & pdffileNm & ".pdf", 32
This is not possible with the default vba functions available!
See this, not tested by me, example of using an external library to save pdf with password in the past.
Protecting a PDF is not permanent, once the file is opened (using the users decryption key provided by handing over the password), the contents are available to the new owner to add comment or fill forms or otherwise modify by print or text edit or remove watermarks.
Adobe reader will use different parts of those keys to reduce user writes, but no other editor has to.
Browsers need to edit PDF in exactly the same way so my Firefox pdf reader allows me to correct / change web page content or the embedded pdf contents, exactly the same as any other browser or pdf viewer or editor can. The only protected PDF is an unpublished one.
I'm working on a project in .net that has a need for a document preview function.
I've implemented a Webview2 control and, as the majority of doucments that need to be viewed are pdf, this works a treat.
However, now and again some documents may be in either docx or xlsx format.
When I set webview2.Source = New Uri(PathtoFile) on these files, the webview2 control downloads the document to my downloads folder rather than rendering it.
I get that the files are not HTML, but then again neither are PDFs and they work out of the box.
Is there some mechanism I'm missing whereby I can have the Webview2 control display the file contents for docx and xlxs rather than download?
We are having the same problem ourselves. At the moment we are using a product called Aspose that will allow us to convert Word Documents to XPS, after which we can display the document in a Document Viewer.
While this works, and it works well, the main problem is that this relies on us downloading the document, then converting it and then loading the converted document into the Viewer. Which causes a certain perception of "sluggishness" due to all of that work, whereas images and PDFs, especially when hosted on the Web, can be hosted directly in the WebView2 and this then leaves the rest of our application nicely responsive to user interaction.
So in case anyone comes up with a better suggestion, I'm following this ...
The code using Aspose is pretty straightforward (example in Visual Basic .NET):
Dim oDoc As Aspose.Words.Document = Nothing
oDoc = New Aspose.Words.Document(sFile)
oDoc.Save(fileName:=sToFileName, saveFormat:=Aspose.Words.SaveFormat.Xps)
(left out all error handling and so on in order to focus on the actual functionality. sToFileName just contains a filename along the lines of [somefolder][yourtargetfilename].xps ...)
I guess you may try to convert DOCX to PDF directly via Aspose.Words and XLSX to PDF via Aspose.Cells. Both these APIs support rendering to PDF or even image formats. Since your viewer supports to view PDF or images, so you may try this approach, it might work for your needs.
PS. I am working as Support developer/ Evangelist at Aspose.
I create a PDF with iTextsharp and then I show the preview of the PDF inside a webbrowser control. From the preview the user can SAVE or PRINT using the defaults Adobe Reader's buttons
Working on Windows x64 bits with Adobe Reader as the default PDF viewer everything works fine.
The same program on a Windows x64 bits but with Foxit Reader as the default PDF open the file on Foxit Reader on full application window, outside my program.
I need to manage that.
My code is like
Dim PathToPDF As String
PathToPDF = DirectoryOfMyApp & "\ReportPreview.pdf"
ReportPreviewWebBrowser.Navigate(PathToPDF)
Where DirectoryOfMyApp just gets the C: or D: letter of the hard disk.
I read this link
How to start an Adobe Reader or Acrobat from VB.NET?
but a line like
ReportPreviewWebBrowser.Navigate("acrobat", PathToPDF )
didn´t work and I think the webbrowser control don´t have the option to choose the PDF viewer
https://msdn.microsoft.com/es-es/library/system.windows.forms.webbrowser(v=vs.110).aspx
Is there a way to set the webbrowser to use Adobe Acrobat Reader only or to force any other PDF viewer to show the PDF inside the webbrowser control?
I agree with Zaggler on his comments on this. You are making assumptions at a certain point on software that is installed on an end user's computer. Unless you are going to make the application's PDF viewer be part of a dependency installation or cooked into .NET you cannot guarantee they have that program to use. Nor can you guarantee it's installed location.
However there is a cheap hack for Windows based processes you can do in VB.NET. You can use the ole System.Diagnostics.Process()
Sub Main()
Dim nProcess = New System.Diagnostics.Process()
nProcess.Start($"D:\PdfFile.pdf")
End Sub
In this example I did a quick file location, you can try to ensure it is a valid location that will not change or is in your app's running process folder. This is really low tech as far as development goes, but it is basically saying: "Run me a process, any process, at this location. I don't care what it is, use the Windows defaults to determine what to do with it."
So when I run this on my Windows 10 Dev box it loads up Edge to display it, at home it would fire up Adobe Viewer. It is just opening the file essentially with the OS's choice of what is using that file extension. Not glamorous or very good for hardened code but it works when you want something quick to happen.
No, you can't do this.
You can't even guarantee that Adobe Reader is installed at all.
Reader might not even exist on the machine. It's not built into Windows, and not everyone uses it. Even if it is, FoxIt isn't the only alternative. A big one is that Chrome includes it's own PDF viewer.
I am hit with a Microsoft Edge bug that has been around for a long time, and doesn't seem to get any attention: Microsoft Edge doesn’t open some PDF files if they have data for screen readers
I have an application that generates a PDF, which is then printed. To support Microsoft Edge and workaround the bug, I am thinking to open and strip out any data that gives Edge trouble using PDFBox. However, the issue is slim on details, and I can't find any info on what specifically triggers the problem for Edge. Does anyone have experience with this and can suggest what specifically I should be stripping out to make a PDF open in Edge?
[Edit]: Just to add, currently if I download the PDF and open the PDF in Edge, it still wouldn't open even though if I open the same local PDF in Chrome, IE11 or Firefox, it works fine.
The file has some weirdness, if you open it with NOTEPAD++ it will show that there is some data ater %%EOF. Anyway, try this code, which removes some unneeded stuff.
PDDocument doc = PDDocument.load(new File("myfile.pdf"));
PDDocumentCatalog cat = doc.getDocumentCatalog();
cat.getCOSObject().removeItem(COSName.PAGE_MODE);
cat.getCOSObject().removeItem(COSName.VIEWER_PREFERENCES);
PDPageTree pageTree = cat.getPages();
pageTree.getCOSObject().removeItem(COSName.PARENT);
doc.save("myfile2.pdf");
It is possible that the three "removeItem" calls are not needed, or only some of them, I can't test it myself.
If it still doesn't work, please ping me again and I'll try another idea (setting the mediabox at the page level).
Am currently working on a web application which receives the encoded text from the web service and am decoding & saving as a PDF file. Once the user clicks for the details then I am supposed to display the PDF file in the web browser.
What is the best practice to display the PDF file in the browser? Am using VB.Net 2003
All you need to do is set the link to point to your pdf file. And if the user has any PDF reader installed, it will be opened using that reader.
The name you Want to Show as Link
EDIT:
The other way, if you dont want to display as link and directly open the file, is to set the correct MIME type in the headers, so that the browsers can detect it as PDF file instead of HTML file.
Response.AddHeader("content-disposition","inline;filename=YourPdfFileName.pdf")
Response.End