09
2014
02

PDF文档解析之PDFBox

 

发现PDFBox的官方网站 (PDFBox.org) 改内容了,变成了饮食和健康的网站,最新版本是 0.7.3,还是2010年更新的,可能以后不会再更新了。

 

PDFBox是Java实现的PDF文档协作类库,提供PDF文档的创建、处理以及文档内容提取功能,也包含了一些命令行实用工具。

 

主要特性包括:

1.开源(BSD许可)
2.从PDF提取文本
3.合并PDF文档
4.PDF文档加密与解密
5.与Lucene搜索引擎的集成
6.填充PDF/XFDF表单数据
7.从文本文件创建PDF文档
8.从PDF页面创建图片
9.打印PDF文档

08
2014
02

利用 itextsharp给PDF添加水印


iTextSharp 是一个功能和强大的 PDF操作类, 可以完成对PDF的很多操作, 当日添加PDF水印也不在话下, 其他不再说了,直接贴代码:

FooTheoryPdf.cs


using System.IO;

using System.Text;

using iTextSharp.text;

using iTextSharp.text.pdf;

namespace FooTheory.iTextSharpLibrary

07
2014
02

基于OpenGL 的三维井眼轨迹软件在WPF 中的设计与实现

前几天看到一篇论文,写的是利用WPF 和 OpenGL 实现油气专控轨迹绘制的功能。摘录如下:

原文下载地址 

基于OpenGL的三维井眼轨迹软件在WPF中的设计与实现_李洋.pdf

06
2014
02

.net实现PDF转图片

网上有很多 .net实现PDF转图片的功能,现搜集如下,有的需要破解DLL支持,有的是免费的DLL,根据自己的情况使用

 

 

1、【O2S.Components.PDFRender4NET.dll】,第三方DLL,可以实现PDF转图片,支持32位系统、64位系统(部分第三方dll在64位系统下运行报错)。
官方试用版的dll左上角会有一排红色水印。
 
2、【Acrobat.dll】,Adobe官方提供的接口,可以实现PDF转图片。这个方法需要安装Adobe Acrobat X Pro,从安装文件找到Acrobat.dll引用到项目中。
毕竟是Adobe官方提供的接口,其转换效率要比其他的DLL要快多了,而且应该更可靠一些,但是在IIS下运行会比较麻烦(QQ群里有朋友已经实现了)
如果对转换速度、图片质量要求很高的童鞋,可以参考此方案,但是实现过程太麻烦,大家自己权衡。
参考地址:http://www.codeproject.com/Articles/5887/Generate-Thumbnail-Images-from-PDF-Documents

17
2014
01

C#字符串转16进制字节数组,C#汉字转换到16进制

字符串转16进制字节数组


[c-sharp] view plaincopy

private static byte[] strToToHexByte(string hexString)  

{  

    hexString = hexString.Replace(" ", "");  

    if ((hexString.Length % 2) != 0)  

15
2014
01

C#读写xml文件和删除节点


已知有一个XML文件(bookstore.xml)如下:

07
2014
01

C# Enum,Int,String的互相转换,枚举转换

 

Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型。如果没有显式声明基础类型,则使用 Int32。编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举。

注意:枚举类型的基类型是除 Char 外的任何整型,所以枚举类型的值是整型值。

Enum 提供一些实用的静态方法:

(1)比较枚举类的实例的方法

07
2014
01

数字转枚举,字符转枚举,C#枚举类型转换

 数字转枚举,字符转枚举,C#枚举类型转换,枚举转化为数字及其枚举数值的判断具体示例如下:

07
2014
01

C# 与C++数据类型对照关系表

 

在C++程序转换为C#程序的过程中,数据类型的转换是最令人头疼的,先把收集到的数据类型对照关系整理如下:

 

C++            C#
=====================================
WORD            ushort
DWORD            uint
UCHAR            int/byte   大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte 
UCHAR*            string/IntPtr
unsigned char*         [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
char*            string
LPCTSTR            string
LPTSTR            [MarshalAs(UnmanagedType.LPTStr)] string
long            int
ulong               uint
Handle            IntPtr
HWND            IntPtr
void*            IntPtr
int            int
int*            ref int
*int            IntPtr
unsigned int        uint
COLORREF                uint

07
2014
01

C#读写SD卡扇区数据

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;

namespace whjcns
{
class SDUtils
{
private const uint GENERIC_READ = 0x80000000;
private const uint GENERIC_WRITE = 0x40000000;

private const uint FILE_SHARE_READ = 0x00000001;
private const uint FILE_SHARE_WRITE = 0x00000002;

private const uint OPEN_EXISTING = 3;         

[DllImport("kernel32.dll", SetLastError = true)]
private static extern SafeFileHandle CreateFileA(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);


private System.IO.FileStream _DriverStream;
private long _SectorLength = 0;      
private SafeFileHandle _DriverHandle;

/// <summary>
/// 扇区数
/// </summary>
public long SectorLength { get { return _SectorLength; } }


/// <summary>
/// 获取磁盘扇区信息
/// </summary>
/// <param name="DriverName">G:</param>
public SDUtils(string DriverName)
{
if (DriverName == null && DriverName.Trim().Length == 0) return;
_DriverHandle = CreateFileA("\\\\.\\" + DriverName.Trim(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

_DriverStream = new System.IO.FileStream(_DriverHandle, System.IO.FileAccess.ReadWrite);

GetSectorCount();
}


/// <summary>
/// 扇区显示转换
/// </summary>
/// <param name="SectorBytes">扇区长度512</param>
/// <returns>EB 52 90 ......55 AA</returns>
public string Byte2String(byte[] SectorBytes)
{
if (SectorBytes==null || SectorBytes.Length != 512) return "Content is empty";
StringBuilder ReturnText = new StringBuilder();

int RowCount = 0;
for (int i = 0; i != 512; i++)
{
ReturnText.Append(SectorBytes[i].ToString("X02") + " ");

if (RowCount == 15)
{
ReturnText.Append("\r\n");
RowCount = -1;
}

RowCount++;
}

return ReturnText.ToString();

}              
/// <summary>
/// 获取扇区数
/// </summary>
private void GetSectorCount()
{
if (_DriverStream == null) return;
_DriverStream.Position = 0;

byte[] ReturnByte = new byte[512];
_DriverStream.Read(ReturnByte, 0, 512); //获取第1扇区

if (ReturnByte[0] == 0xEB && ReturnByte[1] == 0x58)           //DOS的好象都是32位
{
_SectorLength = (long)BitConverter.ToInt32(new byte[] { ReturnByte[32], ReturnByte[33], ReturnByte[34], ReturnByte[35] }, 0);
}
if (ReturnByte[0] == 0xEB && ReturnByte[1] == 0x52)          //NTFS好象是64位
{
_SectorLength = BitConverter.ToInt64(new byte[] { ReturnByte[40], ReturnByte[41], ReturnByte[42], ReturnByte[43], ReturnByte[44], ReturnByte[45], ReturnByte[46], ReturnByte[47] }, 0);
}

}      


/// <summary>
/// 读一个扇区
/// </summary>
/// <param name="SectorIndex">扇区号</param>
/// <returns>如果扇区数字大于分区信息的扇区数返回NULL</returns>
public byte[] ReadSector(long SectorIndex)
{          
//if (SectorIndex > _SectorLength) 
//   return null;
_DriverStream.Position = SectorIndex * 512;          
byte[] ReturnByte = new byte[512];
_DriverStream.Read(ReturnByte, 0, 512); //获取扇区
return ReturnByte;
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="SectorBytes">扇区长度512</param>
/// <param name="SectorIndex">扇区位置</param>
public void WriteSector(byte[] SectorBytes, long SectorIndex)
{
if (SectorBytes.Length != 512) return;
if (SectorIndex > _SectorLength) return;
_DriverStream.Position = SectorIndex * 512;
_DriverStream.Write(SectorBytes, 0, 512); //写入扇区 
}


/// <summary>
/// 关闭
/// </summary>
public void Close()
{
_DriverStream.Close();
}    
}
}